Androidデバイスからapkファイルを取得するにはどうすればよいですか?または、apkファイルをデバイスからシステムに転送するにはどうすればよいですか?
24 に答える
Androidはパッケージ名にシーケンス番号を追加して最終的なAPKファイル名を生成していたため、これらの提案はどれもうまくいきませんでした。Androidの最新バージョン(OreoおよびPie)では、予測できないランダムな文字列が追加されます。次の一連のコマンドは、ルート化されていないデバイスで機能したものです。
1)アプリのパッケージ名を決定します(例: "com.example.someapp")。パッケージ名がわかっている場合は、この手順をスキップしてください。
adb shell pm list packages
パッケージ名のリストを調べて、問題のアプリとパッケージ名が一致するものを見つけてください。これは通常簡単ですが、パッケージ名はアプリ名とは完全に無関係である可能性があることに注意してください。パッケージ名のリストからアプリを認識できない場合は、ブラウザを使用してGooglePlayでアプリを検索してみてください。Google PlayのアプリのURLには、パッケージ名が含まれています。
2)目的のパッケージのAPKファイルのフルパス名を取得します。
adb shell pm path com.example.someapp
出力は、
package:/data/app/com.example.someapp-2.apk
または
package:/data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ==/base.apkのようになります。
3)手順2のフルパス名を使用して、Androidデバイスから開発ボックスにAPKファイルをプルします。
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
adbを使用します。デバイスがUSBに接続されている場合、 adb pull を使用すると、デバイスからシステムにファイルをコピーできます。
もちろん、ファイルが存在するディレクトリにアクセスするには、適切な権限も必要です。そうでない場合は、最初にデバイスをルート化する必要があります。
多くのAPKの名前が「base.apk」であることがわかった場合は、この1行のコマンドを使用して、「base.apk」の名前をパッケージ名に変更しながら、アクセスできる電話からすべてのAPKをプルすることもできます。これにより、名前の後に一見ランダムな文字が含まれるAPKパスのディレクトリが見つからないという問題も修正されます。
for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do
adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"
mv base.apk $i.apk &> /dev/null
done
「adb:error:failed to stat remote object」が表示された場合は、必要な権限がないことを示しています。ルート権限を取得していないMotoZ2でこれを実行し、YouTubeを除いてアンインストールしなかったすべてのAPK(以下を参照)をダウンロードできました。
adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills presidential alert app!
(ユーザーを表示するには、adb shell pm list usersを実行します)これは、システムアプリを含むルートのないほぼすべてのアプリ(電話を更新する迷惑な更新アプリのヒント)を削除/アンインストールする方法です(工場出荷時のリセットで戻ってくるので、電話からではありません)それを並べるかどうかは、「ccc」のgreppingで見つけることができます)
ルートは必要ありません:
このコードは、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
上記のcmdをで実行した場合C:>\
、そのパッケージがそこにあります。
私はあなたがあなたの電話を根絶しなければならないか、あなたがアプリをインストールしなければならないかのどちらかでこの問題に対する多くの解決策を見てきました。それから多くのグーグルの後、私は非root化/root化された電話のためにこの解決策を手に入れました。
これまでに入手したアプリを一覧表示します。
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をダウンロードする手順
A)実行中(エミュレーター/実際のデバイス)を確認してください。確認するには、このコマンドを使用します
adb devices
B)デバイスにインストールされている利用可能なパッケージリストをすべて選択します。grepコマンドを使用して、ダウンロードする特定のパッケージを選択できます。
adb shell pm list packages
adb shell pm list packages -f -3
出力(利用可能なパッケージのリスト)
package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication
C)上記のリンクからパッケージ(ダウンロードしたいもの)をコピーします。私たちのケースを形成する私はこの(com.example.myapplication)パッケージを選択します
Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication
出力
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk
D)最後に、(エミュレーター/実際のデバイス)からAPKをダウンロードするには
Syntax : adb pull /data/app/[your_package_name]-1/base.apk [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk
例:ローカルマシン(Mac)でこのCertInstaller.apkファイルをプルしようとしています
adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
E)ローカルディレクトリで確認する
ls -la /Users/$(whoami)/Documents/
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp
C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in
2.269s)
すべてのAndroidバージョンで機能する1つのライナー:
adb shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
UNIXシステムでは、次の機能を試すことができます。
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
@Yojimboの答えを完成させると、これが私がしたことです(Linux / Macのみ、Windowsではそのままでは機能しません...おそらくgitのbashシェルで):
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」という名前になります。修正するのは「簡単」である必要があります。
このワンライナー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のスクリプトから派生しています。elcucoのスクリプトの問題を解決するために、すべてのapkの名前をパッケージ名に変更しました。つまり、 base.apk
Android6.0「Marshmallow」以降で同じファイルが上書きされます。
このコマンドはサードパーティのアプリのみをバックアップすることに注意してください。組み込みのアプリをバックアップする意味がわかりません。ただし、システムアプリもバックアップする場合は、-3
オプションを省略してください。
上記のように、adbでpullコマンドを使用してapkを取得できます。
インストールされているアプリケーションについて話しているので、先に進んでAndroidファイルシステムの/ data/appディレクトリを調べてください。そこにAPKがあります。
次に、adbコマンドを使用します-adb pull /data/data/appname.apk
- お使いの携帯電話でapkを抽出したいアプリを開きます。
現在開いているアプリを次の方法で入手します。
adb shell dumpsys activity activities | grep mFocusedActivity
パッケージ名へのパスを取得します
adb shell pm path <packagename.apk>
4.取得したパスをSDカードディレクトリにコピーします
adb shell cp /data/app/<packagename.apk> /sdcard
5.apkを引っ張る
adb pull /sdcard/base.apk
編集
ステップ2が機能しない場合は、次を使用してください。
adb shell dumpsys window windows | grep mCurrentFocus
へのパスを知っている(または「推測」できる場合)場合.apk
(の形式のよう/data/app/com.example.someapp-{1,2,..}.apk
です) 、そこからコピーすることもできます/data/app
。これは、ルート化されていないストックのAndroidフォンでも機能しました。
ターミナルエミュレータアプリ(このアプリなど)を使用して、次のコマンドを実行するだけです。
# 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
ます。
ここで概説する手順は、Android 7(Nougat)[およびおそらくAndroid 6では機能しませんが、確認できません]。Nougatの直下で.apkファイルをプルすることはできません(ルートモードでない限り、ルート化された電話が必要です)。ただし、adbシェルを使用して.apkを電話の代替パス(たとえば/ sdcard / Download)にコピーしてから、代替パスからadbプルを実行できます。
これらすべての回答には、デバイスから取得したapkファイルごとに複数の手順が必要です。1.パッケージ名を決定し、2。ファイルを見つけ、3。ダウンロードします。特定の正規表現に一致するすべてのアプリに対してこれを行うための簡単なapk_grabber
Pythonスクリプトを作成し、それらのapkをjarファイルに逆コンパイルします。
方法は次のとおりです。
デバイスにAPKExtractorをダウンロードしてインストールします。これは無料で、ほとんどすべてのAndroidデバイスと互換性があります。もう1つのプラスの点は、rootなどが機能する必要がないことです。インストールしたら、起動します。そこに、システムアプリとともに、後でインストールしたアプリを含む、デバイスにあるアプリのリストが表示されます。抽出するアプリを長押しし(一度に複数またはすべてのアプリを選択できます)、上部に表示される抽出オプションをクリックします。Bluetoothまたはメッセージングを介して共有するオプションもあります。完了すると、抽出されたアプリがAppName_AppPackage_AppVersionName_AppVersionCode.apkとして表示されます。これは、デフォルトでパス/ sdcard /ExtractedApks/に保存されます。
androidでapkファイルを抽出する方法の詳細については、http://appslova.com/how-to-extract-apk-files-in-android/にアクセスしてください。
私は得たdoes not exist error
これが私がそれを機能させる方法です
adb shell pm list packages -f | findstr zalo
package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo
adb shell
mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit
adb pull /sdcard/zalo.apk Desktop
/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)
ルートやADBツールは必要ありません。PlayストアからMyAppSharerアプリをインストールします。
私はこれらすべての答えが本当に好きでした。それらすべてをエクスポートして名前を変更するほとんどのスクリプトは、Bashで記述されています。私は同じことをする小さなPerlスクリプトを作成しました(これはWindows用のPerlとLinuxの両方で動作するはずで、Ubuntuでのみテストされています)。
これはADBを使用します:https ://developer.android.com/studio/command-line/adb
ダウンロード-apk.pl
#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my $count = 0;
while(my $line = <$OUT>) {
$line =~ s/^\s*|\s*$//g;
my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
my $targetFile = "$category-$package.apk";
print "$type $category $path $package $baseFile >> $targetFile\n";
system("adb", "pull", $path);
rename $baseFile, $targetFile;
}
- adb(.exe)がパスまたは同じディレクトリにあることを確認してください
- お使いの携帯電話を接続します
- download-apk.plを実行します
出力は次のようなものです。
# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.
私はモバイルから.apkファイルをプルするためにコードを使用していませんが、モバイルから.apkファイルを抽出するためにソフトウェアを使用しています。使用したソフトウェアは以下のGooglePlayリンク付きです。
それがあなたを助けることを願っています。
非常に快適な1分間のソリューションをお望みですか?
あなただけのこのアプリhttps://play.google.com/store/apps/details?id=com.cvinfo.filemanager(グーグルプレイのスマートファイルマネージャー)。
「アプリ」をタップし、1つを選択して「バックアップ」をタップします。それはフォルダ内のファイルシステムにapp_backup
行き着きます;)
さらに別のbashスクリプト(つまり、ほとんどのUNIXベースのシステムで機能します)。Pedro Rodriguesの回答に基づいていますが、少し使いやすいです。
Pedroのバージョンに対する改善点:
- Android 7では、元のアプローチは機能しませんでした。ファイルにアクセスできる間、
adb pull
不平を言い続けました。したがって、一時ファイルを使用して、別のアプローチを使用しました。no such file or directory
adb shell
- 引数なしで起動すると、スクリプトは利用可能なすべてのパッケージを一覧表示します。部分的なパッケージ名が指定されている場合、完全なパッケージ名を推測しようとします。いくつかの可能な拡張がある場合は文句を言います。
- 宛先パスをハードコーディングしません。代わりに、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\""
最も簡単な方法は、電話に「ShareIt」アプリをインストールすることです。次に、shareItアプリをPCまたは他の電話にインストールします。アプリがインストールされている電話から、ShareItを開いて送信します。他の電話またはPCで、ShareItを開いて受信します。
これは、技術的でない答えを探している人に役立ちます
これは単純なハックです
App Share/Send Pro
グーグルプレイストアからアプリケーションをダウンロードしてください。送信するアプリとメソッド送信アプリケーションを選択します。
私は通常、Bluetoothを使用してアプリケーションを自分のPCまたは別の電話に送信します。