version:3.1.0
fix: update:增加远程获取log
This commit is contained in:
@@ -73,8 +73,8 @@ android {
|
|||||||
|
|
||||||
official {
|
official {
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
versionCode 49
|
versionCode 50
|
||||||
versionName "3.0.9"
|
versionName "3.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<uses-permission android:name="android.permission.GET_TASKS" />
|
<uses-permission android:name="android.permission.GET_TASKS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="com.fuying.sn.base.BaseApplication"
|
android:name=".base.BaseApplication"
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
tools:replace="android:allowBackup">
|
tools:replace="android:allowBackup">
|
||||||
<activity
|
<activity
|
||||||
android:name="com.fuying.sn.activity.main.MainActivity"
|
android:name=".activity.main.MainActivity"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="portrait">
|
android:screenOrientation="portrait">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -115,28 +115,33 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="com.fuying.sn.activity.SplashActivity"
|
android:name=".activity.SplashActivity"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="com.fuying.sn.service.ControlPanelService"
|
android:name=".service.ControlPanelService"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="com.fuying.sn.service.RemoteService"
|
android:name=".service.RemoteService"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="com.fuying.sn.service.main.MainService"
|
android:name=".service.main.MainService"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
<service android:name="com.fuying.sn.service.GuardService" />
|
|
||||||
<service android:name="com.fuying.sn.service.DownloadService" />
|
|
||||||
<service
|
<service
|
||||||
android:name="com.fuying.sn.service.StepService"
|
android:name=".service.LogcatService"
|
||||||
|
android:enabled="true"
|
||||||
|
android:exported="true" />
|
||||||
|
|
||||||
|
<service android:name=".service.GuardService" />
|
||||||
|
<service android:name=".service.DownloadService" />
|
||||||
|
<service
|
||||||
|
android:name=".service.StepService"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter android:priority="1000">
|
<intent-filter android:priority="1000">
|
||||||
<action android:name="android.intent.action.SCREEN_OFF" />
|
<action android:name="android.intent.action.SCREEN_OFF" />
|
||||||
@@ -150,7 +155,7 @@
|
|||||||
<data android:scheme="package" />
|
<data android:scheme="package" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</service>
|
</service>
|
||||||
<service android:name="com.fuying.sn.service.ManagerService">
|
<service android:name=".service.ManagerService">
|
||||||
<intent-filter android:priority="1000">
|
<intent-filter android:priority="1000">
|
||||||
<action android:name="android.intent.action.USER_PRESENT" />
|
<action android:name="android.intent.action.USER_PRESENT" />
|
||||||
<action android:name="android.intent.action.SCREEN_ON" />
|
<action android:name="android.intent.action.SCREEN_ON" />
|
||||||
@@ -163,7 +168,7 @@
|
|||||||
</service>
|
</service>
|
||||||
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name="com.fuying.sn.receiver.BootReceiver"
|
android:name=".receiver.BootReceiver"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter android:priority="1000">
|
<intent-filter android:priority="1000">
|
||||||
@@ -182,7 +187,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<receiver
|
<receiver
|
||||||
android:name="com.fuying.sn.receiver.APKinstallReceiver"
|
android:name=".receiver.APKinstallReceiver"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:permission="com.example.broadcast.permission">
|
android:permission="com.example.broadcast.permission">
|
||||||
@@ -195,7 +200,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<receiver
|
<receiver
|
||||||
android:name="com.fuying.sn.receiver.InstallResultReceiver"
|
android:name=".receiver.InstallResultReceiver"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
|
|
||||||
@@ -222,7 +227,7 @@
|
|||||||
|
|
||||||
<!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 -->
|
<!-- 【可选】APP实现的Receiver,用于接收消息透传和操作结果的回调,请根据需要添加 -->
|
||||||
<!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: -->
|
<!-- YOUR_PACKAGE_PATH.CustomPushReceiver需要改为自己的Receiver: -->
|
||||||
<receiver android:name="com.fuying.sn.tpush.MessageReceiver">
|
<receiver android:name=".tpush.MessageReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|
||||||
<!-- 接收消息透传 -->
|
<!-- 接收消息透传 -->
|
||||||
|
|||||||
69
app/src/main/java/com/fuying/sn/bean/SnRunLog.java
Normal file
69
app/src/main/java/com/fuying/sn/bean/SnRunLog.java
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package com.fuying.sn.bean;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class SnRunLog implements Serializable {
|
||||||
|
private static final long serialVersionUID = 7780957878619252035L;
|
||||||
|
|
||||||
|
int id;
|
||||||
|
//开始时间
|
||||||
|
long start_time;
|
||||||
|
//持续时间
|
||||||
|
long duration;
|
||||||
|
//文件大小
|
||||||
|
int file_max_size;
|
||||||
|
//上传成功之后是否删除文件
|
||||||
|
int is_clear;
|
||||||
|
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getStart_time() {
|
||||||
|
return start_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStart_time(long start_time) {
|
||||||
|
this.start_time = start_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDuration() {
|
||||||
|
return duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDuration(long duration) {
|
||||||
|
this.duration = duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFile_max_size() {
|
||||||
|
return file_max_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFile_max_size(int file_max_size) {
|
||||||
|
this.file_max_size = file_max_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIs_clear() {
|
||||||
|
return is_clear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIs_clear(int is_clear) {
|
||||||
|
this.is_clear = is_clear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -583,17 +583,6 @@ public class RunningAppManager {
|
|||||||
boolean havaConfigure = TimeControlManager.getInstance().havaConfigure(pkg);
|
boolean havaConfigure = TimeControlManager.getInstance().havaConfigure(pkg);
|
||||||
MachineControl machineControl = TimeControlManager.getInstance().getGlobalMachineControl();
|
MachineControl machineControl = TimeControlManager.getInstance().getGlobalMachineControl();
|
||||||
|
|
||||||
Log.e(TAG, "inControlTime: globalRemainingTime = " + globalRemainingTime);
|
|
||||||
if (globalRemainingTime <= 0) {
|
|
||||||
if (machineControl != null) {
|
|
||||||
if (machineControl.getIs_part() == 0 && machineControl.getIs_quota() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ToastUtil.show("今日可使用时间已用完");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (havaConfigure) {
|
if (havaConfigure) {
|
||||||
AppTimeControl appTimeControl = TimeControlManager.getInstance().getAppTimeControl(pkg);
|
AppTimeControl appTimeControl = TimeControlManager.getInstance().getAppTimeControl(pkg);
|
||||||
//全局配置的
|
//全局配置的
|
||||||
@@ -615,6 +604,19 @@ public class RunningAppManager {
|
|||||||
} else {
|
} else {
|
||||||
mGlobalUsageTime.remove(pkg);
|
mGlobalUsageTime.remove(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.e(TAG, "inControlTime: globalRemainingTime = " + globalRemainingTime);
|
||||||
|
if (globalRemainingTime <= 0) {
|
||||||
|
if (machineControl != null) {
|
||||||
|
if (machineControl.getIs_part() == 0 && machineControl.getIs_quota() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ToastUtil.show("今日可使用时间已用完");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//单个app的
|
//单个app的
|
||||||
AppUsageTime singleAppUsageTime;
|
AppUsageTime singleAppUsageTime;
|
||||||
if (mAllAppUsageTime.get(pkg) == null) {
|
if (mAllAppUsageTime.get(pkg) == null) {
|
||||||
@@ -646,6 +648,17 @@ public class RunningAppManager {
|
|||||||
if (machineControl == null) {
|
if (machineControl == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Log.e(TAG, "inControlTime: globalRemainingTime = " + globalRemainingTime);
|
||||||
|
if (globalRemainingTime <= 0) {
|
||||||
|
if (machineControl != null) {
|
||||||
|
if (machineControl.getIs_part() == 0 && machineControl.getIs_quota() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ToastUtil.show("今日可使用时间已用完");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Log.i(TAG, "reduceAppRemainingTime: " + machineControl.getToday_time());
|
Log.i(TAG, "reduceAppRemainingTime: " + machineControl.getToday_time());
|
||||||
long remainingTime = machineControl.getToday_time() - time;
|
long remainingTime = machineControl.getToday_time() - time;
|
||||||
if (remainingTime < 0) {
|
if (remainingTime < 0) {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.fuying.sn.network;
|
package com.fuying.sn.network;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.AlarmManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -31,6 +33,7 @@ import com.fuying.sn.bean.OverallAppBean;
|
|||||||
import com.fuying.sn.bean.ScreenPassword;
|
import com.fuying.sn.bean.ScreenPassword;
|
||||||
import com.fuying.sn.bean.SnBindState;
|
import com.fuying.sn.bean.SnBindState;
|
||||||
import com.fuying.sn.bean.SnInfo;
|
import com.fuying.sn.bean.SnInfo;
|
||||||
|
import com.fuying.sn.bean.SnRunLog;
|
||||||
import com.fuying.sn.bean.SystemSettingsSet;
|
import com.fuying.sn.bean.SystemSettingsSet;
|
||||||
import com.fuying.sn.bean.UserAvatarInfo;
|
import com.fuying.sn.bean.UserAvatarInfo;
|
||||||
import com.fuying.sn.bean.browser.BrowserApiData;
|
import com.fuying.sn.bean.browser.BrowserApiData;
|
||||||
@@ -61,6 +64,8 @@ import com.fuying.sn.network.api.GetControlScreenshotApi;
|
|||||||
import com.fuying.sn.network.api.GetGuideApi;
|
import com.fuying.sn.network.api.GetGuideApi;
|
||||||
import com.fuying.sn.network.api.GetLockScreenPwdApi;
|
import com.fuying.sn.network.api.GetLockScreenPwdApi;
|
||||||
import com.fuying.sn.network.api.GetPublicIPApi;
|
import com.fuying.sn.network.api.GetPublicIPApi;
|
||||||
|
import com.fuying.sn.network.api.GetSnRunLogApi;
|
||||||
|
import com.fuying.sn.network.api.GetUploadLogApi;
|
||||||
import com.fuying.sn.network.api.MachineTimeControlApi;
|
import com.fuying.sn.network.api.MachineTimeControlApi;
|
||||||
import com.fuying.sn.network.api.MyAppListApi;
|
import com.fuying.sn.network.api.MyAppListApi;
|
||||||
import com.fuying.sn.network.api.NewestAppUpdate;
|
import com.fuying.sn.network.api.NewestAppUpdate;
|
||||||
@@ -81,6 +86,7 @@ import com.fuying.sn.network.api.UpdateLockScreen;
|
|||||||
import com.fuying.sn.network.api.UploadScreenshot;
|
import com.fuying.sn.network.api.UploadScreenshot;
|
||||||
import com.fuying.sn.network.api.UserInfoControl;
|
import com.fuying.sn.network.api.UserInfoControl;
|
||||||
import com.fuying.sn.network.interceptor.RepeatRequestInterceptor;
|
import com.fuying.sn.network.interceptor.RepeatRequestInterceptor;
|
||||||
|
import com.fuying.sn.service.LogcatService;
|
||||||
import com.fuying.sn.utils.ApkUtils;
|
import com.fuying.sn.utils.ApkUtils;
|
||||||
import com.fuying.sn.utils.AppUsedTimeUtils;
|
import com.fuying.sn.utils.AppUsedTimeUtils;
|
||||||
import com.fuying.sn.utils.CmdUtil;
|
import com.fuying.sn.utils.CmdUtil;
|
||||||
@@ -222,6 +228,10 @@ public class NetInterfaceManager {
|
|||||||
return okHttpClient;
|
return okHttpClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GetUploadLogApi getUploadLogApi() {
|
||||||
|
return mRetrofit.create(GetUploadLogApi.class);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Observable
|
* Observable
|
||||||
@@ -464,6 +474,13 @@ public class NetInterfaceManager {
|
|||||||
.observeOn(AndroidSchedulers.mainThread());
|
.observeOn(AndroidSchedulers.mainThread());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Observable<BaseResponse<SnRunLog>> getSnRunLogControl() {
|
||||||
|
return mRetrofit.create(GetSnRunLogApi.class)
|
||||||
|
.getSnRunLog(Utils.getSerial())
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* execution
|
* execution
|
||||||
@@ -3015,4 +3032,61 @@ public class NetInterfaceManager {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static final int REQUEST_CODE = 12345;
|
||||||
|
|
||||||
|
public void getRunLog() {
|
||||||
|
getSnRunLogControl()
|
||||||
|
.subscribe(new Observer<BaseResponse<SnRunLog>>() {
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(Disposable d) {
|
||||||
|
Log.e("getRunLog", "onSubscribe: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNext(BaseResponse<SnRunLog> snRunLogBaseResponse) {
|
||||||
|
Log.e("getRunLog", "onNext: " + snRunLogBaseResponse);
|
||||||
|
if (snRunLogBaseResponse.code == 200) {
|
||||||
|
SnRunLog snRunLog = snRunLogBaseResponse.data;
|
||||||
|
LogcatService.setStart_Time(snRunLog.getStart_time());
|
||||||
|
LogcatService.setDuration(snRunLog.getDuration());
|
||||||
|
LogcatService.setFileMaxSize(snRunLog.getFile_max_size());
|
||||||
|
LogcatService.setClearFile(snRunLog.getIs_clear());
|
||||||
|
long timestamp = snRunLog.getStart_time() * 1000;
|
||||||
|
long nowTime = System.currentTimeMillis();
|
||||||
|
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
|
||||||
|
if (nowTime > timestamp) {
|
||||||
|
Intent intent = new Intent(LogcatService.LOGCAT_START_ACTION);
|
||||||
|
mContext.sendBroadcast(intent);
|
||||||
|
} else {
|
||||||
|
Intent intent = new Intent(LogcatService.LOGCAT_START_ACTION);
|
||||||
|
PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext,
|
||||||
|
REQUEST_CODE, intent,
|
||||||
|
PendingIntent.FLAG_CANCEL_CURRENT);
|
||||||
|
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
|
||||||
|
timestamp, startPendingIntent);
|
||||||
|
}
|
||||||
|
Intent intent = new Intent(LogcatService.LOGCAT_STOP_ACTION);
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
|
||||||
|
REQUEST_CODE, intent,
|
||||||
|
PendingIntent.FLAG_CANCEL_CURRENT);
|
||||||
|
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
|
||||||
|
timestamp + snRunLog.getDuration() * 1000, pendingIntent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
Log.e("getRunLog", "onError: " + e.getMessage());
|
||||||
|
onComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onComplete() {
|
||||||
|
Log.e("getRunLog", "onComplete: ");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,16 @@ public class UrlAddress {
|
|||||||
/*解除锁屏*/
|
/*解除锁屏*/
|
||||||
public static final String UPDATE_LOCK_SCREEN = "sn/updateLockScreen";
|
public static final String UPDATE_LOCK_SCREEN = "sn/updateLockScreen";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* log相关
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*获取log任务*/
|
||||||
|
public static final String GET_LOG_ORDER = "sn/getSnRunLog";
|
||||||
|
/*上传log文件*/
|
||||||
|
public static final String UPLOAD_LOG_FILE = "sn/uploadLogFile";
|
||||||
|
/*上传运行日志设置文件*/
|
||||||
|
public static final String UPLOAD_IS_LOG_FILE = "sn/uploadIsLogFile";
|
||||||
|
|
||||||
|
|
||||||
/*获取公网IP*/
|
/*获取公网IP*/
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.fuying.sn.network.api;
|
||||||
|
|
||||||
|
import com.fuying.sn.bean.BaseResponse;
|
||||||
|
import com.fuying.sn.bean.SnRunLog;
|
||||||
|
import com.fuying.sn.network.UrlAddress;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.core.Observable;
|
||||||
|
import retrofit2.http.GET;
|
||||||
|
import retrofit2.http.Query;
|
||||||
|
|
||||||
|
public interface GetSnRunLogApi {
|
||||||
|
@GET(UrlAddress.GET_LOG_ORDER)
|
||||||
|
Observable<BaseResponse<SnRunLog>> getSnRunLog(
|
||||||
|
@Query("sn") String sn
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.fuying.sn.network.api;
|
||||||
|
|
||||||
|
import com.fuying.sn.bean.BaseResponse;
|
||||||
|
import com.fuying.sn.network.UrlAddress;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.core.Observable;
|
||||||
|
import okhttp3.MultipartBody;
|
||||||
|
import retrofit2.http.Multipart;
|
||||||
|
import retrofit2.http.POST;
|
||||||
|
import retrofit2.http.Part;
|
||||||
|
import retrofit2.http.QueryMap;
|
||||||
|
|
||||||
|
public interface GetUploadLogApi {
|
||||||
|
@Multipart
|
||||||
|
@POST(UrlAddress.UPLOAD_LOG_FILE)
|
||||||
|
Observable<BaseResponse> UploadLog(
|
||||||
|
@QueryMap Map<String, String> params,
|
||||||
|
@Part MultipartBody.Part body
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ public class GuardService extends Service {
|
|||||||
@Override
|
@Override
|
||||||
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
||||||
Log.e(TAG, "GuardService:建立链接");
|
Log.e(TAG, "GuardService:建立链接");
|
||||||
boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(GuardService.this, getClass().getName());
|
boolean isServiceRunning = ServiceAliveUtils.isServiceAlive(GuardService.this, getClass().getName());
|
||||||
if (!isServiceRunning) {
|
if (!isServiceRunning) {
|
||||||
Intent i = new Intent(GuardService.this, DownloadService.class);
|
Intent i = new Intent(GuardService.this, DownloadService.class);
|
||||||
startService(i);
|
startService(i);
|
||||||
|
|||||||
339
app/src/main/java/com/fuying/sn/service/LogcatService.java
Normal file
339
app/src/main/java/com/fuying/sn/service/LogcatService.java
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
package com.fuying.sn.service;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.fuying.sn.bean.BaseResponse;
|
||||||
|
import com.fuying.sn.network.NetInterfaceManager;
|
||||||
|
import com.fuying.sn.utils.Utils;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
|
import io.reactivex.rxjava3.core.Observer;
|
||||||
|
import io.reactivex.rxjava3.disposables.Disposable;
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
import okhttp3.MediaType;
|
||||||
|
import okhttp3.MultipartBody;
|
||||||
|
import okhttp3.RequestBody;
|
||||||
|
|
||||||
|
public class LogcatService extends Service {
|
||||||
|
public final static String LOGCAT_START_ACTION = "START";
|
||||||
|
public final static String LOGCAT_STOP_ACTION = "STOP";
|
||||||
|
private String TAG = LogcatService.class.getSimpleName();
|
||||||
|
|
||||||
|
|
||||||
|
public LogcatService() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
// TODO: Return the communication channel to the service.
|
||||||
|
// throw new UnsupportedOperationException("Not yet implemented");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
logFilePath = getExternalCacheDir() + File.separator + "LOG" + File.separator;
|
||||||
|
File file = new File(logFilePath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdirs();
|
||||||
|
}
|
||||||
|
// try {
|
||||||
|
// exec = Runtime.getRuntime().exec(running);
|
||||||
|
// final InputStream is = exec.getInputStream();
|
||||||
|
// logThread = new LogThread(is);
|
||||||
|
// logThread.start();
|
||||||
|
// // is.close();
|
||||||
|
//// exec.destroy();
|
||||||
|
// } catch (IOException e) {
|
||||||
|
//// e.printStackTrace();
|
||||||
|
// Log.e("第一个是Logcat", e.getMessage());
|
||||||
|
// }
|
||||||
|
registerLogcatReceiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long start_Time;
|
||||||
|
private static long condition_duration;
|
||||||
|
private static long condition_file_max_size;
|
||||||
|
private static boolean clear_file;
|
||||||
|
|
||||||
|
public static void setStart_Time(long start_Time) {
|
||||||
|
LogcatService.start_Time = start_Time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setDuration(long duration) {
|
||||||
|
condition_duration = duration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setFileMaxSize(long fileMaxSize) {
|
||||||
|
condition_file_max_size = fileMaxSize * 1024 * 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setClearFile(int clearfile) {
|
||||||
|
clear_file = clearfile == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogcatReceiver receiver;
|
||||||
|
|
||||||
|
private void registerLogcatReceiver() {
|
||||||
|
receiver = new LogcatReceiver();
|
||||||
|
IntentFilter filter = new IntentFilter();
|
||||||
|
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
|
||||||
|
filter.addAction(LOGCAT_START_ACTION);
|
||||||
|
filter.addAction(LOGCAT_STOP_ACTION);
|
||||||
|
registerReceiver(receiver, filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread thread = null;
|
||||||
|
|
||||||
|
private void creatLogThread() {
|
||||||
|
if (thread == null) {
|
||||||
|
thread = new Thread(LogcatRunnale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startLogThread() {
|
||||||
|
if (thread == null) {
|
||||||
|
creatLogThread();
|
||||||
|
shouldGetLog = true;
|
||||||
|
thread.start();
|
||||||
|
} else {
|
||||||
|
//已经有线程正在运行了
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopLogThread() {
|
||||||
|
if (thread != null) {
|
||||||
|
shouldGetLog = false;
|
||||||
|
thread = null;
|
||||||
|
//清除adb 缓存
|
||||||
|
try {
|
||||||
|
Runtime.getRuntime().exec(clearLogcat);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uploadFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Process exec;
|
||||||
|
private LogThread logThread;
|
||||||
|
|
||||||
|
//第一个是Logcat ,也就是我们想要获取的log日志
|
||||||
|
//第二个是 -s 也就是表示过滤的意思
|
||||||
|
//第三个就是 我们要过滤的类型 W表示warm ,我们也可以换成 D :debug, I:info,E:error等等
|
||||||
|
// String[] running = new String[]{"logcat", "-s", "adb logcat *: W"};
|
||||||
|
String[] running = new String[]{"logcat"};
|
||||||
|
String clearLogcat = "logcat -c";
|
||||||
|
String logFilePath;
|
||||||
|
//= getExternalCacheDir() + File.separator + "LOG" + File.separator;
|
||||||
|
String logFileName;
|
||||||
|
String tempFilePath;
|
||||||
|
|
||||||
|
class LogThread extends Thread {
|
||||||
|
InputStream is;
|
||||||
|
|
||||||
|
LogThread(InputStream inputStream) {
|
||||||
|
super();
|
||||||
|
this.is = inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
FileOutputStream os = null;
|
||||||
|
try {
|
||||||
|
//新建一个路径信息
|
||||||
|
File file = new File(logFilePath + logFileName);
|
||||||
|
Log.e(TAG, "run: " + logFilePath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.getParentFile().mkdirs();
|
||||||
|
file.createNewFile();
|
||||||
|
}
|
||||||
|
os = new FileOutputStream(logFilePath);
|
||||||
|
int len = 0;
|
||||||
|
byte[] buf = new byte[1024];
|
||||||
|
while (-1 != (len = is.read(buf))) {
|
||||||
|
os.write(buf, 0, len);
|
||||||
|
os.flush();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e("writelog", "read logcat process failed. message: "
|
||||||
|
+ e.getMessage());
|
||||||
|
} finally {
|
||||||
|
if (null != os) {
|
||||||
|
try {
|
||||||
|
os.close();
|
||||||
|
os = null;
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Runnable LogcatRunnale = this::getLog;
|
||||||
|
|
||||||
|
public static boolean shouldGetLog = true;
|
||||||
|
|
||||||
|
private void getLog() {
|
||||||
|
Process process = null;
|
||||||
|
try {
|
||||||
|
process = Runtime.getRuntime().exec(running);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
InputStreamReader inputStreamReader;
|
||||||
|
BufferedReader bufferedReader;
|
||||||
|
FileOutputStream fileOutputStream;
|
||||||
|
File file = new File(logFilePath);
|
||||||
|
Log.e(TAG, "getLog: " + logFilePath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clear_file) {
|
||||||
|
logFileName = Utils.getSerial() + ".log";
|
||||||
|
} else {
|
||||||
|
logFileName = Utils.getSerial() + "-" + getTime() + ".log";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
inputStreamReader = new InputStreamReader(process.getInputStream());
|
||||||
|
bufferedReader = new BufferedReader(inputStreamReader);
|
||||||
|
tempFilePath = logFilePath + logFileName;
|
||||||
|
fileOutputStream = new FileOutputStream(tempFilePath);
|
||||||
|
Log.e(TAG, "getLog: " + tempFilePath);
|
||||||
|
long fileSize = file.length();
|
||||||
|
String logEntry;
|
||||||
|
while (shouldGetLog) {
|
||||||
|
logEntry = bufferedReader.readLine() + "\n";
|
||||||
|
fileOutputStream.write(logEntry.getBytes());
|
||||||
|
fileOutputStream.flush();
|
||||||
|
fileSize += logEntry.length();
|
||||||
|
// Log.e(TAG, "getLog: " + fileSize);
|
||||||
|
if (fileSize >= condition_file_max_size ||
|
||||||
|
(start_Time + condition_duration) * 1000 < System.currentTimeMillis()) {
|
||||||
|
shouldGetLog = false;
|
||||||
|
stopLogThread();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputStreamReader.close();
|
||||||
|
bufferedReader.close();
|
||||||
|
fileOutputStream.close();
|
||||||
|
Log.e(TAG, "getLog: " + "closed");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void uploadFile() {
|
||||||
|
File file = new File(tempFilePath);
|
||||||
|
if (!file.exists() || file.isDirectory()) {
|
||||||
|
Log.e("uploadFile", "File does not exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, String> params = new HashMap<>();
|
||||||
|
params.put("sn", Utils.getSerial());
|
||||||
|
MediaType mediaType = MediaType.Companion.parse("text/html");
|
||||||
|
RequestBody fileBody = RequestBody.Companion.create(file, mediaType);
|
||||||
|
//设置一个file文件
|
||||||
|
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), fileBody);
|
||||||
|
|
||||||
|
NetInterfaceManager.getInstance().getUploadLogApi()
|
||||||
|
.UploadLog(params, body)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(new Observer<BaseResponse>() {
|
||||||
|
@Override
|
||||||
|
public void onSubscribe(Disposable d) {
|
||||||
|
Log.e("uploadFile", "onSubscribe: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNext(BaseResponse snRunLogBaseResponse) {
|
||||||
|
Log.e("uploadFile", "onNext: " + snRunLogBaseResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable e) {
|
||||||
|
Log.e("uploadFile", "onError: " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onComplete() {
|
||||||
|
Log.e("uploadFile", "onComplete: ");
|
||||||
|
if (clear_file) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class LogcatReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
Log.e(TAG, "onReceive: " + action);
|
||||||
|
if (TextUtils.isEmpty(action)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (action) {
|
||||||
|
case LOGCAT_START_ACTION:
|
||||||
|
Log.e(TAG, "onReceive: "+"开始录制log");
|
||||||
|
startLogThread();
|
||||||
|
break;
|
||||||
|
case LOGCAT_STOP_ACTION:
|
||||||
|
Log.e(TAG, "onReceive: "+"停止录制log");
|
||||||
|
stopLogThread();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTime() {
|
||||||
|
long time = System.currentTimeMillis();//long now = android.os.SystemClock.uptimeMillis();
|
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||||
|
Date d1 = new Date(time);
|
||||||
|
String t1 = format.format(d1);
|
||||||
|
return t1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (receiver != null) {
|
||||||
|
unregisterReceiver(receiver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -70,7 +70,7 @@ public class StepService extends Service implements NetworkUtils.OnNetworkStatus
|
|||||||
@Override
|
@Override
|
||||||
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
||||||
Log.w(TAG, "StepService:建立链接");
|
Log.w(TAG, "StepService:建立链接");
|
||||||
boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(StepService.this, GuardService.class.getName());
|
boolean isServiceRunning = ServiceAliveUtils.isServiceAlive(StepService.this, GuardService.class.getName());
|
||||||
if (!isServiceRunning) {
|
if (!isServiceRunning) {
|
||||||
Intent i = new Intent(StepService.this, GuardService.class);
|
Intent i = new Intent(StepService.this, GuardService.class);
|
||||||
startService(i);
|
startService(i);
|
||||||
|
|||||||
@@ -370,7 +370,7 @@ public class MainSPresenter implements MainSContact.Presenter {
|
|||||||
if (code == 200) {
|
if (code == 200) {
|
||||||
JsonObject jsonObject = GsonUtils.getJsonObject(GsonUtils.toJSONString(baseResponse.data));
|
JsonObject jsonObject = GsonUtils.getJsonObject(GsonUtils.toJSONString(baseResponse.data));
|
||||||
int is_screen_lock = jsonObject.get("is_screen_lock").getAsInt();
|
int is_screen_lock = jsonObject.get("is_screen_lock").getAsInt();
|
||||||
if (!ServiceAliveUtils.isServiceAlice(mContext, ManagerService.class.getName())) {
|
if (!ServiceAliveUtils.isServiceAlive(mContext, ManagerService.class.getName())) {
|
||||||
mContext.startService(new Intent(mContext, ManagerService.class));
|
mContext.startService(new Intent(mContext, ManagerService.class));
|
||||||
}
|
}
|
||||||
SPUtils.put(mContext, ManagerService.LOCK_STATE, is_screen_lock);
|
SPUtils.put(mContext, ManagerService.LOCK_STATE, is_screen_lock);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import com.fuying.sn.manager.ControlManager;
|
|||||||
import com.fuying.sn.manager.DeviceManager;
|
import com.fuying.sn.manager.DeviceManager;
|
||||||
import com.fuying.sn.network.NetInterfaceManager;
|
import com.fuying.sn.network.NetInterfaceManager;
|
||||||
import com.fuying.sn.receiver.BootReceiver;
|
import com.fuying.sn.receiver.BootReceiver;
|
||||||
|
import com.fuying.sn.service.LogcatService;
|
||||||
import com.fuying.sn.service.ManagerService;
|
import com.fuying.sn.service.ManagerService;
|
||||||
import com.fuying.sn.tpush.common.NotificationService;
|
import com.fuying.sn.tpush.common.NotificationService;
|
||||||
import com.fuying.sn.tpush.po.XGNotification;
|
import com.fuying.sn.tpush.po.XGNotification;
|
||||||
@@ -481,6 +482,8 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
|||||||
private static final String ACTION_APP_CONTROL = "81";
|
private static final String ACTION_APP_CONTROL = "81";
|
||||||
/*更新白名单*/
|
/*更新白名单*/
|
||||||
private static final String UPDATE_WHITE_LIST = "83";
|
private static final String UPDATE_WHITE_LIST = "83";
|
||||||
|
/*远程log*/
|
||||||
|
private static final String SN_RUN_LOG = "84";
|
||||||
/*一键断网*/
|
/*一键断网*/
|
||||||
private static final String ACTION_DISABLE_NETWORK = "85";
|
private static final String ACTION_DISABLE_NETWORK = "85";
|
||||||
|
|
||||||
@@ -794,6 +797,9 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
|||||||
case UPDATE_WHITE_LIST:
|
case UPDATE_WHITE_LIST:
|
||||||
NetInterfaceManager.getInstance().getAllappPackage();
|
NetInterfaceManager.getInstance().getAllappPackage();
|
||||||
break;
|
break;
|
||||||
|
case SN_RUN_LOG:
|
||||||
|
recordLog(extras);
|
||||||
|
break;
|
||||||
case ACTION_DISABLE_NETWORK:
|
case ACTION_DISABLE_NETWORK:
|
||||||
ToastUtil.debugShow("收到推送消息: 一键断网");
|
ToastUtil.debugShow("收到推送消息: 一键断网");
|
||||||
oneKeyNetwork(context, extras);
|
oneKeyNetwork(context, extras);
|
||||||
@@ -1246,7 +1252,7 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
|||||||
JsonObject jSONObject = GsonUtils.getJsonObject(jsonString);
|
JsonObject jSONObject = GsonUtils.getJsonObject(jsonString);
|
||||||
type = jSONObject.get("type").getAsInt();
|
type = jSONObject.get("type").getAsInt();
|
||||||
|
|
||||||
if (!ServiceAliveUtils.isServiceAlice(context, ManagerService.class.getName())) {
|
if (!ServiceAliveUtils.isServiceAlive(context, ManagerService.class.getName())) {
|
||||||
context.startService(new Intent(context, ManagerService.class));
|
context.startService(new Intent(context, ManagerService.class));
|
||||||
}
|
}
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
@@ -1572,5 +1578,10 @@ public class MessageReceiver extends XGPushBaseReceiver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void recordLog(String jsonString) {
|
||||||
|
if (!ServiceAliveUtils.isServiceAlive(mContext, LogcatService.class.getName())) {
|
||||||
|
mContext.startService(new Intent(mContext, LogcatService.class));
|
||||||
|
}
|
||||||
|
NetInterfaceManager.getInstance().getRunLog();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,19 +6,19 @@ import android.util.Log;
|
|||||||
|
|
||||||
|
|
||||||
public class ServiceAliveUtils {
|
public class ServiceAliveUtils {
|
||||||
public static boolean isServiceAlice(Context context,String className) {
|
public static boolean isServiceAlive(Context mContext, String serviceName) {
|
||||||
boolean isServiceRunning = false;
|
boolean isServiceRunning = false;
|
||||||
ActivityManager manager =
|
ActivityManager manager =
|
||||||
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
if (manager == null) {
|
if (manager == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
|
||||||
if (className.equals(service.service.getClassName())) {
|
if (serviceName.equals(service.service.getClassName())) {
|
||||||
isServiceRunning = true;
|
isServiceRunning = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.e("ServiceAliveUtils", "className isServiceAlice: " + isServiceRunning);
|
Log.i("ServiceAliveUtils", serviceName + " :isServiceAlive: " + isServiceRunning);
|
||||||
return isServiceRunning;
|
return isServiceRunning;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user