|
@@ -1,14 +1,40 @@
|
|
package com.risk.app.activity;
|
|
package com.risk.app.activity;
|
|
|
|
|
|
-import android.annotation.SuppressLint;
|
|
|
|
import android.os.Bundle;
|
|
import android.os.Bundle;
|
|
|
|
+import android.text.Html;
|
|
|
|
+import android.widget.ScrollView;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.blankj.utilcode.util.FileIOUtils;
|
|
|
|
+import com.blankj.utilcode.util.ThreadUtils;
|
|
|
|
+import com.blankj.utilcode.util.TimeUtils;
|
|
|
|
+import com.blankj.utilcode.util.Utils;
|
|
|
|
+import com.elvishew.xlog.XLog;
|
|
import com.risk.app.TgBot;
|
|
import com.risk.app.TgBot;
|
|
import com.risk.app.base.BaseActivity;
|
|
import com.risk.app.base.BaseActivity;
|
|
import com.risk.app.databinding.ActivityMainBinding;
|
|
import com.risk.app.databinding.ActivityMainBinding;
|
|
|
|
+import com.risk.app.utils.SystemLogcatCapture;
|
|
|
|
|
|
-public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
|
|
|
|
|
+import java.io.BufferedReader;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.InputStreamReader;
|
|
|
|
+import java.util.HashSet;
|
|
|
|
+import java.util.LinkedHashSet;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
+
|
|
|
|
+import io.reactivex.Observable;
|
|
|
|
+import io.reactivex.ObservableOnSubscribe;
|
|
|
|
+import io.reactivex.Observer;
|
|
|
|
+import io.reactivex.android.schedulers.AndroidSchedulers;
|
|
|
|
+import io.reactivex.disposables.Disposable;
|
|
|
|
+import io.reactivex.schedulers.Schedulers;
|
|
|
|
+import okhttp3.OkHttpClient;
|
|
|
|
+import okhttp3.Request;
|
|
|
|
+import okhttp3.Response;
|
|
|
|
|
|
|
|
+public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
|
|
|
+ SystemLogcatCapture logcatCapture = new SystemLogcatCapture();
|
|
|
|
+ private static boolean TAG = true;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
protected ActivityMainBinding getViewBinding() {
|
|
protected ActivityMainBinding getViewBinding() {
|
|
@@ -17,21 +43,192 @@ public class MainActivity extends BaseActivity<ActivityMainBinding> {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void initData(Bundle bundle) {
|
|
public void initData(Bundle bundle) {
|
|
|
|
+ if (logcatCapture == null) {
|
|
|
|
+ logcatCapture = new SystemLogcatCapture();
|
|
|
|
+ }
|
|
|
|
+ logcatCapture.stopCapture();
|
|
|
|
+ logcatCapture.startCapture(Utils.getApp(), "myAppLog");
|
|
|
|
+ logSimI("Start App....");
|
|
|
|
+ readLog();
|
|
|
|
+ checkForUpdate();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void readLog() {
|
|
|
|
+ HashSet<String> lst = new LinkedHashSet<>();
|
|
|
|
+ lst.add("logcat");
|
|
|
|
+ lst.add("-v");
|
|
|
|
+ lst.add("time"); // 带时间戳的日志格式
|
|
|
|
+ lst.add("--pid=" + android.os.Process.myPid()); // 仅当前App进程
|
|
|
|
+ Observable.create((ObservableOnSubscribe<String>) emitter -> {
|
|
|
|
+ Process process = Runtime.getRuntime().exec(lst.toArray(new String[0]));
|
|
|
|
+
|
|
|
|
+ InputStreamReader in = new InputStreamReader(process.getInputStream());
|
|
|
|
+ BufferedReader bufferedReader = new BufferedReader(in);
|
|
|
|
+
|
|
|
|
+ String line = null;
|
|
|
|
+ while ((line = bufferedReader.readLine()) != null) {
|
|
|
|
+ emitter.onNext(line);
|
|
|
|
+ }
|
|
|
|
+ in.close();
|
|
|
|
+ bufferedReader.close();
|
|
|
|
+ emitter.onComplete();
|
|
|
|
+ }).subscribeOn(Schedulers.io())
|
|
|
|
+ .observeOn(AndroidSchedulers.mainThread())
|
|
|
|
+ .subscribe(new Observer<>() {
|
|
|
|
+ @Override
|
|
|
|
+ public void onSubscribe(Disposable d) {
|
|
|
|
+ logSimI("Subscribe.");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onNext(String s) {
|
|
|
|
+ FileIOUtils.writeFileFromString(Utils.getApp().getFilesDir().getPath() + "/ulog/readLog.txt", "\r\n" + s, true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onError(Throwable e) {
|
|
|
|
+ logSimE(e == null ? "Error." : e.getMessage());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onComplete() {
|
|
|
|
+ logSimI("Complete.");
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void checkForUpdate() {
|
|
|
|
+ ThreadUtils.executeByIoAtFixRate(new ThreadUtils.Task<String>() {
|
|
|
|
+ @Override
|
|
|
|
+ public String doInBackground() {
|
|
|
|
+ OkHttpClient client = new OkHttpClient();
|
|
|
|
+ Request request = new Request.Builder().url("http://up.lkluckpanda.online/userdemo/hxconfig.json").build();
|
|
|
|
+ try (Response response = client.newCall(request).execute()) {
|
|
|
|
+ if (response.isSuccessful()) {
|
|
|
|
+ String fileContent = response.body().string();
|
|
|
|
+ JSONObject data = JSONObject.parseObject(fileContent);
|
|
|
|
+ TAG = data.getBooleanValue("log_tag");
|
|
|
|
+ }
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ XLog.e("Error", e);
|
|
|
|
+ TAG = true;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onSuccess(String result) {
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void onFail(Throwable t) {
|
|
|
|
+ TAG = true;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void onCancel() {
|
|
|
|
+ TAG = true;
|
|
|
|
+ }
|
|
|
|
+ }, 0, 30000, TimeUnit.MILLISECONDS);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void initView() {
|
|
public void initView() {
|
|
|
|
|
|
- bind.uploadLog.setOnClickListener(v -> TgBot.sendFileToGroup());
|
|
|
|
|
|
+ ThreadUtils.executeBySingleAtFixRate(new ThreadUtils.Task<String>() {
|
|
|
|
+ @Override
|
|
|
|
+ public String doInBackground() {
|
|
|
|
+ if (TAG) {
|
|
|
|
+ logSimI("Start uploading logs.");
|
|
|
|
+ ThreadUtils.runOnUiThreadDelayed(TgBot::sendLogToGroup, 3000);
|
|
|
|
+ } else {
|
|
|
|
+ logSimI("The log upload switch is turned off.");
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onSuccess(String result) {
|
|
|
|
+ if (TAG) {
|
|
|
|
+ logSimI("Log upload successful. Will continue uploading after 30 seconds.");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onFail(Throwable t) {
|
|
|
|
+ logSimE("IO Thread Error.");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onCancel() {
|
|
|
|
+ logSimE("IO Thread Cancel.");
|
|
|
|
+ }
|
|
|
|
+ }, 1000, 30000, TimeUnit.MILLISECONDS);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
protected void onDestroy() {
|
|
protected void onDestroy() {
|
|
super.onDestroy();
|
|
super.onDestroy();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 错误log
|
|
|
|
+ *
|
|
|
|
+ * @param s
|
|
|
|
+ */
|
|
|
|
+ private void logSimE(String s) {
|
|
|
|
+ ThreadUtils.runOnUiThread(() -> {
|
|
|
|
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#EB1E09'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
|
|
|
|
+ } else {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#EB1E09'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bind.logTv.append("\n");
|
|
|
|
+ bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
|
|
|
|
+ });
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Info log
|
|
|
|
+ *
|
|
|
|
+ * @param s
|
|
|
|
+ */
|
|
|
|
+ private void logSimI(String s) {
|
|
|
|
+ ThreadUtils.runOnUiThread(() -> {
|
|
|
|
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#14E015'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
|
|
|
|
+ } else {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#14E015'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
|
|
|
|
+ }
|
|
|
|
+ bind.logTv.append("\n");
|
|
|
|
+ bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Verbose log
|
|
|
|
+ *
|
|
|
|
+ * @param s
|
|
|
|
+ */
|
|
|
|
+ private void logSimV(String s) {
|
|
|
|
+ ThreadUtils.runOnUiThread(() -> {
|
|
|
|
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#1EF0F7'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>", Html.FROM_HTML_MODE_LEGACY));
|
|
|
|
+ } else {
|
|
|
|
+ bind.logTv.append(Html.fromHtml("<b><font color='#1EF0F7'>" + TimeUtils.getNowString() + " -> " + s + "</font></b>"));
|
|
|
|
+ }
|
|
|
|
+ bind.logTv.append("\n");
|
|
|
|
+ bind.scrollView.fullScroll(ScrollView.FOCUS_DOWN);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|