Diffoscope
- 📦 可对比两个 APK 文件的每个组成部分(DEX、XML、图片资源、so、assets)
- 能输出详细差异报告,适合用来检测是否足够差异化
支持递归解包 APK 内容,比普通 diff 更强大。
安装
你在 mac 上通过:
bash
brew install diffoscope
✅ 一、确认安装成功
运行:
bash
diffoscope --version
如果输出版本号,比如:
bash
diffoscope 263
表示安装成功。
✅ 二、基本用法:对比两个 APK
假设你有两个 Flutter 编译产物:
build1.apk
build2.apk
命令一:输出纯文本到终端
bash
diffoscope build1.apk build2.apk
会直接在终端显示详细的对比内容。
命令二:输出为 HTML 文件(推荐)
bash
diffoscope --html diff_report.html build1.apk build2.apk
然后打开生成的 diff_report.html
文件查看差异。
命令三:输出为简化报告(限制大小)
bash
diffoscope --html diff_report.html --max-report-size=10m build1.apk build2.apk
有时候对比结果特别大,这个参数可以限制报告大小。
✅ 三、输出示例效果(你会看到)
AndroidManifest.xml
:包名是否不同classes.dex
:代码逻辑变化assets/*
:是否有新增/改动文件lib/arm64-v8a/libapp.so
:是否重新混淆res/values/strings.xml
:是否改了 app name 等 UI 文案
每一项都会列出 "相同/不同内容",支持二进制 diff。
✅ 四、可选技巧
操作 | 命令 |
---|---|
解包 APK 手动查看 | unzip myapp.apk -d output_dir |
只对比 assets 目录 | diffoscope assets1/ assets2/ |
只对比 so 文件 | diffoscope libapp1.so libapp2.so |
✅ 五、配合 Flutter 混淆使用建议
如果你在用 Flutter 构建 release 包建议加上:
bash
flutter build apk \
--release \
--obfuscate \
--split-debug-info=build/symbols
这样生成的 libapp.so
文件是混淆过的,对比时差异明显,利于过shen。