如何查找依赖libmupdf.so原生库的组件并优化Android APK体积
定位libmupdf依赖来源
你可以直接排查列出的jar包快速定位来源:
- jar本质是zip压缩格式,你可以直接在jar存放目录搜索关键词
libmupdf,或是逐个解压jar查看是否存在lib/目录下的libmupdf.so/libmupdf_java.so文件,10分钟内就能找到具体引入so的依赖。 - 如果存在远程依赖,可执行
./gradlew app:dependencies命令输出全依赖树,查找mupdf相关的依赖节点即可。
现有方案优劣对比
方案1:exclude排除so文件
构建成功不代表无运行风险:
只有当你的全业务逻辑完全没有调用mupdf提供的PDF渲染相关能力时,排除so才不会引发问题。如果存在隐藏的业务场景用到了PDF相关功能,运行到对应场景时会直接抛出UnsatisfiedLinkError崩溃。如果排查后确认业务完全不需要使用PDF能力,排除so后做好全业务场景覆盖测试,确认没有异常即可使用。
方案2:仅保留arm64-v8a架构
当前国内安卓活跃设备中98%以上都支持arm64-v8a架构,如果你的应用最低适配Android 5.0及以上版本,且可以接受放弃极少量老旧armeabi/armeabi-v7a设备,该方案的稳定性最高,不会出现so缺失类崩溃,还能大幅缩减APK体积。如果你的应用需要覆盖全架构用户,该方案不适用。
推荐解决方案
- 先定位到引入mupdf的jar包:
- 如果确认该jar的功能你不需要用到PDF相关能力,直接排除对应so即可,排除后做好全业务场景测试,确认没有崩溃就可以上线。
- 如果该jar是必须依赖的组件且确实需要用到PDF能力,可以自行编译裁剪版的mupdf so,只保留你需要的功能,裁剪后的mupdf单架构so体积通常可以降到3MB以内,远小于当前的20MB。
- 如果你不需要兼容Android 4.x设备,也可以选择App Bundle格式发布,国内主流应用市场和Google Play都已支持该格式,应用市场会根据用户设备架构自动分发对应架构的so,用户下载的安装包体积会大幅降低,不需要你手动裁剪架构。
内容的提问来源于stack exchange,提问作者MohamedHarmoush
相关产品推荐
相关产品推荐

