首先获取 arm 版本的开发者工具. 这是别人编译好的可执行文件
如果觉得不安全, 可以通过 apt 或者 AOSP 安装 arm 版本的 aapt
git clone https://github.com/JonForShort/android-tools.git
推送 arm64-v8a 的开发者工具到手机(老手机可能是 armeabi-v7a的, 请自行查询)
adb push ./android-tools/build/android-11.0.0_r33/aapt/arm64-v8a/bin/aapt /data/local/tmp
本地新建一个脚本 output_package_with_name.sh
其内容为:
#!/system/bin/sh
for pkg in $(pm list packages -3 | cut -d':' -f2); do
pkg_loc=$(pm list packages -f ${pkg} | awk -F: '{print $2}' | awk -F .apk\= '{printf "%s.apk\n", $1}')
pkg_info=$(./aapt dump badging ${pkg_loc} 2>>/data/local/tmp/error.output | grep "application-label:" | awk -F\' '{print $2}' )
echo ${pkg} ${pkg_info}
done
并推送到手机:
adb push ./output_package_with_name.sh /data/local/tmp
输入如下命令进行:
adb shell
cd /data/local/tmp
sh ./output_package_with_name.sh > ./packages.txt
退出 adb shell 执行以下命令下载到本地查看即可:
adb pull /data/local/tmp/packages.txt ./
分隔线下面是原理讲解
主要是通过 pm list packages -3
来导出所有第三方包的包名
如果需要所有的包, 也就是需要包含系统包, 可使用 pm list package
然后使用 pm list packages -f
来找出包的 base.apk 的所在位置.
然后使用 aapt dump badging
来分析这个 base.apk
由于aapt里面存在诸如以下的 error:
AndroidManifest.xml:XXX: error: ERROR getting 'android:icon' attribute: attribute value reference does not exist
鉴于没有到 /dev/null
的访问权限, 所以脚本中使用了 2>>/data/local/tmp/error.output
将 Error 输出到另一个位置。
提示 2 是指 STDERR, 1 是指 STDOUT
过后可以将 error.output 删除
最后通过 echo ${pkg} ${pkg_info}
以 包名+空格+应用名称 的形式打印出来