Skip to content

Releases: Horizen5/Appslim

AppSlim Analyzer v0.6.3 — 应用列表秒开 + 缓存一致性

Choose a tag to compare

@Horizen5 Horizen5 released this 01 Aug 07:37

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+

AppSlim Analyzer v0.5.10(一键检测自动返回修复)

Choose a tag to compare

@Horizen5 Horizen5 released this 30 Jul 12:56

AppSlim Analyzer v0.5.10

一键检测 · 自动返回修复(本次重点)/ One-tap Detection: Auto-Return Fix

问题根因

「能打开目标 App,但 10 秒后不会自动跳回」不是逻辑没写,而是 Android 10+ 的 Background Activity Launch (BAL) 限制:从后台(即使前台 Service)直接 startActivity 把本应用拉回前台会被系统静默拦截。GitHub 上的 bring_app_to_foreground 项目与原生文档均确认——对普通 App 唯一可靠的绕过手段是申请 SYSTEM_ALERT_WINDOW(显示在其他应用上层) 权限,授予后该权限即成为 BAL 豁免项。

修复内容

  • 新增申请「显示在其他应用上层」权限;授予后,检测满 10 秒会被前台服务自动 startActivity 拉回 AppSlim 并展示结果。
  • 未授予时优雅降级:检测结束弹通知,点通知即可返回(通知 PendingIntent 本身即 BAL 豁免)。
  • Lens 页新增权限引导卡:未授予时提示并一键跳转系统授权页;授权后从设置返回会自动重新检测状态。
  • 结果页增强:
    • 按 CPU 峰值降序,给**「🔥 占用最高」** 的 Activity / 进程打标记;
    • 新增「返回详情并管理」按钮,直达应用详情页对高占用组件做阻断 / 一键优化。

使用

  1. 安装后首次用「一键检测」,会提示授予「显示在其他应用上层」(仅用于检测后自动返回,可随时在系统设置关闭);
  2. 授予后:点一键检测 → 自动开 App → 等 10 秒 → 自动跳回并展示哪些 Activity / 进程占用最高;
  3. 点「返回详情并管理」即可对高占用组件进行阻断或一键优化。

构建产物 / Artifact

  • AppSlimAnalyzer-v0.5.10-release.apk(MD5: 67e253501c1ce85a6decd6dbb131f5f2)

See README (中文) / README_en for details.

AppSlim Analyzer v0.5.9(一键检测全自动闭环)

Choose a tag to compare

@Horizen5 Horizen5 released this 30 Jul 12:41

AppSlim Analyzer v0.5.9

一键检测 · 全自动闭环(本次重点)/ One-tap Detection: Full Auto Loop

修复「点一键检测没反应 / 采完不返回 / 进程列表空」:现在点一次即完成整个流程,与你发的 APPLENS 项目行为一致:

  1. 📲 自动打开目标 App(标准 getLaunchIntentForPackage + 前台 Service 保活);
  2. ⏱ 前台运行 10 秒,每 500ms 采样一次(UsageStats 读前台 Activity + top/dumpsys 兜底);
  3. ↩️ 自动返回 AppSlim Analyzer,并在检测页直接展示结果:启动了哪些 Activity、各进程 CPU / 内存占用。

关键改动

  • LensScreen 支持 autoStart:详情页「一键检测」(lens?pkg=…&auto=1) 进入后加载即自动开始,不再需要点第二次。
  • ProfileService 采样结束后主动 startActivity 把本应用带回前台(FLAG_ACTIVITY_REORDER_TO_FRONT,前台服务内允许),用户无需手动切回。
  • ApplensSampler.sampleProcesses() 新增进程采集:CPU 来自 top、内存来自 dumpsys meminfo(普通模式内存可能为 0,属系统限制)。
  • ProfileService 结果补齐 processes(此前硬编码为空列表)。

