我正在开发一个使用ADB Shell与Android设备进行交互的应用程序,我需要一种打印应用程序名称或标签的方法,可能是通过包名获取。
简而言之,我需要一种通过adb shell
获取用户安装的应用程序名称(例如“愤怒的小鸟v1.0.0”)的方法。
对此有何建议?感谢任何帮助。
adb shell pm list packages
将给你列出所有已安装包的名称列表。
然后可以使用dumpsys | grep -A18 "Package \[my.package\]"
来获取包的信息,如版本标识符等。
启动应用程序后,在命令提示符上输入以下命令:
adb shell dumpsys window windows | find "mCurrentFocus"
如果在Linux终端上执行命令,请将find替换为grep
mCurrentFocus
在 adb shell dumpsys window windows
的输出中不存在,因此查找或 grep 返回空。 - Ch Vasfind
,请使用grep
。 - Kamal Hossainadb shell dumpsys window windows | find "package"
- Artem Mostyaev如果你知道应用程序包的应用程序ID(例如org.mozilla.firefox),那么很容易。 首先获取应用程序ID的实际包文件的路径,
$ 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 魔法来获取标签。
adb shell pm list packages -f
然后过滤结果。 - Smeterlink#!/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
二进制文件。非常感谢jcomeau_ictx提供了从apk中提取应用程序标签信息以及直接从手机中拉取apk的方法! 但是我不得不对脚本进行几次修改:
while read line; do done
由于while循环内部的命令与stdin/stdout交互而导致中断,因此while循环只运行一次然后停止。正如While loop stops reading after the first line in Bash - the comment from cmo所讨论的那样,我使用了提供的解决方案,并将while循环切换为使用未使用的文件描述符号9。adb shell pm list packages -f
实在是太过冗长了,所以我将其更改为仅期望具有包列表的文件,并提供了一个从adb获取文件的示例。这里是同一脚本的另一个变体:
#!/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
sed --silent --regexp-extended "s/^application-label:'(.*)'$/\1/p"
这个怎么样?我认为这更容易理解(我的意思是单引号在明文中)。感谢您对脚本的改进。 - Andrei Korshikov这是我刚想出来的。它会出现一些错误,但对我的需求来说足够好了,可以将包名称与标签匹配。
它会将所有软件包的副本拉入$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
dumpsys package packages
的情况下要倾泻所有服务?此外,不需要使用 grep - dumpsys package 支持按包名称过滤。 - Alex P.aapt d badging
的信息,其中我可以获取像application-label: ES File Explorer
和versionName='1.6.2.5'
这样的信息。 有没有什么东西可以通过 shell 给我这些信息? - hamsteyrdumpsys
没有输出任何与“Package [package.name]”匹配或附近的文本,以帮助确定应用程序的标签。dumpsys package
列出了appLabel,但仅适用于少数应用程序(“BusyBox Pro”,“BusyBox”和“ ES File Manager”是我得到的5个左右)。有其他解决方案吗? - Michael Hoffmanndumpsys | grep -A18 "Package \[my.package\]"
中无法找到 com.akh.livestream 包的完整应用程序名称。请注意,我会尽力使翻译更加通俗易懂,但不改变原文的意思。 - SebMa