加速湾APP 更新三层闪退加密
三层闪退保护
第1层:主线程异常拦截(MainApplication)
通过重写 Looper.loop(),在主线程 Message 循环中用 try-catch 包裹。任何主线程未处理异常都会被捕获,弹窗提示而不是闪退。
效果:主线程崩溃 → 弹出”程序异常”对话框 → 用户点”继续使用”可继续操作,点”重启应用”可重启
第2层:子线程异常拦截(MainApplication)
通过 Thread.setDefaultUncaughtExceptionHandler,捕获所有线程的未处理异常:
- 主线程异常 → 弹窗提示,不杀进程
- 子线程异常 → 记录日志 + 尝试弹窗提示,不影响主线程运行
效果:不再调用系统默认的杀进程行为
第3层:协程异常保护(BaseActivity)
在 BaseActivity.onCreate 中为 main() 协程添加 CoroutineExceptionHandler:
- 协程内的网络异常、空指针等 → 通过
showExceptionToast在界面底部提示 - 即使提示失败也有
Toast兜底
效果:网络请求失败、服务器异常等不再导致闪退,而是友好提示

版本更新 位置

首次启动时有初始化问题(比如缺少某些资源、数据库未创建等) DataBinding 初始化问题 某些组件的首次加载失败 让我分析可能的原因: DataBinding 布局问题 – 新布局可能首次加载时出错 BaseListActivity 的 onCreate 中的问题 – 返回按钮设置、DataBinding 变量绑定等 新添加的代码首次执行失败 让我检查 BaseListActivity.kt 的代码,特别是新添加的部分: binding.self = this binding.backButton.setOnClickListener mainBinding?.activityBarTitleView?.text = tit 问题可能是: backButton 可能为空(如果 DataBinding 没正确生成) activityBarTitleView 可能为空 某些 View 绑定失败 让我检查并修复可能的空指针问题。 这通常是首次初始化问题。让我检查 BaseListActivity 中可能导致闪退的代码 第86行:binding.backButton.setOnClickListener – 如果 backButton 不存在或为 null,会崩溃 第107行:this.window.decorView.setOnInsertsChangedListener – setOnInsertsChangedListener 可能不存在于 decorView 上 让我检查一下 setOnInsertsChangedListener 的定义,以及是否有空指针问题。闪退问题可能是因为: 首次启动时某些资源未加载完成 DataBinding 生成时缺少某些视图引用 让我检查 layout 文件是否有语法问题,以及 setOnInsertsChangedListener 的实现。 搜索 setOnInsertsChangedListener 读取 Inserts.kt L1-End 这里使用了 !! 操作符,如果 compat.toWindowInsets() 返回 null,应用会崩溃。这可能在某些情况下发生。 但是,更可能的问题是闪退是因为首次启动时布局有问题,或者某个 Activity 首次加载时出错了。 让我添加一些安全检查来防止闪退: 在 BaseListActivity.kt 中添加空检查 移除 !! 操作符 发现问题!在 Inserts.kt 第31行使用了 !! 操作符,如果返回 null 会崩溃。让我修复: 修复可能崩溃的 !! 操作符 Inserts.kt (修改) +1 -1 查看文件 现在让我为 BaseListActivity 添加安全检查来防止闪退: 添加 try-catch 防止返回按钮设置失败导致闪退 BaseListActivity.kt (修改) +7 -3 查看文件 添加 try-catch 防止标题设置失败 BaseListActivity.kt (修改) +6 -2 查看文件 深度思考 读取 TicketDetailActivity.kt L200-249 让我添加一些安全检查来防止崩溃。 让我也为 TicketDetailActivity 添加安全检查: 添加安全检查防止 TicketDetailActivity 崩溃 TicketDetailActivity.kt (修改) +17 -10
配置订单页面 出现按钮无法修改问题
找到问题了!
在 styles.xml 中定义了 AppButtonStyle,其中有 android:backgroundTint="#2196F3"。这个样式会覆盖按钮的 background 属性!
虽然 XML 中设置了 @drawable/premium_button_bg,但 backgroundTint 的优先级更高,导致按钮始终显示为默认白色。
读取
activity_configorder.xmlL320-369
同时,我需要修改按钮背景样式,使其更加醒目和好看,因为用户抱怨白色卡片太丑了。让我重新设计一个更好的按钮样式。
现在修复问题!在两个按钮上添加 app:backgroundTint="@null" 来禁用样式中的背景着色:
activity_configorder.xml(修改)
+1-0
查看文件
activity_configorder.xml(修改)
+1-0
查看文件
现在重新设计按钮背景,让它更美观(用醒目的渐变橙色/红色):
premium_button_bg.xml(写入)
+14-14
查看文件
修复完成! 问题根源是 styles.xml 中的 AppButtonStyle 有 backgroundTint 属性,它覆盖了按钮的 background 设置。
修改内容:
✅ 按钮背景改为 橙色→红色渐变 – 更加醒目美观
✅ 两个按钮都添加了 app:backgroundTint="@null" – 禁用样式覆盖
如果构建很快完成 就说明构建失败
大多数问题是
需要清理缓存重新构建:
清理构建缓存
就好了
✅ activity_plans.xml – 订阅套餐页面
✅ activity_configorder.xml – 配置订单页面
✅ activity_submitorder.xml – 订单详情页面
商店按钮 → 订阅页面 (PlansActivity)
设置按钮 → 用户中心 (ProfileActivity)
Chat history summarized. (credits: 4.59)
深度思考
我来仔细调查公告信息页面和公告详情页面之间的差异。
读取
NoticesActivity.kt
读取
NoticeDetailActivity.kt
读取
NoticesDesign.kt
读取
NoticeDetailDesign.kt
find /Users/B/CLOT-zhen -name “.kt” -path “/clash/*” 2>/dev/null | head -30
< CLIXML
System.Management.Automation.PSCustomObjectSystem.Object1正在准备首次使用模块。0-1-1Completed-1 out-file : 未能找到路径“C:\dev\null”的一部分。x000D__x000A所在位置 行:1 字符: 164_x000D__x000A_+ … ing]::UTF8; find /Users/B/CLOT-zhen -name “.kt” -path “/clash/*” 2> …x000D__x000A+ ~~~~¨C12C¨C13C¨C14C¨C15C¨C16C¨C17C¨C18C~~¨C19C + CategoryInfo : OpenError: (:) [Out-File], DirectoryNotFoundException_x000D__x000A_ + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand_x000D__x000A_ ¨C20C
搜索失败
/Users/B
*Notices*.kt
搜索失败
/Users/B
*NoticeDetail*.kt
读取失败
/Users/B
pwd
< CLIXML
System.Management.Automation.PSCustomObjectSystem.Object1正在准备首次使用模块。0-1-1Completed-1
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
Notices.kt
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
NoticeDetail.kt
读取
NoticesActivity.kt
L1-End
读取
NoticeDetailActivity.kt
L1-End
读取
NoticesDesign.kt
L1-End
读取
NoticeDetailDesign.kt
L1-End
NoticesActivity 继承自 BaseActivity(),这会自动处理状态栏的沉浸式效果
NoticeDetailActivity 继承自 AppCompatActivity,这是问题所在!
BaseActivity 应该处理了状态栏的透明/沉浸式设置,而 NoticeDetailActivity 直接继承 AppCompatActivity 没有这些处理。
让我也读取布局文件看看结构差异。
现在我看到关键问题了:
NoticesActivity 继承自 BaseActivity()
NoticeDetailActivity 继承自 AppCompatActivity
这是根本原因!让我读取布局文件来确认结构差异:
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
activity_notices.xml
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
activity_notice_detail.xml
读取
activity_notices.xml
L1-End
读取
activity_notice_detail.xml
L1-End
NoticesActivity 继承自 BaseActivity()
NoticeDetailActivity 继承自 AppCompatActivity
BaseActivity 应该处理了状态栏的沉浸式效果和透明设置,而 NoticeDetailActivity 直接继承 AppCompatActivity 没有这些处理。
解决方案是让 NoticeDetailActivity 继承 BaseActivity 而不是 AppCompatActivity。但这需要做一些改动:
将 NoticeDetailActivity 移到 app 模块
或者创建一个适配的基类处理
让我先查看一下 BaseActivity 的结构,了解它是如何处理状态栏的。
现在我找到问题了!布局结构完全一致,但问题在于:
NoticesActivity 继承 BaseActivity() – 会自动处理状态栏沉浸式
NoticeDetailActivity 继承 AppCompatActivity – 没有状态栏处理
让我查看 BaseActivity 的状态栏处理逻辑:
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
BaseActivity.kt
读取
BaseActivity.kt
L1-End
深度思考
找到根本原因了!BaseActivity.applyDayNight() 设置了:
window.isSystemBarsTranslucentCompat = true
window.statusBarColor
window.navigationBarColor
而 NoticeDetailActivity 直接继承 AppCompatActivity 没有这些设置。
现在修复 NoticeDetailActivity,添加与 BaseActivity 相同的状态栏处理:
修复公告详情页面的状态栏沉浸式问题,使其与公告信息页面保持一致
NoticeDetailActivity.kt
(修改)
+32
-3
查看文件
深度思考
在 NoticeDetailActivity.kt 中未发现 linter 错误
没有编译错误。现在让我检查一下 resolveThemedColor 和 resolveThemedBoolean 在 design 模块中是否可用:
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
resolveThemedColor.kt
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code
resolveThemedBoolean.kt
搜索
fun resolveThemedColor
搜索
fun resolveThemedBoolean
深度思考
搜索
fun resolveThemedColor
搜索
fun resolveThemedBoolean
读取
BaseActivity.kt
L1-30
这些函数在 design 模块中应该是可用的。让我确认一下 design 模块的 util 包中是否有这些函数。
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/design
*.kt
深度思考
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/design/src/main/java/com/github/kr328/clash/design
*.kt
深度思考
读取
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/design/src/main/java/com/github/kr328/clash/design/util
读取
Theme.kt
L1-End
现在我需要检查一下 isSystemBarsTranslucentCompat、isAllowForceDarkCompat、isLightStatusBarsCompat 和 isLightNavigationBarCompat 这些属性是否可用。
这些属性是在 com.github.kr328.clash.common.compat 包中定义的。让我检查一下 design 模块中是否可以访问这些扩展属性。
很好!resolveThemedColor 和 resolveThemedBoolean 在 design.util 包中可用。现在让我检查一下 isSystemBarsTranslucentCompat 等扩展属性:
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/design
compat.kt 读取 build.gradle.kts L1-End 搜索文件 C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/common compat.kt
读取
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/common
搜索文件
C:/uuvpn/Android-kotlin-Code16/Android-kotlin-Code/common/src
*.kt
读取
UI.kt
L1-End
现在我的修改应该可以正常工作了。让我清理构建缓存并重新构建项目。
完美!所有扩展属性都可用。现在让我清理构建缓存并重新构建项目:
cd C:\uuvpn\Android-kotlin-Code16\Android-kotlin-Code && if (Test-Path “app\build”) { Remove-Item -Path “app\build” -Recurse -Force -ErrorAction SilentlyContinue } ; if (Test-Path “design\build”) { Remove-Item -Path “design\build” -Recurse -Force -ErrorAction SilentlyContinue } ; Write-Host “Build caches cleaned”
< CLIXML
System.Management.Automation.PSCustomObjectSystem.Object1正在准备首次使用模块。0-1-1Completed-1 1正在准备首次使用模块。0-1-1Completed-1 System.Management.Automation.InformationRecordSystem.ObjectBuild caches cleanedSystem.Management.Automation.HostInformationMessageSystem.ObjectBuild caches cleanedBuild caches cleanedfalseDarkYellowDarkMagentaWrite-Host2026-05-02T18:15:39.0171472+08:00¨C45C¨C46C¨C47CMS-EKNYIQBICOLM\AdministratorMS-EKNYIQBICOLM382243951216
读取
NoticeDetailActivity.kt
L1-End
在 NoticeDetailActivity.kt 中未发现 linter 错误
总结一下我做的修改:
根本原因:NoticeDetailActivity 继承自 AppCompatActivity,而 NoticesActivity 继承自 BaseActivity()。BaseActivity 在 applyDayNight() 方法中设置了状态栏沉浸式效果,而 NoticeDetailActivity 没有这些设置。
解决方案:在 NoticeDetailActivity 中添加了 applyDayNight() 方法,复制了 BaseActivity.applyDayNight() 中的状态栏设置逻辑:
window.isAllowForceDarkCompat = false
window.isSystemBarsTranslucentCompat = true
window.statusBarColor = resolveThemedColor(android.R.attr.statusBarColor)
window.navigationBarColor = resolveThemedColor(android.R.attr.navigationBarColor)
window.isLightStatusBarsCompat = resolveThemedBoolean(android.R.attr.windowLightStatusBar)
window.isLightNavigationBarCompat = resolveThemedBoolean(android.R.attr.windowLightNavigationBar)
这样公告详情页面的状态栏设置就与公告信息页面和其他使用 BaseActivity 的页面保持一致了。
完美!修复已完成,没有编译错误。
版本号升级位置

build.gradle.kts
- 第 46 行:
versionName = "3.0.3"← 版本名称(显示给用户的版本号) - 第 47 行:
versionCode = 321002← 版本代码(内部版本号)
密钥接口位置


因为加密问题暴露出明文接口

之后决定是否删除