From abbe06e8c409a16a8c2afb9420eccc93bb79551a Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 21 Oct 2022 10:50:37 +0800 Subject: [PATCH] =?UTF-8?q?[CrashFix]=E4=BF=AE=E6=AD=A3LeakCanary=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=94=B1=E4=BA=8E=E5=A4=9A=E6=AC=A1close?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [CrashFix]修正LeakCanary数据库由于多次close导致的崩溃 --- app/build.gradle | 14 ++++- .../launcher/lancet/LeakCanaryCrashFix.kt | 51 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt diff --git a/app/build.gradle b/app/build.gradle index ef1273067b..93100ecfc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,6 +7,7 @@ apply plugin: 'kotlin-android-extensions' apply plugin: 'android-aspectjx' apply plugin: 'bugly' +def isReleaseBuild = isReleaseBuild() //apply ByteX宿主 if (!isAndroidTestBuild()) { apply plugin: 'bytex' @@ -51,8 +52,8 @@ if (!isAndroidTestBuild()) { enableInDebug true weaveGroup { - crash_fix { - enable true + leak_canary_crash_fix { + enable !isReleaseBuild } } } @@ -383,3 +384,12 @@ boolean isAndroidTestBuild() { } return false } + +boolean isReleaseBuild() { + for (String s : gradle.startParameter.taskNames) { + if (s.contains("Release") | s.contains("release")) { + return true + } + } + return false +} diff --git a/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt new file mode 100644 index 0000000000..738fa78a8e --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/LeakCanaryCrashFix.kt @@ -0,0 +1,51 @@ +package com.mogo.launcher.lancet + +import android.database.sqlite.* +import androidx.annotation.* +import com.knightboost.lancet.api.* +import com.knightboost.lancet.api.annotations.* +import com.knightboost.lancet.api.annotations.Weaver + +/** + * 此类主要用来修正三方库引起的崩溃 + */ +@Keep +@Weaver +@Group("leak_canary_crash_fix") +class LeakCanaryCrashFix { + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "getReadableDatabase") + fun proxyGetReadableSQLiteDb(): SQLiteDatabase? { + try { + return Origin.call() as SQLiteDatabase? + } catch (t: Throwable) { + t.printStackTrace() + } + return null + } + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "getWritableDatabase") + fun proxyGetWritableSQLiteDb(): SQLiteDatabase? { + try { + return Origin.call() as SQLiteDatabase? + } catch (t: Throwable) { + t.printStackTrace() + } + return null + } + + @Insert + @TargetClass("leakcanary.internal.activity.db.ScopedLeaksDb\$DbOpener") + @TargetMethod(methodName = "close") + fun proxyClose() { + try { + Origin.callVoid() + } catch (t: Throwable) { + t.printStackTrace() + } + } +} \ No newline at end of file