使用aapt dump badging获取低版本SDK应用图标遇阻,求解决方案
我之前也踩过这个坑!Android 8引入自适应图标后,aapt dump badging确实会默认优先输出mipmap-anydpi-v26里的XML配置,完全忽略了低版本的PNG图标,而且你试的--max-res-version 25没效果也不是操作错了,是这个参数的逻辑和我们预期的不一样。下面给你几个可行的解决方案:
方法一:用aapt2 dump resources精准定位低版本图标
aapt2比旧版aapt在资源查询上更灵活,你可以直接指定资源类型、密度限定符来过滤出低版本的PNG图标:
比如要获取hdpi密度的启动图标,执行:
aapt2 dump resources your_app.apk --package com.your.app.package --type mipmap --density hdpi
在输出结果里,找到名称为ic_launcher(或者你的应用图标实际名称)的条目,里面会显示对应的资源文件路径,类似这样:
resource mipmap/ic_launcher: flags=0x00000000
config: hdpi
sourceFile: res/mipmap-hdpi-v4/ic_launcher.png
这样你就能直接定位到低版本的PNG图标资源了。如果要找其他密度的图标,把--density hdpi换成mdpi、xhdpi等即可。
方法二:直接解压APK提取图标(简单粗暴)
如果不想折腾命令行,直接用解压工具(比如unzip或者7-Zip)把APK解压,然后进入res目录,找mipmap-xxxhdpi、mipmap-xxhdpi等不带-v26后缀的文件夹,里面的ic_launcher.png就是低版本SDK对应的图标。
补充:为什么--max-res-version 25没用?
这个参数是用来过滤带有SDK版本限定符的资源(比如res/mipmap-hdpi-v26),但低版本的PNG图标通常放在res/mipmap-hdpi(不带版本后缀)里,而自适应图标的XML在res/mipmap-anydpi-v26——理论上--max-res-version 25应该排除它,但实际aapt dump badging在输出时,还是会优先选择自适应图标的配置,哪怕你指定了版本限制,这算是aapt的一个小坑。
内容的提问来源于stack exchange,提问作者John Doe

