Added more functions

- From module activity enter to AppErrorsRecordActivity
- Only show errors dialog when apps in front or main process
- More i18n support
This commit is contained in:
2022-06-02 04:58:13 +08:00
parent be87f5d529
commit 8635ad3874
14 changed files with 351 additions and 24 deletions

View File

@@ -44,7 +44,7 @@ Added more features to app's crash dialog, fixed custom rom deleted dialog, the
- 打印异常堆栈到控制台功能
- 异常历史记录功能,可通过通知栏磁贴“异常历史记录”进入和模块主界面进入(正在开发)
- 异常历史记录功能,可通过通知栏磁贴“异常历史记录”进入和模块主界面进入
- 多进程 APP 的异常将会显示异常的进程名
@@ -56,10 +56,6 @@ Added more features to app's crash dialog, fixed custom rom deleted dialog, the
- 排除列表功能
- 模块主界面进入“异常历史记录”功能
- 隐藏 APP 多进程和后台进程崩溃对话框功能
- 已忽略异常的 APP 查看功能
- 更多功能

View File

@@ -26,4 +26,6 @@ import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData
object DataConst {
val ENABLE_HIDE_ICON = PrefsData("_hide_icon", false)
val ENABLE_ONLY_SHOW_ERRORS_IN_FRONT = PrefsData("_enable_only_show_errors_in_front", false)
val ENABLE_ONLY_SHOW_ERRORS_IN_MAIN = PrefsData("_enable_only_show_errors_in_main", false)
}

View File

