通过 ADB Shell 或终端获取应用程序名称/标签

新手上路,请多包涵

我正在开发一个使用 ADB Shell 与 android 设备交互的应用程序,我需要某种方式打印出应用程序的应用程序名称或标签,可能是它们的包名称。

简而言之,我需要一种通过 adb shell 为用户安装的应用程序获取应用程序名称(即“愤怒的小鸟 v1.0.0”)的方法。

对此事有任何启示吗?对此的任何帮助表示赞赏。

原文由 hamsteyr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 858
1 个回答

因此,我非常感谢 jcomeau_ictx 提供了有关如何从 apk 中提取应用程序标签信息以及直接从手机中提取 apk 的想法的信息!但是,我必须对其进行一些更改才能自行编写脚本:

  1. while read line; do done 由于 while 循环中的命令与 stdin/stdout 交互而中断,因此 while 循环只运行一次然后停止,正如 在 Bash 中的第一行之后的 While 循环停止读取 中所讨论的那样 - 来自 cmo 的评论 我使用了提供的解决方案并切换了 while 循环以使用未使用的文件描述符编号 9。
  2. 脚本真正需要的只是一个包名,而 adb shell pm list packages -f 实在是太过分了,所以我将其更改为只包含包列表的文件,并提供了如何从 adb 获取文件的示例。
  3. jcomeau_ictx 脚本变体没有考虑到某些软件包可能有多个与之关联的 apk,这会破坏脚本。
  4. 最少也是最后一点,我让每个变量都以下划线开头,这只是为了更容易阅读脚本。

所以这里是同一脚本的另一个变体:

 #!/bin/bash
_TOOLS=/opt/android-sdk-update-manager/build-tools/29.0.3
_AAPT=${_TOOLS}/aapt
#adb shell pm list packages --user 0 | sed -e 's|^package:||' | sort >./packages_list.txt
_PMLIST=packages_list.txt
rm ./packages_list_with_names.txt
_TEMP=$(echo $(adb shell mktemp -d -p /data/local/tmp) | sed 's/\r//')
mkdir -p packages
[ -f ${_PMLIST} ] || eval $(echo $(basename ${_PMLIST}) | tr '_' ' ') > ${_PMLIST}
while read -u 9 _line; do
    _package=${_line##*:}
    _apkpath=$(adb shell pm path ${_package} | sed -e 's|^package:||' | head -n 1)
    _apkfilename=$(basename "${_apkpath}")
    adb shell cp -f ${_apkpath} ${_TEMP}/copy.apk
    adb pull ${_TEMP}/copy.apk ./packages
    _name=$(${_AAPT} dump badging ./packages/copy.apk | sed -n 's|^application-label:\(.\)\(.*\)\1$|\2|p' )
#'
    echo "${_package} - ${_name}" >>./packages_list_with_names.txt
done 9< ${_PMLIST}
adb shell rm -rf $TEMP

原文由 hash 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题