之前「没反应」的根因:详情页点检测只是跳到 Lens 页还要再点一次;且采完后只发通知、目标 App 一直留在前台,你不手动切回就看不到任何结果,于是以为「点了没用」。

构建产物 / Artifact

  • AppSlimAnalyzer-v0.5.9-release.apk(MD5: 71504496d0e4292a48cd10b46261e932)

使用 / Usage

  1. 手机开启「未知来源应用」安装权限,安装本 APK。
  2. 首次检测前在应用内「去开启使用情况访问」并授予权限(否则读不到具体 Activity)。
  3. 进入任意应用详情页 → 点击「一键检测」→ 自动开 App、等 10 秒、自动返回看结果。

See README (中文) / README_en for details.

AppSlim Analyzer v0.5.8(性能优化:后台自动降频)

Choose a tag to compare

@Horizen5 Horizen5 released this 30 Jul 12:32

AppSlim Analyzer v0.5.8

性能优化(本次重点)/ Performance

针对「打开 App 即占满一个 CPU 核心、退到后台也持续高占用」的问题:

  • 🔋 后台自动降频:接入 ProcessLifecycleOwner 进程级前后台感知。应用一退到后台,所有采样协程立即暂停(仅前台检测服务 ProfileService 不受影响),CPU 占用趋近 0。
  • ⏱ 前台采样降频:进程列表刷新间隔由 500ms → 2s,系统 CPU 测量循环也加了显式间隔、不再忙等。有 Root 时不再每 500ms 拉起一次 su 全量扫 /proc。
  • 🧵 图标/元数据已在采样器内缓存,刷新不再反复查 PackageManager。

之前的根因:MainViewModel 里有两个 while(true) 死循环(viewModelScope 持有、与 Activity 生命周期解耦),即使退到后台也不停,且每 500ms 全量 su 扫描一次,导致单核持续 100%+。

构建产物 / Artifact

  • AppSlimAnalyzer-v0.5.8-release.apk(MD5: 67c0527afae190c4a5d7cdc68a1605cc)

使用 / Usage

  1. 手机开启「未知来源应用」安装权限,安装本 APK。
  2. 首次检测前在应用内「去开启使用情况访问」并授予权限。
  3. 打开任意应用详情页 → 点击「一键检测」。

See README (中文) / README_en for details.

AppSlim Analyzer v0.5.7

Choose a tag to compare

@Horizen5 Horizen5 released this 30 Jul 12:25

AppSlim Analyzer v0.5.7

本次更新 / What's new

  • 🐛 修复「一键检测」直接闪退:根因是 LensViewModel 用 getSystemService(PackageManager::class.java) 拿到 null 导致实例化即 NPE。已改为 app.packageManager / getSystemService(ACTIVITY_SERVICE),不再在目标 App 启动前崩溃。
  • 💥 崩溃日志:新增全局 UncaughtExceptionHandler,未捕获异常写入 files/crash/crash.log(含型号 / SDK / 品牌 / 堆栈),应用内「崩溃日志」按钮可查看、复制、清空。
  • 🔬 「一键检测」严格移植 APPLENS:前台 Service(ProfileService)+ PARTIAL_WAKE_LOCK,UsageStatsManager.queryEvents 读前台 Activity(兜底 dumpsys),每 500ms 采样一次、持续 10s(共 20 个点),CPU/内存走 top / dumpsys meminfo。规避 HyperOS 后台限制,不再闪退。
  • 📄 README 中英双语文档:新增「实现原理(检测用的是哪套代码)」与「构建方式」章节。

构建产物 / Artifact

  • AppSlimAnalyzer-v0.5.7-release.apk(MD5: 24c6fb117af284a1b9b102f3a4e42a24)

使用 / Usage

  1. 手机开启「未知来源应用」安装权限,安装本 APK。
  2. 首次检测前在应用内「去开启使用情况访问」并授予权限。
  3. 打开任意应用详情页 → 点击「一键检测」。

See README (中文) / README_en for details.