@@ -34,6 +34,7 @@ class HookEntry : IYukiHookXposedInit {
override fun onInit() = configs {
debugTag = "AppErrorsTracking"
isDebug = false
isEnableModulePrefsCache = false
}
override fun onHook() = encase {

View File

@@ -30,6 +30,7 @@ import android.os.Message
import com.fankes.apperrorstracking.BuildConfig
import com.fankes.apperrorstracking.bean.AppErrorsDisplayBean
import com.fankes.apperrorstracking.bean.AppErrorsInfoBean
import com.fankes.apperrorstracking.data.DataConst
import com.fankes.apperrorstracking.locale.LocaleString
import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsDisplayActivity
import com.fankes.apperrorstracking.utils.factory.appName
@@ -47,10 +48,10 @@ import com.highcapable.yukihookapi.hook.type.android.MessageClass
object FrameworkHooker : YukiBaseHooker() {
private const val ActivityManagerServiceClass = "com.android.server.am.ActivityManagerService"
private const val UserControllerClass = "com.android.server.am.UserController"
private const val AppErrorsClass = "com.android.server.am.AppErrors"
private const val AppErrorDialog_DataClass = "com.android.server.am.AppErrorDialog\$Data"
private const val ProcessRecordClass = "com.android.server.am.ProcessRecord"
private val PackageListClass = VariousClass(
@@ -127,6 +128,9 @@ object FrameworkHooker : YukiBaseHooker() {
/** 当前进程信息 */
val proc = AppErrorDialog_DataClass.clazz.field { name = "proc" }.get(errData).any()
/** 当前 UserId 信息 */
val userId = ProcessRecordClass.clazz.field { name = "userId" }.get(proc).int()
/** 当前 APP 信息 */
val appInfo = ProcessRecordClass.clazz.field { name = "info" }.get(proc).cast<ApplicationInfo>()
@@ -153,6 +157,15 @@ object FrameworkHooker : YukiBaseHooker() {
name = "pkgList"
}.get(proc).self).int() == 1 && appInfo != null)
/** 是否为主进程 */
val isMainProcess = packageName == processName
/** 是否为后台进程 */
val isBackgroundProcess = UserControllerClass.clazz.method { name = "getCurrentProfileIds" }
.get(ActivityManagerServiceClass.clazz.field { name = "mUserController" }
.get(field { name = "mService" }.get(instance).any()).any())
.invoke<IntArray>()?.takeIf { it.isNotEmpty() }?.any { it != userId } ?: false
/** 是否短时内重复错误 */
val isRepeating = AppErrorDialog_DataClass.clazz.field { name = "repeating" }.get(errData).boolean()
/** 打印错误日志 */
@@ -165,19 +178,26 @@ object FrameworkHooker : YukiBaseHooker() {
context.toast(msg = "AppErrorsTracking has crashed, please see the log in console")
return@afterHook
}
/** 判断是否为已忽略的 APP */
if (ignoredErrorsIfUnlockApps.contains(packageName) || ignoredErrorsIfRestartApps.contains(packageName)) return@afterHook
/** 判断是否为后台进程 */
if ((isBackgroundProcess || context.isAppCanOpened(packageName).not())
&& prefs.get(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_FRONT)
) return@afterHook
/** 判断是否为主进程 */
if (isMainProcess.not() && prefs.get(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN)) return@afterHook
/** 启动错误对话框显示窗口 */
if (ignoredErrorsIfUnlockApps.contains(packageName).not() && ignoredErrorsIfRestartApps.contains(packageName).not())
AppErrorsDisplayActivity.start(
context, AppErrorsDisplayBean(
packageName = packageName,
processName = processName,
appName = appName,
title = if (isRepeating) LocaleString.aerrRepeatedTitle(appName) else LocaleString.aerrTitle(appName),
isShowAppInfoButton = isApp,
isShowReopenButton = isApp && isRepeating.not() && context.isAppCanOpened(packageName) && packageName == processName,
isShowCloseAppButton = isApp
)
AppErrorsDisplayActivity.start(
context, AppErrorsDisplayBean(
packageName = packageName,
processName = processName,
appName = appName,
title = if (isRepeating) LocaleString.aerrRepeatedTitle(appName) else LocaleString.aerrTitle(appName),
isShowAppInfoButton = isApp,
isShowReopenButton = isApp && isRepeating.not() && context.isAppCanOpened(packageName) && isMainProcess,
isShowCloseAppButton = isApp
)
)
}
}
injectMember {

View File

@@ -33,7 +33,10 @@ import com.fankes.apperrorstracking.data.DataConst
import com.fankes.apperrorstracking.databinding.ActivityMainBinding
import com.fankes.apperrorstracking.locale.LocaleString
import com.fankes.apperrorstracking.ui.activity.base.BaseActivity
import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsRecordActivity
import com.fankes.apperrorstracking.utils.factory.navigate
import com.fankes.apperrorstracking.utils.factory.openBrowser
import com.fankes.apperrorstracking.utils.factory.toast
import com.fankes.apperrorstracking.utils.tool.FrameworkTool
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.factory.modulePrefs
@@ -47,6 +50,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.mainTextVersion.text = LocaleString.moduleVersion(BuildConfig.VERSION_NAME)
binding.mainTextSystemVersion.text =
LocaleString.systemVersion("${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT}) ${Build.DISPLAY}")
binding.onlyShowErrorsInFrontSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_FRONT)
binding.onlyShowErrorsInMainProcessSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN)
binding.hideIconInLauncherSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_HIDE_ICON)
binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b ->
if (btn.isPressed.not()) return@setOnCheckedChangeListener
@@ -57,6 +62,23 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
PackageManager.DONT_KILL_APP
)
}
binding.onlyShowErrorsInFrontSwitch.setOnCheckedChangeListener { btn, b ->
if (btn.isPressed.not()) return@setOnCheckedChangeListener
modulePrefs.put(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_FRONT, b)
}
binding.onlyShowErrorsInMainProcessSwitch.setOnCheckedChangeListener { btn, b ->
if (btn.isPressed.not()) return@setOnCheckedChangeListener
modulePrefs.put(DataConst.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN, b)
}
binding.enableAppsConfigsTemplateSwitch.setOnCheckedChangeListener { btn, b ->
if (b) btn.isChecked = false
toastComingSooon()
}
/** 管理应用配置模板按钮点击事件 */
binding.mgrAppsConfigsTemplateButton.setOnClickListener { toastComingSooon() }
/** 功能管理按钮点击事件 */
binding.viewErrorsRecordButton.setOnClickListener { navigate<AppErrorsRecordActivity>() }
binding.viewIgnoredErrorsAppsButton.setOnClickListener { toastComingSooon() }
/** 重启按钮点击事件 */
binding.titleRestartIcon.setOnClickListener { FrameworkTool.restartSystem(context = this) }
/** 项目地址按钮点击事件 */
@@ -88,6 +110,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.mainTextApiWay.text = "Activated by ${YukiHookAPI.Status.executorName} API ${YukiHookAPI.Status.executorVersion}"
}
/** 敬请期待 */
private fun toastComingSooon() = toast(msg = "Coming soon")
override fun onResume() {
super.onResume()
/** 刷新模块状态 */

View File

@@ -196,18 +196,223 @@
android:textSize="11sp" />
</LinearLayout>
<TextView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:animateLayoutChanges="true"
android:background="@drawable/bg_permotion_round"
android:elevation="0dp"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:gravity="center|start">
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginEnd="10dp"
android:src="@mipmap/ic_basic" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.85"
android:singleLine="true"
android:text="@string/preference_settings"
android:textColor="@color/colorTextGray"
android:textSize="12sp" />
</LinearLayout>
<com.fankes.apperrorstracking.ui.view.MaterialSwitch
android:id="@+id/only_show_errors_in_front_switch"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="5dp"
android:text="@string/only_show_errors_in_front"
android:textAllCaps="false"
android:textColor="@color/colorTextGray"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:alpha="0.6"
android:lineSpacingExtra="6dp"
android:text="@string/only_show_errors_in_front_tip"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
<com.fankes.apperrorstracking.ui.view.MaterialSwitch
android:id="@+id/only_show_errors_in_main_process_switch"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="5dp"
android:text="@string/only_show_errors_in_main_process"
android:textAllCaps="false"
android:textColor="@color/colorTextGray"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:alpha="0.6"
android:lineSpacingExtra="6dp"
android:text="@string/only_show_errors_in_main_process_tip"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
<com.fankes.apperrorstracking.ui.view.MaterialSwitch
android:id="@+id/enable_apps_configs_template_switch"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:text="@string/enable_apps_config_template"
android:textAllCaps="false"
android:textColor="@color/colorTextGray"
android:textSize="15sp" />
<TextView
android:id="@+id/mgr_apps_configs_template_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginTop="10dp"
android:layout_marginRight="13dp"
android:layout_marginBottom="5dp"
android:background="@drawable/bg_button_round"
android:gravity="center"
android:padding="10dp"
android:singleLine="true"
android:text="@string/mgr_apps_config_template"
android:textColor="@color/colorTextGray"
android:textSize="15sp"
android:visibility="gone" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="5dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:alpha="0.6"
android:lineSpacingExtra="6dp"
android:text="@string/apps_config_template_tip"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:background="@drawable/bg_permotion_round"
android:elevation="0dp"
android:gravity="center"
android:padding="50dp"
android:text="@string/todo_items"
android:textColor="@color/colorTextDark"
android:textSize="15sp" />
android:orientation="vertical"
android:paddingTop="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="15dp"
android:gravity="center|start">
<ImageView
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginEnd="10dp"
android:src="@mipmap/ic_control" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.85"
android:singleLine="true"
android:text="@string/function_mgr"
android:textColor="@color/colorTextGray"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:id="@+id/view_errors_record_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
android:layout_marginBottom="10dp"
android:background="@drawable/bg_button_round"
android:gravity="center"
android:padding="10dp"
android:singleLine="true"
android:text="@string/view_errors_record"
android:textColor="@color/colorTextGray"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:alpha="0.6"
android:lineSpacingExtra="6dp"
android:text="@string/view_errors_record_tip"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
<TextView
android:id="@+id/view_ignored_errors_apps_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
android:layout_marginBottom="10dp"
android:background="@drawable/bg_button_round"
android:gravity="center"
android:padding="10dp"
android:singleLine="true"
android:text="@string/view_ignored_errors_apps"
android:textColor="@color/colorTextGray"
android:textSize="15sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:alpha="0.6"
android:lineSpacingExtra="6dp"
android:text="@string/view_ignored_errors_apps_tip"
android:textColor="@color/colorTextDark"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -71,4 +71,17 @@
<string name="year_ago">年前</string>
<string name="crash_process">エラープロセス「%1$s」</string>
<string name="share_error_stack">エラースタックをシェアする</string>
<string name="preference_settings">好み設定</string>
<string name="function_mgr">機能管理</string>
<string name="only_show_errors_in_front">フロントアプリのエラーダイアログを表示</string>
<string name="only_show_errors_in_main_process">メインプロセスのエラーダイアログを表示</string>
<string name="enable_apps_config_template">アプリ設定テンプレートを有効にする</string>
<string name="mgr_apps_config_template">アプリ設定テンプレートを管理する</string>
<string name="view_errors_record">エラー履歴を表示する</string>
<string name="view_ignored_errors_apps">エラーを無視したアプリを表示する</string>
<string name="only_show_errors_in_front_tip">有効にすると、エラーが発生したアプリがフォアグラウンド(使用中)の場合にのみエラーダイアログが表示されます。エラーが発生したバックグラウンドアプリではエラーダイアログは表示されませんが、すべてがに記録されます。エラー履歴。</string>
<string name="only_show_errors_in_main_process_tip">有効にすると、エラーダイアログは、アプリで発生したエラーがメインプロセス(最初のアプリケーションインスタンスオブジェクト)にある場合にのみ表示されます。</string>
<string name="apps_config_template_tip">ここでは、アプリごとに個別にエラーが発生したときにエラーダイアログを表示するかどうかを設定できます。</string>
<string name="view_errors_record_tip">ここでは、システムの電源を入れてから現在までのすべてのアプリエラーレコードを確認できます。エラー履歴はリスタート後に自動的にクリアされます。レコードの表示、エクスポート、共有、およびクリアが可能です。</string>
<string name="view_ignored_errors_apps_tip">ここでは、さまざまな形式のエラーを手動で無視したアプリを見つけることができます。このリストは、リスタート後に自動的にクリアされます。これらの無視されたアプリを管理し、無視リストから削除できます。</string>
</resources>

View File

@@ -71,4 +71,17 @@
<string name="year_ago">年前</string>
<string name="crash_process">异常进程 \"%1$s\"</string>
<string name="share_error_stack">分享异常堆栈</string>
<string name="preference_settings">偏好设置</string>
<string name="function_mgr">功能管理</string>
<string name="only_show_errors_in_front">仅对前台应用展示错误对话框</string>
<string name="only_show_errors_in_main_process">仅对应用主进程展示错误对话框</string>
<string name="enable_apps_config_template">启用应用配置模板</string>
<string name="mgr_apps_config_template">管理应用配置模板</string>
<string name="view_errors_record">查看异常历史记录</string>
<string name="view_ignored_errors_apps">查看已忽略异常的应用</string>
<string name="only_show_errors_in_front_tip">启用后,只有发生异常的应用处于前台(正在使用中)时才会展示错误对话框,发生异常的后台应用虽然不会展示错误对话框,但是它们都会被记录到异常历史记录中。</string>
<string name="only_show_errors_in_main_process_tip">启用后,只有应用发生的异常位于主进程(第一个 Application 实例对象)时才会展示错误对话框。</string>
<string name="apps_config_template_tip">你可以在这里对每个应用发生异常时,单独配置其在发生异常时是否展示错误对话框。</string>
<string name="view_errors_record_tip">在这里,你可以找到从系统开机以来到现在为止的全部应用异常记录,异常历史记录在重新启动后会自动清空,你可以对记录进行查看、导出和分享以及清空。</string>
<string name="view_ignored_errors_apps_tip">在这里,你可以找到已被你以不同形式手动忽略异常的应用,这个列表将会在重新启动后自动清空,你可以对这些已忽略的应用进行管理以及从忽略列表中移除它们。</string>
</resources>

View File

@@ -71,4 +71,17 @@
<string name="year_ago">年前</string>
<string name="crash_process">異常進程 \"%1$s\"</string>
<string name="share_error_stack">分享異常堆棧</string>
<string name="preference_settings">偏好設置</string>
<string name="function_mgr">功能管理</string>
<string name="only_show_errors_in_front">僅為前台程式展示錯誤對話框</string>
<string name="only_show_errors_in_main_process">僅為程式主進程展示錯誤對話框</string>
<string name="enable_apps_config_template">啟用程式配置模板</string>
<string name="mgr_apps_config_template">管理程式配置模板</string>
<string name="view_errors_record">查看異常歷史記錄</string>
<string name="view_ignored_errors_apps">查看已忽略異常的程式</string>
<string name="only_show_errors_in_front_tip">啟用後,只有發生異常的程式處於前台(正在使用中)時才會展示錯誤對話框,發生異常的後台程式雖然不會展示錯誤對話框,但是它們都會被記錄到異常歷史記錄中。</string>
<string name="only_show_errors_in_main_process_tip">啟用後,只有程式發生的異常位於主進程(第一個 Application 實例對象)時才會展示錯誤對話框。</string>
<string name="apps_config_template_tip">你可以在這裡對每個程式發生異常時,單獨配置其在發生異常時是否展示錯誤對話框。</string>
<string name="view_errors_record_tip">在這裡,你可以找到從系統開機以來到現在為止的全部程式異常記錄,異常歷史記錄在重新啟動後會自動清空,你可以對記錄進行查看、導出和分享以及清空。</string>
<string name="view_ignored_errors_apps_tip">在這裡,你可以找到已被你以不同形式手動忽略異常的程式,這個列表將會在重新啟動後自動清空,你可以對這些已忽略的程式進行管理以及從忽略列表中移除它們。</string>
</resources>

View File

@@ -71,4 +71,17 @@
<string name="year_ago">年前</string>
<string name="crash_process">異常進程 \"%1$s\"</string>
<string name="share_error_stack">分享異常堆棧</string>
<string name="preference_settings">偏好設置</string>
<string name="function_mgr">功能管理</string>
<string name="only_show_errors_in_front">僅為前台程式展示錯誤對話框</string>
<string name="only_show_errors_in_main_process">僅為程式主進程展示錯誤對話框</string>
<string name="enable_apps_config_template">啟用程式配置模板</string>
<string name="mgr_apps_config_template">管理程式配置模板</string>
<string name="view_errors_record">查看異常歷史記錄</string>
<string name="view_ignored_errors_apps">查看已忽略異常的程式</string>
<string name="only_show_errors_in_front_tip">啟用後,只有發生異常的程式處於前台(正在使用中)時才會展示錯誤對話框,發生異常的後台程式雖然不會展示錯誤對話框,但是它們都會被記錄到異常歷史記錄中。</string>
<string name="only_show_errors_in_main_process_tip">啟用後,只有程式發生的異常位於主進程(第一個 Application 實例對象)時才會展示錯誤對話框。</string>
<string name="apps_config_template_tip">你可以在這裡對每個程式發生異常時,單獨配置其在發生異常時是否展示錯誤對話框。</string>
<string name="view_errors_record_tip">在這裡,你可以找到從系統開機以來到現在為止的全部程式異常記錄,異常歷史記錄在重新啟動後會自動清空,你可以對記錄進行查看、導出和分享以及清空。</string>
<string name="view_ignored_errors_apps_tip">在這裡,你可以找到已被你以不同形式手動忽略異常的程式,這個列表將會在重新啟動後自動清空,你可以對這些已忽略的程式進行管理以及從忽略列表中移除它們。</string>
</resources>

View File

@@ -71,4 +71,17 @@
<string name="year_ago">年前</string>
<string name="crash_process">異常進程 \"%1$s\"</string>
<string name="share_error_stack">分享異常堆棧</string>
<string name="preference_settings">偏好設置</string>
<string name="function_mgr">功能管理</string>
<string name="only_show_errors_in_front">僅為前台程式展示錯誤對話框</string>
<string name="only_show_errors_in_main_process">僅為程式主進程展示錯誤對話框</string>
<string name="enable_apps_config_template">啟用程式配置模板</string>
<string name="mgr_apps_config_template">管理程式配置模板</string>
<string name="view_errors_record">查看異常歷史記錄</string>
<string name="view_ignored_errors_apps">查看已忽略異常的程式</string>
<string name="only_show_errors_in_front_tip">啟用後,只有發生異常的程式處於前台(正在使用中)時才會展示錯誤對話框,發生異常的後台程式雖然不會展示錯誤對話框,但是它們都會被記錄到異常歷史記錄中。</string>
<string name="only_show_errors_in_main_process_tip">啟用後,只有程式發生的異常位於主進程(第一個 Application 實例對象)時才會展示錯誤對話框。</string>
<string name="apps_config_template_tip">你可以在這裡對每個程式發生異常時,單獨配置其在發生異常時是否展示錯誤對話框。</string>
<string name="view_errors_record_tip">在這裡,你可以找到從系統開機以來到現在為止的全部程式異常記錄,異常歷史記錄在重新啟動後會自動清空,你可以對記錄進行查看、導出和分享以及清空。</string>
<string name="view_ignored_errors_apps_tip">在這裡,你可以找到已被你以不同形式手動忽略異常的程式,這個列表將會在重新啟動後自動清空,你可以對這些已忽略的程式進行管理以及從忽略列表中移除它們。</string>
</resources>

View File

@@ -69,6 +69,19 @@
<string name="day_ago">days ago</string>
<string name="month_ago">month ago</string>
<string name="year_ago">year ago</string>
<string name="crash_process">Crash Process \"%1$s\"</string>
<string name="crash_process">Crashed Process \"%1$s\"</string>
<string name="share_error_stack">Share error stack</string>
<string name="preference_settings">Preference Settings</string>
<string name="function_mgr">Function Management</string>
<string name="only_show_errors_in_front">Show error dialogs only for foreground apps</string>
<string name="only_show_errors_in_main_process">Show error dialogs only for main process apps</string>
<string name="enable_apps_config_template">Enable apps config template</string>
<string name="mgr_apps_config_template">Management apps config template</string>
<string name="view_errors_record">View apps errors record</string>
<string name="view_ignored_errors_apps">View ignored errors apps</string>
<string name="only_show_errors_in_front_tip">After enabling, the error dialog will only be displayed when the abnormal apps is in the foreground (in use). Although the abnormal background application will not display the error dialog, they will be recorded in the errors history.</string>
<string name="only_show_errors_in_main_process_tip">After enabling, the error dialog will only be displayed if the exception occurred in the application is in the main process (the first Application instance object).</string>
<string name="apps_config_template_tip">Here you can individually configure whether to display an error dialog when an exception occurs for each apps.</string>
<string name="view_errors_record_tip">Here you can find all apps exception records since the system was turned on until now. The exception history will be automatically cleared after restarting. You can view, export, share and clear the records.</string>
<string name="view_ignored_errors_apps_tip">Here you can find apps that you have manually ignored exceptions in different forms. This list will be automatically cleared after restarting. You can manage these ignored applications and remove them from the ignore list.</string>
</resources>