【问题标题】:Get Application Name/ Label via ADB Shell or Terminal通过 ADB Shell 或终端获取应用程序名称/标签
【发布时间】:2013-05-15 02:01:49
【问题描述】:

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

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

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

【问题讨论】:

    标签: android shell label adb


    【解决方案1】:

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

    它将所有包的副本提取到 $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
    

    【讨论】:

      【解决方案2】:

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

      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?
      免责声明:我是那篇博文的作者)

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这只是打印带有“v”的空行
        【解决方案4】:

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

        adb shell dumpsys window windows | find "mCurrentFocus"
        

        如果在linux终端执行命令,用grep替换find

        【讨论】:

        • 变量mCurrentFocusadb shell dumpsys window windows的输出中不存在所以find或grep什么都不返回
        • 我用"topApp"代替"mCurrentFocus"
        • 如果find 在上述解决方案中不起作用,请使用grep
        • 我觉得这个有用:adb shell dumpsys window windows | find "package"
        【解决方案5】:

        如果你知道包的 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 魔法来获取标签。

        【讨论】:

        • 最后一个命令不起作用,因为 aapt 仅在您的开发人员机器上。您需要先从设备中提取 apk。
        • 即使你在本地机器上使用它,“-f”后面的参数就像一个通配符,所以如果有多个包包含该字符串,它会显示多个包。最好的方法是:adb shell pm list packages -f,然后过滤掉结果。
        【解决方案6】:

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

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

        【讨论】:

        • 当您只需要dumpsys package packages 时,为什么要转储所有服务?也不需要 grep - dumpsys 包支持按包名过滤
        • 如上所述,我设法让上面的代码转储包信息,但是它没有给我我正在寻找的数据。我指的是类似于aapt d badging 的东西,在那里我会得到application-label: ES File ExplorerversionName='1.6.2.5' 之类的信息。有什么东西可以通过shell给我这些信息吗?
        • @hamsteyr 同时取得了成功吗?如果是这样:您可以回答自己的问题。如果您的解决方案有效(目前正在寻找相同的解决方案),我肯定会投赞成票;)
        • 这个答案不起作用。 dumpsys 不会输出任何匹配的文本或附近的“Package [package.name]”来帮助确定应用程序的标签。 appLabel 由dumpsys package 列出,但仅适用于少数应用程序(“BusyBox Pro”、“BusyBox”和“ES 文件管理器”是我得到的 5ish 中的一些)。有人有其他解决方案吗?
        • @o0rebelious0o 无法从您的dumpsys | grep -A18 "Package \[my.package\]" 中找到com.akh.livestream 包的完整应用程序名称
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 2017-04-24
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多