mutex 发表于 2023-11-18 10:12

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]
查看完整版本: Android--通过aapt和sh脚本批量导出包名和应用名称