安卓17 QPR2刚推送:小心你的App被系统无声暗杀,还不留堆栈

源自133位全网作者

10:56

11月10日,谷歌正式推送了 Android 17 QPR2。新通知管理、主题色自定义、Agents Dashboard……更新日志看着挺热闹。但先别急着开模拟器尝鲜,有件不那么上眼、却更要命的事:你的 App 可能会被系统"无声暗杀"。知乎

安卓17 QPR2刚推送:小心你的App被系统无声暗杀,还不留堆栈

杀你,但不再给你堆栈

以前 Android 治内存靠 LMK:整机内存吃紧时按优先级杀后台、缓存进程,前台进程留到最后。Android 17 换了规则——按设备总 RAM 给单个 App 设内存上限,长期超额占用匿名内存/swap,直接杀进程。Android开发者官网

最吓人的不是杀,是它不一定报 OOM,也不一定有常规崩溃堆栈。你只看 Crashlytics,根本不知道自己被杀过。谷歌的理由也简单:一个挂着前台服务的大户不断漏内存,LMK 不敢先动它,系统只能连坐杀掉一排"小而正常"的 App——用户切回去,本该热启动变成冷启动,还费电。知乎

那死了怎么找死因?官方给的路是:App 重启后读 `ApplicationExitInfo.getDescription()`,exit reason 是 `REASON_OTHER`、description 里带 `MemoryLimiter:AnonSwap`,就是被 memory limiter 暗杀的。发现就打点上报——这是系统层强杀,常规异常捕获拦不到它。Android开发者官网

适配清单,这四件事别偷懒

安卓17 QPR2刚推送:小心你的App被系统无声暗杀,还不留堆栈

1. R8 开满。 谷歌把这条放第一位:换用 `proguard-android-optimize.txt`,删掉 `android.enableR8.fullMode = false`——旧的 proguard-android.txt 在 AGP 9 里已不再支持。那些"祖传保命 keep 规则"别乱动,它们会让 R8 对整个项目失去优化空间;改不动就先跑官方 R8 Configuration Analyzer,它会按 shrinking、optimization、obfuscation 三类打分,告诉你哪条规则挡了多少优化。知乎

2. 图片管住。 100KB 的压缩图解码后可能要占好几 MB,Bitmap 往往就是 App 里最大的常驻对象。Android Studio 的 Profiler 已经能查重复 Bitmap,Heap Dump 后直接过滤,揪出重复存储的图。

3. 主动交内存,别等系统点名。 实现 `ComponentCallbacks2.onTrimMemory()`,盯住 `TRIM_MEMORY_UI_HIDDEN` 和 `TRIM_MEMORY_BACKGROUND`(Android 14 起其他旧回调系统已经不发),App 不可见时就把可重建的缓存释放掉,全局缓存放 Application 层统一管理。

4. 死前留证据。 Android 17 给 ProfilingManager 加了 `TRIGGER_TYPE_OOM` 和 `TRIGGER_TYPE_ANOMALY` 触发器,能在接近被杀前拿到 heap dump。终于知道"谁占了内存",而不是只知道"进程没了"。本地复现不了的线上问题,这才是对症的药;调试时还可以用 `adb shell am memory-limiter` 直接模拟限额。知乎

份额才 1%,慌什么?

Android 开发者峰会上刚公布的统计:Android 16 已占活跃设备的 25.4%,登顶第一。知乎IT之家

Android 14 还有 15.3%,而 Android 17 的份额才仅仅只有约 1%——碎片化依旧碎成一地。知乎

安卓17 QPR2刚推送:小心你的App被系统无声暗杀,还不留堆栈

但三星、小米、vivo、OPPO 的推送通道已经打开,这个 1% 只是暂时的,而新机出厂预装的就是它。反过来也别矫枉过正:微信至今仍最低支持 Android 7,抖音还在适配 Android 5,老设备长尾决定了你的代码要新老通吃,不是丢掉旧版本只对着 17 写。知乎

一句话总结:上线退出原因打点、开 R8 full、落实 onTrimMemory,三件事一天能做完,却能在年底流量高峰替你兜住口碑。

最后问一句:你项目里那句 `enableR8.fullMode = false`,敢删吗?

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章