2013-05-20 48 views
33

我开发使用亚行外壳采用Android设备到接口的应用程序,我需要打印出的应用程序名称或应用程序的标签的一些方法,也许由于其包名称。获取应用程序名称/标签或终端

总之,我需要通过adb shell获取应用程序的名称(如“愤怒的小鸟V1.0.0”)为用户安装的应用程序的方式。

对此事的任何轻?任何帮助表示赞赏。

回答

54

adb shell pm list packages会给你所有已安装的软件包名称的列表。

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

+7

当你只需要'dumpsys软件包'时,为什么要转储所有服务?也不需要grep - dumpsys包支持按包名过滤 –

+0

我知道那个命令,当然,这是一个开始,给我所有安装的应用程序的包名称。 我使用dumpsys,但不是很成功,让我相信,我可以不使用它的权利审判。它只适用于运行应用程序吗?或者它是否也适用于尚未启动的程序。 另外,我是否可以获得一个使用示例以防万一?非常感谢您的帮助。 – hamsteyr

+10

按照上面的说法,我设法让上面的代码能够处理包信息,但是它没有提供我正在查找的数据。我指的是类似于'aapt d badging'的地方,我会得到像'application-label:ES File Explorer'和'versionName ='1.6.2.5''这样的信息。有什么可以通过shell给我这些信息吗? – hamsteyr

4

如果你知道软件包(如org.mozilla.firefox)的应用程序ID,很容易。 率先拿到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的魔力,以获取标签。

+4

最后一个命令不起作用,因为aapt只在你的开发者机器上。你需要先从设备上取得apk。 – Six

+0

即使你在本地机器上使用它,“-f”后面的参数就像通配符一样,所以如果有多个包含该字符串的包,它将显示多个包。最好的办法是: 'adb shell pm list packages -f'然后过滤掉结果。 – Smeterlink

+0

@Six,我的手机上有'aapt',所以它仍然有效 – smac89

4

只需输入上的命令提示符运行以下命令启动应用后:

adb shell dumpsys window windows | find "mCurrentFocus" 

如果执行Linux终端上的命令替换用grep的

1

一个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