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

时间:2013-05-20 13:36:22

标签: android shell label adb

我正在开发一个使用ADB Shell与Android设备接口的应用程序,我需要一些打印应用程序名称或应用程序标签的方法,可能是它们的包名。

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

对此事有何看法?任何帮助都表示赞赏。

7 个答案:

答案 0 :(得分:65)

adb shell pm list packages将为您提供所有已安装软件包名称的列表。

然后,您可以使用dumpsys | grep -A18 "Package \[my.package\]"获取包信息,例如版本标识符等

答案 1 :(得分:19)

启动应用程序后,只需在命令提示符下输入以下命令:

adb shell dumpsys window windows | find "mCurrentFocus"

如果在linux终端上执行命令,请用grep

替换find

答案 2 :(得分:7)

如果你知道包的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 magic来提取路径:/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魔法。

答案 3 :(得分:2)

完成此任务的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

答案 4 :(得分:0)

APK#可以做到:

  

在任何Android上快速查看有关APK的完整详细信息   设备/仿真器   enter image description here

答案 5 :(得分:0)

要查找应用程序的名称(应用程序标签),您需要执行以下操作:
(如其他答案所示)

  1. 找到要查找其名称的应用的APK路径。
  2. 使用aapt命令,找到应用标签。

但是设备不附带开箱即用的aapt二进制文件。
因此,您将需要先安装它。您可以从这里下载:
https://github.com/Calsign/APDE/tree/master/APDE/src/main/assets/aapt-binaries


查看本指南以获取完整步骤:
How to find an app name using package name through ADB Android?
免责声明:我是该博客文章的作者)

答案 6 :(得分:0)

这是我刚刚想到的。它给出了一些错误,但足以满足我的需要,将包名与标签相匹配。

它将所有软件包的副本拉入 $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