Android--通过aapt和sh脚本批量导出包名和应用名称
首先获取 arm 版本的开发者工具. 这是别人编译好的可执行文件如果觉得不安全, 可以通过 apt 或者 AOSP 安装 arm 版本的 aapt
```bash
git clone https://github.com/JonForShort/android-tools.git
```
推送 arm64-v8a 的开发者工具到手机(老手机可能是 armeabi-v7a的, 请自行查询)
```bash
adb push ./android-tools/build/android-11.0.0_r33/aapt/arm64-v8a/bin/aapt /data/local/tmp
```
本地新建一个脚本 output_package_with_name.sh
其内容为:
```bash
#!/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
```
并推送到手机:
```bash
adb push ./output_package_with_name.sh /data/local/tmp
```
输入如下命令进行:
```bash
adb shell
cd /data/local/tmp
sh ./output_package_with_name.sh > ./packages.txt
```
退出 adb shell 执行以下命令下载到本地查看即可:
```bash
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:
```bash
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}` 以 包名+空格+应用名称 的形式打印出来
页:
[1]