diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt index f74c5dae..4f399986 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt @@ -26,6 +26,9 @@ package com.fankes.apperrorstracking.const import com.fankes.apperrorstracking.generated.ModuleAppProperties import com.fankes.apperrorstracking.wrapper.BuildConfigWrapper +/** 项目名称 */ +const val PROJECT_NAME = ModuleAppProperties.PROJECT_NAME + /** * 包名常量定义类 */ @@ -56,4 +59,4 @@ object ModuleVersion { val suffix = GITHUB_COMMIT_ID.let { if (it.isNotBlank()) "-$it" else "" } override fun toString() = "$NAME$suffix($CODE)" -} \ No newline at end of file +} diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt index f4859117..d8a522cb 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt @@ -59,6 +59,9 @@ object ConfigData { /** 禁止异常堆栈内容自动换行 */ val DISABLE_AUTO_WRAP_ERROR_STACK_TRACE = PrefsData("_disable_auto_wrap_error_stack_trace", false) + /** 自动打印异常堆栈到 Logcat */ + val AUTO_PRINT_STACK_TRACE_TO_LOGCAT = PrefsData("_auto_print_stack_trace_to_logcat", false) + /** 分享时使用文件 */ val SHARE_WITH_FILE = PrefsData("_share_with_file", false) @@ -228,4 +231,13 @@ object ConfigData { set(value) { putBoolean(SHARE_WITH_FILE, value) } -} \ No newline at end of file + + /** + * 是否自动打印异常堆栈到 Logcat + */ + var isAutoPrintStackTraceToLogcat + get() = getBoolean(AUTO_PRINT_STACK_TRACE_TO_LOGCAT) + set(value) { + putBoolean(AUTO_PRINT_STACK_TRACE_TO_LOGCAT, value) + } +} diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt b/module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt index 0bc789fd..d2416ae8 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt @@ -21,6 +21,7 @@ */ package com.fankes.apperrorstracking.hook +import com.fankes.apperrorstracking.const.PROJECT_NAME import com.fankes.apperrorstracking.data.ConfigData import com.fankes.apperrorstracking.generated.locale.ModuleAppLocale import com.fankes.apperrorstracking.hook.entity.FrameworkHooker @@ -35,7 +36,7 @@ object HookEntry : IYukiHookXposedInit { override fun onInit() = configs { debugLog { - tag = "AppErrorsTracking" + tag = PROJECT_NAME isRecord = true } isDebug = false @@ -48,4 +49,4 @@ object HookEntry : IYukiHookXposedInit { loadHooker(FrameworkHooker) } } -} \ No newline at end of file +} diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt b/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt index fb7b0f73..baff1191 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt @@ -42,6 +42,7 @@ import com.fankes.apperrorstracking.bean.AppErrorsInfoBean import com.fankes.apperrorstracking.bean.AppInfoBean import com.fankes.apperrorstracking.bean.MutedErrorsAppBean import com.fankes.apperrorstracking.bean.enum.AppFiltersType +import com.fankes.apperrorstracking.const.PROJECT_NAME import com.fankes.apperrorstracking.data.AppErrorsConfigData import com.fankes.apperrorstracking.data.AppErrorsRecordData import com.fankes.apperrorstracking.data.ConfigData @@ -404,7 +405,17 @@ object FrameworkHooker : YukiBaseHooker() { * @param info 系统错误报告数据实例 */ private fun AppErrorsProcessData.handleAppErrorsInfo(context: Context, info: ApplicationErrorReport.CrashInfo?) { - AppErrorsRecordData.add(AppErrorsInfoBean.clone(context, pid, userId, appInfo?.packageName, info)) + val appErrorsInfo = AppErrorsInfoBean.clone(context, pid, userId, appInfo?.packageName, info) + AppErrorsRecordData.add(appErrorsInfo) + if (ConfigData.isAutoPrintStackTraceToLogcat) + runCatching { + YLog.error( + msg = appErrorsInfo.stackTrace, + tag = PROJECT_NAME, + env = YLog.EnvType.LOGD + ) + } + .onFailure { YLog.error("Failed to auto print app error stack trace to logcat", it) } YLog.info("Received crash application data${if (userId != 0) " --user $userId" else ""} --pid $pid") } @@ -504,4 +515,4 @@ object FrameworkHooker : YukiBaseHooker() { } } } -} \ No newline at end of file +} diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt index 095c0e94..b366c9d3 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt @@ -33,6 +33,7 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import com.fankes.apperrorstracking.R import com.fankes.apperrorstracking.bean.AppErrorsInfoBean +import com.fankes.apperrorstracking.const.PROJECT_NAME import com.fankes.apperrorstracking.data.ConfigData import com.fankes.apperrorstracking.data.factory.bind import com.fankes.apperrorstracking.databinding.ActivityAppErrorsDetailBinding @@ -48,7 +49,7 @@ import com.fankes.apperrorstracking.utils.factory.openSelfSetting import com.fankes.apperrorstracking.utils.factory.showDialog import com.fankes.apperrorstracking.utils.factory.toast import com.fankes.apperrorstracking.utils.tool.StackTraceShareHelper -import com.highcapable.yukihookapi.hook.log.loggerE +import com.highcapable.yukihookapi.hook.log.YLog import java.io.File class AppErrorsDetailActivity : BaseActivity() { @@ -122,7 +123,11 @@ class AppErrorsDetailActivity : BaseActivity() { } binding.appInfoItem.setOnClickListener { openSelfSetting(appErrorsInfo.packageName) } binding.printIcon.setOnClickListener { - loggerE(msg = appErrorsInfo.stackTrace) + YLog.error( + msg = appErrorsInfo.stackTrace, + tag = PROJECT_NAME, + env = YLog.EnvType.LOGD + ) toast(locale.printToLogcatSuccess) } binding.copyIcon.setOnClickListener { @@ -219,4 +224,4 @@ class AppErrorsDetailActivity : BaseActivity() { super.onNewIntent(intent) if (initUi(intent)) binding.appPanelScrollView.scrollTo(0, 0) } -} \ No newline at end of file +} diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt index a692825b..ac035e40 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt @@ -101,6 +101,9 @@ class MainActivity : BaseActivity() { binding.onlyShowErrorsInMainProcessSwitch.bind(ConfigData.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN) binding.alwaysShowsReopenAppOptionsSwitch.bind(ConfigData.ENABLE_ALWAYS_SHOWS_REOPEN_APP_OPTIONS) binding.shareWithFile.bind(ConfigData.SHARE_WITH_FILE) + binding.autoPrintStackTraceToLogcatSwitch.bind(ConfigData.AUTO_PRINT_STACK_TRACE_TO_LOGCAT) { + onChanged { FrameworkTool.refreshFrameworkPrefsData(this@MainActivity) } + } binding.enableAppsConfigsTemplateSwitch.bind(ConfigData.ENABLE_APP_CONFIG_TEMPLATE) { onInitialize { binding.mgrAppsConfigsTemplateButton.isVisible = it } onChanged { reinitialize() } @@ -185,4 +188,4 @@ class MainActivity : BaseActivity() { refreshModuleStatus() } } -} \ No newline at end of file +} diff --git a/module-app/src/main/res/layout/activity_main.xml b/module-app/src/main/res/layout/activity_main.xml index d87aa3f5..6f07f740 100644 --- a/module-app/src/main/res/layout/activity_main.xml +++ b/module-app/src/main/res/layout/activity_main.xml @@ -322,6 +322,30 @@ android:textColor="@color/colorTextDark" android:textSize="12sp" /> + + + + システムビルド ID アプリのパッケージ名 その他の要件 + エラースタックを logcat に自動出力 + 有効化すると、新しく検出されたクラッシュのスタックトレースを AppErrorsTracking タグで logcat へ自動出力します。 このモジュールは KavaRef を搭載しています。\n詳細はこちら https://github.com/HighCapable/KavaRef diff --git a/module-app/src/main/res/values-zh-rCN/strings.xml b/module-app/src/main/res/values-zh-rCN/strings.xml index ba2f9f8a..d7f53499 100644 --- a/module-app/src/main/res/values-zh-rCN/strings.xml +++ b/module-app/src/main/res/values-zh-rCN/strings.xml @@ -159,5 +159,7 @@ 其它必要信息 以文件方式分享异常堆栈 使用文件的方式代替文本分享异常堆栈 + 自动打印异常堆栈到控制台 + 启用后,每次新捕获到应用崩溃时都会自动使用 AppErrorsTracking 标签将异常堆栈打印到 logcat。 此模块使用 KavaRef 强力驱动。\n了解更多 https://github.com/HighCapable/KavaRef - \ No newline at end of file + diff --git a/module-app/src/main/res/values-zh-rHK/strings.xml b/module-app/src/main/res/values-zh-rHK/strings.xml index b4ec46e0..a8408341 100644 --- a/module-app/src/main/res/values-zh-rHK/strings.xml +++ b/module-app/src/main/res/values-zh-rHK/strings.xml @@ -155,5 +155,7 @@ 系統建置 ID 應用程式包名稱 其它必要資訊 + 自動打印異常堆棧到控制台 + 啟用後,每次新捕獲到程式崩潰時都會自動使用 AppErrorsTracking 標籤將異常堆棧打印到 logcat。 此模組使用 KavaRef 強力驅動。\n了解更多 https://github.com/HighCapable/KavaRef - \ No newline at end of file + diff --git a/module-app/src/main/res/values-zh-rMO/strings.xml b/module-app/src/main/res/values-zh-rMO/strings.xml index 650c4685..03f2ec89 100644 --- a/module-app/src/main/res/values-zh-rMO/strings.xml +++ b/module-app/src/main/res/values-zh-rMO/strings.xml @@ -155,5 +155,7 @@ 系統建置 ID 應用程式包名稱 其它必要資訊 + 自動打印異常堆棧到控制台 + 啟用後,每次新捕獲到程式崩潰時都會自動使用 AppErrorsTracking 標籤將異常堆棧打印到 logcat。 此模組使用 KavaRef 強力驅動。\n了解更多 https://github.com/HighCapable/KavaRef - \ No newline at end of file + diff --git a/module-app/src/main/res/values-zh-rTW/strings.xml b/module-app/src/main/res/values-zh-rTW/strings.xml index 549a57ae..7d247b3a 100644 --- a/module-app/src/main/res/values-zh-rTW/strings.xml +++ b/module-app/src/main/res/values-zh-rTW/strings.xml @@ -155,5 +155,7 @@ 系統建置 ID 應用程式包名稱 其它必要資訊 + 自動輸出異常堆疊到控制檯 + 啟用後,每次新捕獲到程式崩潰時都會自動使用 AppErrorsTracking 標籤將異常堆疊輸出到 logcat。 此模組使用 KavaRef 強力驅動。\n瞭解更多 https://github.com/HighCapable/KavaRef - \ No newline at end of file + diff --git a/module-app/src/main/res/values/strings.xml b/module-app/src/main/res/values/strings.xml index 9ae8ace3..4148ca1d 100644 --- a/module-app/src/main/res/values/strings.xml +++ b/module-app/src/main/res/values/strings.xml @@ -162,5 +162,7 @@ Other Requirement Share errors stacktrace with file Share errors stacktrace using files instead of text + Auto print error stack trace to logcat + After enabling, each newly captured crash stack trace will be printed to logcat automatically with the AppErrorsTracking tag. This Xposed Module is powered by KavaRef.\nLearn more https://github.com/HighCapable/KavaRef diff --git a/settings.gradle.kts b/settings.gradle.kts index 29cfc72d..bd355137 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,7 +34,7 @@ gropify { } android { existsPropertyFiles(".secret/secret.properties") - includeKeys("GITHUB_CI_COMMIT_ID", "APP_CENTER_SECRET") + includeKeys("GITHUB_CI_COMMIT_ID", "APP_CENTER_SECRET", "project.name") // 手动指定类型,防止一些特殊 "COMMIT ID" 被生成为数值 keyValuesRules("GITHUB_CI_COMMIT_ID" to ValueRule(String::class)) } @@ -42,4 +42,4 @@ gropify { rootProject { common { isEnabled = false } } } rootProject.name = "AppErrorsTracking" -include(":module-app", ":demo-app") \ No newline at end of file +include(":module-app", ":demo-app")