2015-04-03 58 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$//')