From a2ed727477d83d66df3245a10f2b25e14ad885d5 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 12 Sep 2018 16:43:11 +0800 Subject: [PATCH] feat: use bugly to report crash --- .gitignore | 1 + .idea/caches/build_file_checksums.ser | Bin 733 -> 733 bytes app/build.gradle | 6 +- app/proguard-rules.pro | 7 +- app/src/main/java/org/autojs/autojs/App.java | 13 +++- .../autojs/autojs/network/UserService.java | 4 ++ .../org/autojs/autojs/tool/CrashHandler.java | 66 ++++++++---------- .../autojs/ui/error/ErrorReportActivity.java | 38 ++-------- .../autojs/ui/settings/AboutActivity.java | 4 +- app/src/main/res/values/strings.xml | 2 +- common/release/output.json | 2 +- 11 files changed, 67 insertions(+), 76 deletions(-) diff --git a/.gitignore b/.gitignore index 424e5614..50688619 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /local.properties /.idea/workspace.xml /.idea/libraries +/.idea/caches .DS_Store /build /release diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index e0c1f728fde291a97167bb372ea15170f328e6ec..9bf0c4c3cd19defcb350040fa9c7cff5f5486cf0 100644 GIT binary patch delta 36 ucmV+<0NelF1>FUZm;}ttWFe89cMu8A@0^NU>kW|~KUJT#&swu10lEP>YYFUZm;}8kgWQpvcM!b26VDD7`gf`l3Stv2 instance; @@ -64,7 +67,15 @@ public class App extends MultiDexApplication { private void setUpDebugEnvironment() { - Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(ErrorReportActivity.class)); + CrashHandler crashHandler = new CrashHandler(ErrorReportActivity.class); + + CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext()); + strategy.setCrashHandleCallback(crashHandler); + + CrashReport.initCrashReport(getApplicationContext(), BUGLY_APP_ID, false, strategy); + + crashHandler.setDefaultHandler(Thread.getDefaultUncaughtExceptionHandler()); + Thread.setDefaultUncaughtExceptionHandler(crashHandler); } private void init() { diff --git a/app/src/main/java/org/autojs/autojs/network/UserService.java b/app/src/main/java/org/autojs/autojs/network/UserService.java index ac6a96c7..4886bd68 100644 --- a/app/src/main/java/org/autojs/autojs/network/UserService.java +++ b/app/src/main/java/org/autojs/autojs/network/UserService.java @@ -6,6 +6,7 @@ import org.autojs.autojs.network.entity.notification.Notification; import org.autojs.autojs.network.entity.notification.NotificationResponse; import org.autojs.autojs.network.entity.user.User; import com.stardust.util.Objects; +import com.tencent.bugly.crashreport.CrashReport; import org.greenrobot.eventbus.EventBus; @@ -77,6 +78,9 @@ public class UserService { private void setUser(User user) { User old = mUser; mUser = user; + if(mUser != null){ + CrashReport.setUserId(mUser.getUid()); + } if (!Objects.equals(old, mUser)) { if (user == null) { NodeBB.getInstance().invalidateXCsrfToken(); diff --git a/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java b/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java index fe707cc9..e6e3aaec 100644 --- a/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java +++ b/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java @@ -15,17 +15,23 @@ import android.widget.LinearLayout; import android.widget.Toast; import com.stardust.app.GlobalAppContext; + import org.autojs.autojs.App; import org.autojs.autojs.BuildConfig; import org.autojs.autojs.R; + import com.stardust.util.IntentUtil; import com.stardust.view.accessibility.AccessibilityService; +import com.tencent.bugly.Bugly; +import com.tencent.bugly.crashreport.BuglyLog; +import com.tencent.bugly.crashreport.CrashReport; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Map; -public class CrashHandler implements UncaughtExceptionHandler { +public class CrashHandler extends CrashReport.CrashHandleCallback implements UncaughtExceptionHandler { private static final String TAG = "CrashHandler"; private static int crashCount = 0; private static long firstCrashMillis = 0; @@ -37,9 +43,14 @@ public class CrashHandler implements UncaughtExceptionHandler { mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); } + public void setDefaultHandler(UncaughtExceptionHandler defaultHandler) { + mDefaultHandler = defaultHandler; + } + public void uncaughtException(Thread thread, Throwable ex) { + Log.e(TAG, "Uncaught Exception", ex); if (thread != Looper.getMainLooper().getThread()) { - Log.e(TAG, "Uncaught Exception", ex); + CrashReport.postCatchedException(ex, thread); return; } AccessibilityService service = AccessibilityService.getInstance(); @@ -47,38 +58,25 @@ public class CrashHandler implements UncaughtExceptionHandler { Log.d(TAG, "disable service: " + service); service.disableSelf(); } else { - Log.d(TAG, "cannot disable service: " + service); - - } - if (BuildConfig.DEBUG) { - mDefaultHandler.uncaughtException(thread, ex); - return; - } - if (causedByBadWindowToken(ex)) { - Toast.makeText(GlobalAppContext.get(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); - IntentUtil.goToAppDetailSettings(GlobalAppContext.get()); - } else { - try { - Log.e(TAG, "Uncaught Exception", ex); - if (crashTooManyTimes()) - return; - String msg = GlobalAppContext.getString(R.string.sorry_for_crash) + ex.toString(); - startErrorReportActivity(msg, throwableToString(ex)); - System.exit(1); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } + BuglyLog.d(TAG, "cannot disable service: " + service); } + mDefaultHandler.uncaughtException(thread, ex); } - private static boolean causedByBadWindowToken(Throwable e) { - while (e != null) { - if (e instanceof WindowManager.BadTokenException) { - return true; - } - e = e.getCause(); + @Override + public synchronized Map onCrashHandleStart(int crashType, String errorType, + String errorMessage, String errorStack) { + Log.d(TAG, "onCrashHandleStart: crashType = " + crashType + ", errorType = " + errorType + ", msg = " + + errorMessage + ", stack = " + errorStack); + try { + if (crashTooManyTimes()) + return super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack); + String msg = errorType + ": " + errorMessage; + startErrorReportActivity(msg, errorStack); + } catch (Throwable throwable) { + throwable.printStackTrace(); } - return false; + return super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack); } private void startErrorReportActivity(String msg, String detail) { @@ -107,11 +105,5 @@ public class CrashHandler implements UncaughtExceptionHandler { return System.currentTimeMillis() - firstCrashMillis > 3000; } - public static String throwableToString(Throwable throwable) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - throwable.printStackTrace(); - throwable.printStackTrace(pw); - return sw.toString(); - } + } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.java b/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.java index 540c8013..1c4bc350 100644 --- a/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.java @@ -15,6 +15,7 @@ import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; + import org.autojs.autojs.BuildConfig; import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; @@ -80,43 +81,16 @@ public class ErrorReportActivity extends BaseActivity { .title(mTitle) .content(R.string.crash_feedback) .positiveText(R.string.text_exit) - .neutralText(R.string.text_copy_debug_info) - .negativeText(R.string.text_report_bug) - .onPositive(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - exit(); - } - }) - .onNeutral(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - copyToClip(getDeviceMessage() + errorDetail); - exitAfter(1000); - } - }) - .onNegative(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - startIssueReportActivity(); - finish(); - } + .negativeText(R.string.text_copy_debug_info) + .onPositive((dialog, which) -> exit()) + .onNegative((dialog, which) -> { + copyToClip(getDeviceMessage() + message + "\n" + errorDetail); + exitAfter(1000); }) .cancelable(false) .show(); } - private void startIssueReportActivity() { - Intent intent = new Intent(this, IssueReporterActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtras(getIntent()); - startActivity(intent); - } - - private void showErrorMessage(String message, String errorDetail) { - ((TextView) findViewById(R.id.error)).setText(message + "\n" + errorDetail); - } - private String getDeviceMessage() { return String.format(Locale.getDefault(), "Version: %s\nAndroid: %d\n", BuildConfig.VERSION_CODE, Build.VERSION.SDK_INT); } diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java index 8bfd8bf3..b2ec5307 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.java @@ -9,6 +9,8 @@ import org.autojs.autojs.tool.IntentTool; import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.util.IntentUtil; +import com.tencent.bugly.crashreport.CrashReport; + import org.autojs.autojs.BuildConfig; import org.autojs.autojs.R; @@ -87,7 +89,7 @@ public class AboutActivity extends BaseActivity { .title("Crash Test") .positiveText("Crash") .onPositive((dialog, which) -> { - throw new RuntimeException("Crash Test"); + CrashReport.testJavaCrash(); }).show(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1db03db0..19ecd8bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,7 +55,7 @@ 略略略 请选择 崩溃了o(≧口≦)o - 点击\"退出\"退出程序(ಥ _ ಥ)或者提交错误报告或者复制调试信息反馈给开发者(≧∇≦)ノ + 将会自动提交错误信息。您也可以手动复制调试信息提交给开发者(*^▽^*)或者点击\"退出\"退出程序o(╥﹏╥)o 清空 控制台 日志 diff --git a/common/release/output.json b/common/release/output.json index 77d9be0a..1d8bd02c 100644 --- a/common/release/output.json +++ b/common/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":411},"path":"commonRelease-4.0.2 Alpha6.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":412},"path":"commonRelease-4.0.2 Alpha7.apk","properties":{"packageId":"org.autojs.autojs","split":"","minSdkVersion":"17"}}] \ No newline at end of file