Androidデバイスからapkファイルを入手するにはどうすればよいですか?または、apkファイルをデバイスからシステムに転送する方法を教えてください。
adb を使用してください。 adb pullを使用すると、デバイスが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:remote objectのstatに失敗しました」と表示された場合は、必要な権限がないことを示しています。私はこれを根ざしていないMoto Z2上で走らせた、そして私がyoutubeを除いてアンインストールしなかったすべてのAPKをダウンロードすることができた(下記参照)。
adb Shell pm uninstall --user 0 com.Android.cellbroadcastreceiver <--- kills presidential alert app!
(ユーザーがadb Shell pm list usersを実行するのを見るために)これは削除する/アンインストールする方法です(工場出荷時の状態にリセットされるので、電話からではありません)ほぼANYappルートアプリなしのシステムアプリ)電話回線を更新するかどうかを更新するアプリを更新するかどうかは、 "ccc"を入力することで確認できます。
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
出力は次のようになります。
パッケージ:/data/app/com.example.someapp-2.apk
または
パッケージ:/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
rootは必要ありません。
このコードは、あなたが簡単にあなたの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より上で実行した場合は、そのパッケージがそこにあります。
私はあなたがあなたの電話を根絶しなければならないか、あるいはあなたがアプリをインストールしなければならないかのどちらかであるこの問題に対する多くの解決策を見ました。それからずっとグーグルした後に私はこれを得ました 根ざしていない/根ざした電話のための解決策
これまでに入手したアプリを一覧表示する。
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
この後、あなたがしなければならないのはタールの内容を抽出することであり、それは完了です。
それがあなたのために働くことを願っています
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のバージョンで動作する一つのライナー:
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のpullコマンドを使ってapkを取得できます。
それ以来、あなたはインストールされているアプリケーションについて話しているので、先に進んであなたのAndroidファイルシステムの /data/app ディレクトリを調べてください。そこにAPKがあります。
次にadbコマンドを使用します - adb pull /data/data/appname.apk
.apk
(itseemsへのパスが/data/app/com.example.someapp-{1,2,..}.apk
toの形式であることがわかっている場合(または「推測できる」場合)、 /data/app
からもコピーします。これは、ルート化されていない標準のAndroid電話でも機能しました。
ターミナルエミュレータアプリ( this one など)を使用して実行するだけです:
# 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 pullを実行することができます。
すべてのアプリをバックアップするには、この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ファイルに対して複数の手順を必要とします。 1.パッケージ名を決定し、2.ファイルを見つけ、3.ダウンロードします。私は簡単な apk_grabber
pythonスクリプト を与えられた正規表現にマッチするどんなアプリのためにでもこれをするために作り、そしてそれらのapkをjarファイルに逆コンパイルする。
これを行う方法は次のとおりです。
APK Extractorをダウンロードしてお使いのデバイスにインストールします。無料で、ほとんどすべてのAndroidデバイスと互換性があります。もう一つの利点は、それが動作するためにもrootや何かを必要としないということです。インストールしたら、起動します。そこには、デバイスにあるアプリのリストが表示されます。これには、後でインストールしたアプリやシステムアプリが含まれます。あなたが(あなたが一度に複数またはすべてのアプリを選択することができます)あなたが抽出したい任意のアプリを長押しして、あなたが一番上に見える抽出オプションをクリックしてください。また、Bluetoothまたはメッセージングを介して共有することもできます。これで、抽出したアプリはAppName_AppPackage_AppVersionName_AppVersionCode.apkとして表示されます。これはデフォルトで/ sdcard/ExtractedApks /に保存されます。
Androidでapkファイルを抽出する方法 の詳細については、次のURLをご覧ください。 http://appslova.com/how-to-extract-apk-files-in-Android/
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)を選ぶ
Syntex: 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をダウンロードする。
Syntex: 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/
非常に、非常に快適な1分のソリューションをしたいですか?
あなただけのこのアプリ https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (Google Playのスマートファイルマネージャ)。
「アプリ」をタップして選択し、「バックアップ」をタップします。それはあなたのファイルシステムのapp_backup
フォルダに入ります;)
ルートやADBツールが不要な方法。 Playストアから MyAppSharer appをインストールします。
私は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)
私は携帯電話から.apkファイルを引っ張るためにコードを使用していませんが、私は携帯電話から.apkファイルを抽出するためにソフトウェアを使用しており、私が使用したソフトウェアはグーグルプレイリンクで以下です:
それがあなたに役立つことを願っています。
さらに別のbashスクリプト(つまり、ほとんどのUNIXベースのシステムで動作します)。 Pedro Rodriguesによる答え に基づくが、やや使いやすいです。
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スクリプトを作りました(これはPerl for windowsとlinuxの両方で動くはずです、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.
最も簡単な方法は次のとおりです。電話で「ShareIt」アプリをインストールします。今すぐPCや他の携帯電話にshareItアプリをインストールしてください。今すぐアプリがインストールされている携帯電話から、ShareItを開いて送信します。他の電話またはPCで、ShareItを開いて受信します。
現在開いているアプリを入手してください。
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