2015-04-03 57 views
2

我試圖從我的android手機中導出所有apks(rooted)。adb不能在bash中使用變量

我已將所有使用adb shell pm list的軟件包轉儲到文件中。

 
com.google.android.ears 
com.android.voicedialer 
... 

現在我想下載它們,但它不工作:

#!/bin/bash 

while read line; do 
     echo "Name: $line" 
     # get package path 
     p=$(adb shell pm path $line); 
     # remove package: prefix 
     p=$(echo $p | grep -Po "(?<=package:).*" | xargs) 
     echo "Path: $p" 
     # download it 
     adb pull $p 
done; 

我得到的東西是這樣的:

 
Name: com.google.android.ears 
Path: /system/app/GoogleEars.apk 
' does not exist/system/app/GoogleEars.apk 
Name: com.android.voicedialer 
Path: /system/priv-app/VoiceDialer.apk 
' does not exist/system/priv-app/VoiceDialer.apk 
Name: com.android.defcontainer 
^C 

當我做手工的終端,它工作得很好。

爲什麼它不起作用?

+0

這行'p = $(echo $ p | grep -Po「(?<= package:)。*」| xargs)'對我來說看起來最可疑。該行之前的$ p的值是多少?另外,引用你的變量總是一個好主意。 – 2015-04-03 11:32:27

+0

查看輸出,在該行之後路徑是應該的。 – MightyPork 2015-04-03 11:53:37

+0

如果你這麼說,但很明顯有一些微妙的事情發生 - 你是說如果你只是做'adb pull com.google.android.ears',那麼這是有效的?順便說一句,我認爲'p = $(awk -F:'/ package/{print $ 2}'<<<「$ p」)'會是一個更簡單的選擇。 – 2015-04-03 12:03:33

回答

0

正如評論中指出的那樣,adb命令以\r結尾。你必須從這一行的東西,如

p=$(adb shell pm path $line | tr -d '\r') 

我看到另一個問題,刪除它,太

p=$(adb shell pm path $line) 

:許多APK就會被改寫爲base.apk

Name: com.google.android.youtube 
Path: /data/app/com.google.android.youtube-1/base.apk 
Name: net.mx17.overridedns 
Path: /data/app/net.mx17.overridedns-2/base.apk 
Name: com.android.email 
Path: /system/app/Email/Email.apk 

所以我覺得我'd用類似

#!/bin/bash 

while read line; do 
    echo "Name: $line" 
    # get package path 
    p=$(adb shell pm path $line | sed 's/^package://;s/\r$//') 
    echo "Path: $p" 
    # get package name 
    name=$(echo $p | awk -F/ '{print $(NF-1)}') 
    echo "Package name: $name" 
    # download it 
    adb pull $p ${name}.apk 
done < <(adb shell pm list packages | sed 's/^package://;s/\r$//')