Android 应用运行时分析与智能精简平台。
这一版重写了应用列表模块,从「扫一遍再显示」改成 MT 管理器式的四级架构,
并解决了纯缓存方案最大的隐患——缓存一致性。
⚡ 列表秒开:慢在哪,就绕开哪
原来的做法是启动时把所有应用的 APK 都解析一遍(Activity/Service 数量、图标全解),
应用一多就要等好几秒。问题不在「扫描慢」,而在一开始就不该扫这么多。
| 层 | 做什么 | 为什么 |
|---|---|---|
| ① 快速列表 | getInstalledApplications(0) |
flag 传 0,不解析任何组件信息,几十毫秒返回 |
| ② Room 缓存 | 组件数量等重信息落库 | 二次启动直接读表,不碰 APK |
| ③ 安装广播 | PACKAGE_ADDED/REMOVED/REPLACED |
补上「App 开着时装了新应用」的缺口 |
| ④ 懒加载 | 点进详情才做深度解析 | 用不到的信息一律不算 |
图标只解可见项 —— LruCache 缓存 400 张,卡片进入可视区才异步解码。
原来一次性解几百张 Bitmap,既慢又占内存。
排序放在组合层 —— 名称/可瘦身/最近更新/最近使用四种排序走 combine,
切换排序不触发任何重新扫描。
🔄 v0.6.3:缓存一致性
纯缓存方案有个隐患:刚装完的新 App 不在缓存里,列表就看不到它。
分两种情况:
- 重新打开 App — 每次
refreshAppList()都会重新调getInstalledApplications,
不是纯读缓存,所以新应用会出现(v0.6.2 已经是这个行为) - App 正开着的时候装了新应用 — 这就是 v0.6.3 补的洞
做法是在 Application context 上动态注册广播监听:
IntentFilter().apply {
addAction(Intent.ACTION_PACKAGE_ADDED)
addAction(Intent.ACTION_PACKAGE_REMOVED)
addAction(Intent.ACTION_PACKAGE_REPLACED)
addDataScheme("package") // ← 少了这行收不到任何广播
}两个细节:
- 必须
addDataScheme("package")—— 这三个广播都带 package: 这个 data scheme,
不声明的话过滤器不匹配,一条都收不到 - 动态注册 + 挂在 Application 上 —— 静态注册在 Android 8+ 会被后台广播限制拦掉;
挂在 Activity 上则会随页面销毁而失效
📊 增量更新,不做全量重扫
第二阶段的深度信息只对「缓存里没有」或「APK 路径变了」的应用重新解析,
而且每 25 个批量提交一次,避免频繁触发重组。
方法笔记:这套架构抽象成了可复用的方法,写在
dev-craft / 让 Android 应用列表秒开
大小:2.9 MB · 要求:Android 10+