如何从android设备获取apk文件?或者如何将apk文件从设备传输到系统?
当前回答
还有另一个bash脚本(即可以用于大多数基于unix的系统)。基于佩德罗·罗德里格斯的回答,但更容易使用。
对佩德罗版本的改进:
Original approach did not work for me on Android 7: adb pull kept complaining about no such file or directory while adb shell could access the file. Hence I used different approach, with temporary file. When launched with no arguments, my script will just list all available packages. When partial package name is provided, it will try to guess the full package name. It will complain if there are several possible expansions. I don't hardcode destination path; instead APKs are saved to current working directory.
保存到一个可执行文件:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
其他回答
这些建议对我都不起作用,因为Android在包名后面附加了一个序列号来生成最终的APK文件名。在最新版本的Android (Oreo和Pie)上,会追加一个不可预测的随机字符串。下面的命令序列是我在非root设备上使用的:
1)确定应用程序的包名。“com.example.someapp”。如果存在以下情况,请跳过此步骤 您已经知道包的名称。
adb shell pm list packages
查看包名列表,并尝试在有问题的应用程序和包名之间找到匹配项。这通常很简单,但请注意,包的名称可以与应用程序的名称完全无关。如果您无法从包名列表中识别该应用程序,请尝试使用浏览器在谷歌Play中找到该应用程序。谷歌Play中应用程序的URL包含包名。
2)获取所需包的APK文件的完整路径名称。
adb shell pm path com.example.someapp
输出看起来像这样 包:/数据/应用/ com.example.someapp apk——2. 或 包:/数据/ app / com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ = = / base.apk
3)使用步骤2中的完整路径名称,将APK文件从Android设备拉到开发箱中。
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
试试这个bash命令来备份你所有的应用程序:
for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done
这个命令来自于Firelord的脚本。我只是将所有apks重命名为它们的包名,以解决elcuco的脚本问题,即相同的base.apk文件被覆盖在Android 6.0“棉花糖”及以上。
注意,这个命令只备份第三方应用,因为我不认为备份内置应用有什么意义。但如果你也想备份系统应用程序,只需省略-3选项。
我已经见过很多解决这个问题的方法,要么你必须在你的手机上安装根程序,要么你必须安装一个应用程序。然后在谷歌搜索了很多之后,我找到了这个解决方案,适用于非根/根手机。
列出你目前获得的应用程序。
adb shell pm list packages
然后你可以选择一个应用程序,比如twitter
adb backup -apk com.twitter.android
这里很重要的一点是不要为加密备份设置密码
这将创建一个名为backup的文件。Ap,但你还是打不开。为此,您必须再次提取它,但使用dd命令。
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
在此之后,你所要做的就是提取焦油含量,这就完成了。
希望这对你们有用
打开你想从你的手机上提取apk的应用程序。 获取当前打开的应用程序: adb shell dump活动活动| grep mFocusedActivity 获取包名的路径 Adb shell PM path <packagename.apk>
4.将您获得的路径复制到sdcard目录
adb shell cp /data/app/<packagename.apk> /sdcard
5.拉apk
adb pull /sdcard/base.apk
Edit
如果第2步不起作用,使用以下方法:
adb shell dumpsys window windows | grep mCurrentFocus
还有另一个bash脚本(即可以用于大多数基于unix的系统)。基于佩德罗·罗德里格斯的回答,但更容易使用。
对佩德罗版本的改进:
Original approach did not work for me on Android 7: adb pull kept complaining about no such file or directory while adb shell could access the file. Hence I used different approach, with temporary file. When launched with no arguments, my script will just list all available packages. When partial package name is provided, it will try to guess the full package name. It will complain if there are several possible expansions. I don't hardcode destination path; instead APKs are saved to current working directory.
保存到一个可执行文件:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""
推荐文章
- ImageView -有高度匹配宽度?
- 如何确定在android文件的MIME类型?
- 这是在Android中获取用户位置的好方法
- Android从左到右幻灯片动画
- 如何检索视图的维度?
- 如何改变菜单项的文本颜色在安卓?
- Android选择器和文本颜色
- 视图绑定-我如何获得包含布局的绑定?
- 在Android Studio中改变矢量资产的填充颜色
- 在构建中编写注释的语法是什么?gradle文件?
- 如何以编程方式添加按钮色调
- 用Android Studio进行调试永远停留在“等待调试器”状态
- Openssl不被视为内部或外部命令
- 无法执行dex:在Eclipse中超过GC开销限制
- 如何以编程方式将视图添加到视图