回答:
adbを使用します。ADBプル デバイスがUSBで接続されている場合、あなたは、あなたのシステムにデバイスからファイルをコピーすることができます。
もちろん、ファイルがあるディレクトリにアクセスするための適切な権限も必要です。そうでない場合は、まずデバイスをルートする必要があります。
多くの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 2&> /dev/null ;done
「adb:error:failed to stat remote object」が表示された場合は、必要な権限がないことを示しています。ルート権限を取得していないMoto Z2でこれを実行し、アンインストールしなかったすべてのAPKをダウンロードできました(下記を参照)。
adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver <--- kills presidential alert app!
(ユーザーを表示するには、adb shell pm list usersを実行します)これは、(出荷時設定にリセットされるため、電話からではなく)ルートを含まないほとんどすべてのアプリを削除/アンインストールする方法です(電話を更新する迷惑な更新アプリのヒント)それを並べるかどうかは、 "ccc"のgreppingで見つけることができます)
adb shell pm list packages
、adb shell pm path your.package.name
次にそのフルパスをPCから確認して、フルパスを見つけますadb pull /full/path/to/your.apk
Androidがパッケージ名にシーケンス番号を追加して最終的なAPKファイル名を生成するため、これらの提案はどれも私にとってうまくいきませんでした。最近のバージョンのAndroid(OreoおよびPie)では、予測できないランダムな文字列が追加されます。次の一連のコマンドは、ルート権限を取得していないデバイスで機能しました。
1)アプリのパッケージ名を決定します(例:「com.example.someapp」)。パッケージ名がわかっている場合は、この手順をスキップしてください。
adb shell pm list packages
パッケージ名のリストを確認し、問題のアプリとパッケージ名の一致を見つけてください。これは通常は簡単ですが、パッケージ名はアプリ名と完全に無関係である可能性があることに注意してください。パッケージ名のリストからアプリを認識できない場合は、ブラウザーを使用してGoogle Playでアプリを見つけてみてください。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のフルパス名を使用して、APKファイルをAndroidデバイスから開発ボックスにプルします。
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
pm list packages
の-f
ような.apkの場所をリストするフラグをサポートしていますpackage:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps
。組み込みのpmヘルプは役に立ちませんが、pmはパッケージのタイプもフィルタリングできます。詳細については、developer.android.com / studio / command-line / adb.html #pmを参照してください。編集:以下の答えがこれを言っていることに気づきましたが、その答えはこの答えほど賛成されていません。
adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist
。これらのフォルダーをファイルブラウザーで参照すると、フォルダーが空になります。
adb shell
してからcp PathToApk /sdcard/
、その後、SDカードからのコピー。
ルートは必要ありません:
このコードは、名前が付いたサードパーティパッケージのパスを取得するので、APKを簡単に識別できます
adb shell pm list packages -f -3
出力は
パッケージ:/data/app/XX.XX.XX.apk=YY.YY.YY
次に、以下のコードを使用してそのパッケージをpullします。
adb pull /data/app/XX.XX.XX.apk
上記のcmdを実行C:>\
すると、そこにそのパッケージが見つかります。
-f -s
代わりに使用-f -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
この後は、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
例:このCertInstaller.apkファイルをローカルマシン(Mac)にプルしようとする
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
@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」という名前になります。修正するのは簡単です。
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
上記のように、adbでプルコマンドを使用してapkを取得できます。
インストールされているアプリケーションについて話しているので、先に進んでAndroidファイルシステムの/ data / appディレクトリを調べてください。APKがそこにあります。
次に、adbコマンドを使用します-adb pull /data/data/appname.apk
すべてのアプリをバックアップするには、次の1つのライナー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
ファイルがAndroid 6.0 "Marshmallow"以降で上書きされます。
このコマンドはサードパーティアプリのみをバックアップすることに注意してください。組み込みアプリをバックアップする意味はわかりません。ただし、システムアプリもバックアップする場合は、-3
オプションを省略してください。
あなたが知っている(または、「推測する」ことができる場合)へのパスをした場合.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プルを実行できます。
adb shell
@Isa Aのコメントからのコマンドを含む)は、根ざしたものではなく、Android 7.1.1でうまく機能しました。
現在開いているアプリを入手するには:
adb shell dumpsys activity activities | 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
編集する
ステップ2が機能しない場合は、これを使用します。
adb shell dumpsys window windows | grep mCurrentFocus
方法は次のとおりです。
デバイスにAPK Extractorをダウンロードしてインストールします。これは無料で、ほぼすべてのAndroidデバイスで互換性があります。もう1つの利点は、rootやその他の機能を必要としないことです。インストールしたら、起動します。デバイスにあるアプリのリストが表示されます。これには、後でインストールしたアプリやシステムアプリが含まれます。抽出するアプリを長押し(一度に複数またはすべてのアプリを選択できます)し、上部に表示される抽出オプションをクリックします。Bluetoothまたはメッセージングを介して共有するオプションもあります。完了すると、抽出されたアプリがAppName_AppPackage_AppVersionName_AppVersionCode.apkとして表示されます。これはデフォルトでパス/ sdcard / ExtractedApks /に保存されます。
AndroidでAPKファイルを抽出する方法の詳細については、http://appslova.com/how-to-extract-apk-files-in-android/にアクセスしてください。
これらすべての回答には、デバイスから取得した各apkファイルに対して複数の手順が必要です。1.パッケージ名を決定し、2。ファイルを見つけ、3。ダウンロードします。特定の正規表現に一致するすべてのアプリに対してこれを行う単純なapk_grabber
pythonスクリプトを作成し、それらのapkをjarファイルに逆コンパイルしました。
私はモバイルから.apkファイルをプルするためにコードを使用していませんが、モバイルから.apkファイルを抽出するためにソフトウェアを使用しており、使用したソフトウェアは以下のGoogle Playリンクで表示されます。
お役に立てば幸いです。
非常に快適な1分の解決策が必要ですか?
あなただけのこのアプリhttps://play.google.com/store/apps/details?id=com.cvinfo.filemanager(グーグルプレイからのスマートファイルマネージャー)。
「アプリ」をタップし、1つを選択して「バックアップ」をタップします。それはあなたのファイルシステムのapp_backup
フォルダ;;に終わります
ルートやADBツールは必要ありません。PlayストアからMyAppSharerアプリをインストールします。
私は得た 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)
さらに別のbashスクリプト(つまり、ほとんどのUNIXベースのシステムで機能します)。ペドロロドリゲスの回答に基づくが、少し使いやすくなっています。
Pedroのバージョンに対する改善:
adb pull
不満保たれno such file or directory
ながら、adb shell
ファイルにアクセスすることができました。したがって、一時ファイルを使用して別のアプローチを使用しました。これを実行可能ファイルに保存します。
#!/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\""
私はこれらすべての答えが本当に好きでした。それらすべてをエクスポートして名前を変更するほとんどのスクリプトは、Bashで作成されました。私は同じことをする小さなPerlスクリプトを作成しました(WindowsとLinuxの両方のPerlで動作するはずですが、Ubuntuでのみテストされています)。
download-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 @list = split(/\s*/, `adb shell pm list packages -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;
}
出力は次のようになります。
# ./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.
これは、非技術的な答えを探している人に役立ちます
これは簡単なハックです
App Share/Send Pro
グーグルプレイストアからアプリケーションをダウンロードしてください。送信するアプリとメソッド送信アプリを選択します。
私は通常、Bluetoothを使用してアプリケーションを自分のPCまたは別の電話に送信します。