我正在开发一个使用 ADB Shell 与 android 设备交互的应用程序,我需要某种方式打印出应用程序的应用程序名称或标签,可能是它们的包名称。
简而言之,我需要一种通过adb shell
.
对此事有任何启示吗?对此的任何帮助表示赞赏。
adb shell pm list packages
将为您提供所有已安装软件包名称的列表。
然后,您可以使用dumpsys | grep -A18 "Package \[my.package\]"
获取包信息,例如版本标识符等
启动应用程序后,只需在命令提示符下输入以下命令:
adb shell dumpsys window windows | find "mCurrentFocus"
如果在 linux 终端上执行命令,用 grep 替换 find
如果你知道包的 app id(比如 org.mozilla.firefox),这很容易。首先获取appId的实际包文件路径,
$ adb shell pm list packages -f com.google.android.apps.inbox
package:/data/app/com.google.android.apps.inbox-1/base.apk=com.google.android.apps.inbox
现在你可以做一些 grep|sed 魔术来提取路径:/data/app/com.google.android.apps.inbox-1/base.apk
在那个 aapt 工具派上用场之后:
$ adb shell aapt dump badging /data/app/com.google.android.apps.inbox-1/base.apk
...
application-label:'Inbox'
application-label-hi:'Inbox'
application-label-ru:'Inbox'
...
再次使用一些 grep 魔法来获取标签。
完成此任务的 shell 脚本:
#!/bin/bash
# Remove whitespace
function remWS {
if [ -z "${1}" ]; then
cat | tr -d '[:space:]'
else
echo "${1}" | tr -d '[:space:]'
fi
}
for pkg in $(adb shell pm list packages -3 | cut -d':' -f2); do
apk_loc="$(adb shell pm path $(remWS $pkg) | cut -d':' -f2 | remWS)"
apk_name="$(adb shell aapt dump badging $apk_loc | pcregrep -o1 $'application-label:\'(.+)\'' | remWS)"
apk_info="$(adb shell aapt dump badging $apk_loc | pcregrep -o1 '\b(package: .+)')"
echo "$apk_name v$(echo $apk_info | pcregrep -io1 -e $'\\bversionName=\'(.+?)\'')"
done
为了找到应用程序的名称(应用程序标签),您需要执行以下操作:(
如其他答案所示)
aapt
命令,找到应用标签。但是设备不附带aapt
开箱即用的二进制文件。
所以你需要先安装它。你可以从这里下载它:
https ://github.com/Calsign/APDE/tree/master/APDE/src/main/assets/aapt-binaries
查看本指南以获取完整步骤:
如何通过 ADB Android 使用包名称查找应用名称?
(免责声明:我是该博客文章的作者)
这就是我刚刚想到的。它给出了一些错误,但足以满足我的需要,将包名称与标签匹配。
它将所有包的副本提取到 $PWD 的子目录中,所以如果存储是一个问题,请记住这一点。
#!/bin/bash
TOOLS=~/Downloads/adt-bundle-linux-x86_64-20130717/sdk/build-tools/19.1.0
AAPT=$TOOLS/aapt
PMLIST=adb_shell_pm_list_packages_-f.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 line; do
package=${line##*:}
apk=${package%%=*}
name=${package#*=}
copy=packages$apk
mkdir -p $(dirname $copy)
if [ ! -s $copy ]; then # copy it because `adb pull` doesn't see /mnt/expand/
adb shell cp -f $apk $TEMP/copy.apk
adb pull $TEMP/copy.apk $copy
fi
label=$($AAPT dump badging $copy || echo ERROR in $copy >&2 | \
sed -n 's/^application-label:\(.\)\(.*\)\1$/\2/p')
echo $name:$label
done < <(sed 's/\r//' $PMLIST)
adb shell rm -rf $TEMP