Skip to content

fix(apktool): reduce runtime memory pressure - #1038

Closed
3316891527 wants to merge 1 commit into
AAswordman:devfrom
3316891527:feat/apktool-memory-optimization-pr
Closed

3316891527 wants to merge 1 commit into
AAswordman:devfrom
3316891527:feat/apktool-memory-optimization-pr

Conversation

@3316891527

@3316891527 3316891527 commented Aug 25, 2026 •

Copy link
Copy Markdown
Contributor

变更说明

背景与动机

当前 APKTool/JADX 等逆向工具与宿主应用运行在同一进程。在 Android 进程的 Java 堆上限固定(通常为 512MB)的前提下,主应用需要为 UI、聊天数据、模型等核心功能预留内存。逆向工具作为同进程内的附加任务,仅能使用堆中的剩余空间,可用余量有限。与此同时:

  • 每次调用 helper 都会生成新的 ClassLoader 实例,导致长期累积;
  • 资源导出和 native 搜索会产生额外的完整字节数组;
  • 并行解码线程可能进一步放大内存峰值。

这些因素叠加后,即使 APK 体积不大,也可能触发 OOM。

本 PR 聚焦于降低当前同进程实现下的内存峰值和长期累积压力。
本 PR 不涉及独立 :apk_reverse 进程或 IPC 架构,进程隔离属于后续独立改动。


改动范围

  • 复用 ClassLoader 缓存
    将 helper runtime 的输出文件名从“每次调用递增”改为“稳定的后端槽位”:APKTool decode/build 共用槽位,JADX 使用独立槽位,其他 helper 调用使用通用槽位,以命中宿主 JsExternalJavaCodeLoader 的路径缓存,避免每次调用都创建新的 DexClassLoader 实例。

  • 限制并行度与结果集
    将 APKTool 默认 jobs 限制为 1,避免多线程解码带来的内存峰值。同时,在 JavaScript 与 helper Java 边界将搜索结果限制为最多 1000 条,防止超大结果集撑爆内存。

  • 资源导出改为流式复制
    将 ToolPkg JAR 资源从 readBytes() + 一次性写入改为流式复制,避免复制 JADX 等大资源时产生额外的完整字节数组。

  • native 搜索改为流式扫描
    将 helper 的目录 native 字符串搜索改为 InputStream 流式扫描,避免将整个 .so 文件一次性载入堆内存。

  • 裁剪 JADX Android runtime
    从 Android JADX runtime 中移除当前 APK-only 工具不需要的 apkm、smali、xapk 等输入插件,并重新生成 APKTool、JADX 和 helper 三份 dex-JAR。

  • 同步构建产物
    同步修改 examples/apktool/src/packages/apk_reverse.ts 与实际运行的 dist/packages/apk_reverse.js。


兼容性与风险

  • 保持现有 ToolPkg 资源接口、APKTool/JADX/helper 调用方式和结果结构不变,对外行为无变化。
  • 稳定 helper 路径后,依赖宿主 JsExternalJavaCodeLoader 的路径缓存行为;若缓存未命中,可能退化为新建 ClassLoader,但不会影响功能,只会略微增加内存压力。需要在 Android 设备上确认实际 classloader 兼容性。
  • 本次仅将 native 字符串搜索改为流式;native symbol、offset 和 hex bytes 等解析路径仍保留现有的完整二进制解析逻辑,后续可进一步优化。
  • 当前改动仍运行在宿主进程内,不能替代独立进程隔离,进程隔离请等待后续架构改动。

验证方式

  • git diff --check target/development...HEAD:PASS。
  • node --check examples/apktool/dist/packages/apk_reverse.js:PASS。
  • runtime_helper Gradle test:PASS。
  • runtime_helper Gradle runtimeFatJar:PASS。
  • 使用等价 Linux D8/JAR 流程重新生成三份 Android runtime;三份 JAR 均包含 dex 且不包含 JVM .class 条目:PASS。
  • Android 设备功能、PSS/Java heap、重复 classloader 加载和 OOM 验证:尚未完成。
  • 完整 :app:assembleDebug 当前被环境问题阻塞:SDK aidl 在当前 Linux/proot 环境无法启动;资源任务还依赖当前环境缺失的 STT 下载、liboperit_ripgrep.so 和 ffmpeg-kit-local.aar。这些阻塞未被标记为通过。

检查清单

  • 基于目标分支 development。
  • PR 只包含 apktool/runtime 内存优化相关的 8 个文件。
  • 源码与生成版 apk_reverse.js 已同步。
  • 三份 Android dex-JAR 已重新生成并完成结构检查。
  • 未混入翻译功能或其他无关提交。
  • Android 真机功能和内存验证待补充。
  • 独立 :apk_reverse 进程与 IPC 不属于本 PR。

@3316891527 3316891527 closed this Aug 30, 2026
@3316891527
3316891527 deleted the feat/apktool-memory-optimization-pr branch August 31, 2026 07:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant