如何从Android设备上获取apk文件?
我如何从Android设备获取apk文件? 或者我如何将apk文件从设备传输到系统?
使用adb 。 借助adb pull,您可以将设备上的文件从设备上复制到系统中。
当然,你也需要正确的权限来访问你的文件所在的目录。如果没有,你需要首先对设备进行根目录。
这些build议都不适用于我,因为Android会在程序包名称后面附加一个序列号以产生最终的APK文件名(这可能会因Android OS的版本而异)。 下面的命令序列是在非根设备上为我工作的:
1)确定应用程序的包名称,例如“com.example.someapp”。 如果您已经知道包名称,请跳过此步骤。
adb shell pm list packages
查看软件包名称列表,并尝试查找相关应用程序与软件包名称之间的匹配。 这通常很容易,但是请注意,软件包名称可能与应用程序名称完全无关。 如果您无法从软件包名称列表中识别该应用,请尝试使用浏览器在Google Play中查找该应用。 Google Play中应用的url包含软件包名称。
2)获取所需包的APK文件的完整path名。
adb shell pm path com.example.someapp
输出结果如下所示: package:/data/app/com.example.someapp-2.apk
3)将APK文件从Android设备拉到开发盒。
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
不需要根:
此代码将获得名称的第三方包path,以便您可以轻松识别您的APK
adb shell pm list packages -f -3
输出将是
包:/data/app/XX.XX.XX.apk=YY.YY.YY
现在使用下面的代码拉该包:
adb pull /data/app/XX.XX.XX.apk
如果你在C:>\
执行了上面的cmd,那么你会在那里find那个包。
我已经看到了这个问题的很多解决scheme,要么你必须根植你的手机,或者你必须安装一个应用程序。 然后,经过大量的search,我得到了这个解决scheme,为非rooted / rooted电话。
列出到目前为止你所得到的应用程序。
adb shell pm list packages
然后你可以select一个应用程序,例如twitter
adb backup -apk com.twitter.android
这里一个重要的事情是不要设置密码来encryption您的备份
这将创build一个名为backup.ap的文件,但仍然无法打开它。 为此,你必须再次提取,但使用dd命令。
dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
在这之后,你所要做的就是提取焦油含量,并完成。
希望它适合你们
完成@Yojimbo的回答,这就是我所做的(只有Linux / Mac,不能在Windows上使用,也许在git的bash shell中):
for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done
这是丑陋的bash,但工作:)
编辑:它不再在AndroidM上工作:所有文件被命名为“base.apk”在另一个目录下。 应该是“微不足道”来解决。
如上所述,您可以使用adb中的pull命令获取apk。
因为,你正在谈论你安装的应用程序,所以继续看看你的Android文件系统的/ data / app目录。 你会在那里findAPK的。
然后使用adb命令 – adb pull /data/data/appname.apk
如果您知道(或者如果您可以“猜测”) .apk
的path(它似乎是/data/app/com.example.someapp-{1,2,..}.apk
的格式,则你也可以从/data/app
复制它,甚至可以在我的非固定股票Android手机上工作。
只需使用terminal模拟器应用程序(如这个 ),然后运行:
# step 1: confirm path ls /data/app/com.example.someapp-1.apk # if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here. # step 2: copy (make sure you adapt the path to match what you discovered above) cp /data/app/com.example.someapp-1.apk /mnt/sdcard/
然后你可以将它从SD卡移动到任何你想要的地方(或附加到电子邮件等)。 最后一点可能在技术上是可选的,但是当试图用.apk
文件做一些事时,它会让你的生活变得更容易。
在Unix系统上,你可以试试这个function:
function android_pull_apk() { if [ -z "$1" ]; then echo "You must pass a package to this function!" echo "Ex.: android_pull_apk \"com.android.contacts\"" return 1 fi if [ -z "$(adb shell pm list packages | grep $1)" ]; then echo "You are typed a invalid package!" return 1 fi apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`" apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`" destination="$HOME/Documents/Android/APKs" mkdir -p "$destination" adb pull ${apk_path} ${destination} echo -e "\nAPK saved in \"$destination/$apk_name\"" }
- 例如 :
android_pull_apk com.android.contacts
- 注意 :要标识包:
adb shell pm list packages
这里列出的程序不适用于Android 7(Nougat)[也可能是Android 6,但我无法validation]。 你不能直接拉牛奶中的.apk文件(除非在root模式下,但需要一个扎根的手机)。 但是,您可以使用adb shell将.apk复制到手机上的备用path(如/ sdcard / Download),然后您可以从备用path执行adb pull。
以下是你如何做到这一点:
在您的设备中下载并安装APK Extractor。 它是免费的,几乎所有的Android设备都兼容。 另一个重点是它甚至不需要root或任何东西的工作。 安装完成后,启动它。 在那里您会看到设备中的应用程序列表,其中包括您之后安装的应用程序以及系统应用程序。 长按任何要提取的应用程序(您可以一次select多个或全部应用程序),然后单击您在顶部看到的提取选项。 您也可以select通过蓝牙或消息进行分享。 完成后,您将看到解压缩的应用程序为AppName_AppPackage_AppVersionName_AppVersionCode.apk,默认情况下,该应用程序将保存在path/ sdcard / ExtractedApks中。
有关如何在android中提取apk文件的详细说明,请访问: http : //appslova.com/how-to-extract-apk-files-in-android/
所有这些答案需要从设备检索的每个apk文件的多个步骤。 1.确定包名,2.find文件,并3.下载它。 我构build了一个简单的apk_grabber
python脚本来为任何匹配给定正则expression式的应用程序执行此操作,然后将这些apks反编译成jar文件。
我没有使用代码来从手机拉.apk文件,但我一直在使用软件来提取.apk文件从手机和我已经使用的软件下面与谷歌播放链接:
- ES文件浏览器文件pipe理器
- ASTRO云和文件pipe理器 3. 软件数据线
希望它可以帮助你。
还有一个bash脚本(即可以用于大多数基于Unix的系统)。 基于佩德罗罗德里格斯的答案 ,但稍微更容易使用。
佩德罗版本的改进:
- 原来的方法不适合我在Android 7上:
adb pull
不断抱怨no such file or directory
而adb shell
可以访问该文件。 所以我用了不同的方法,用临时文件。 - 当没有参数启动时,我的脚本将只列出所有可用的包。 提供部分包名称时,会尝试猜出完整的包名称。 它会抱怨,如果有几个可能的扩展。
- 我不硬编码的目的地path; 而APK则保存到当前工作目录。
将其保存到可执行文件中:
#!/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\""
我有一个简单易用的答案。
从谷歌播放商店下载应用App Share/Send Pro
。 select你想发送的应用程序和方法发送应用程序。
我通常使用蓝牙将应用程序发送到我的电脑或其他手机。
希望这对正在寻找非技术性答案的人有帮助