2013-05-20 70 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