Androidデバイスからapkファイルを取得するにはどうすればよいですか?


484

Androidデバイスからapkファイルを取得するにはどうすればよいですか?または、デバイスからシステムにapkファイルを転送するにはどうすればよいですか?

回答:


119

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で見つけることができます)


1
Maurits Rijkさん、ありがとうございます。助けてください。iTwips.apkファイルをデバイスからシステムにコピーしたい。次のコマンドを使用しています。それが正しいか ?「Android2.2Froyo / sdcard / iTwips.apk」が終了しないというエラーが表示されます... / Users / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Users / bbbおかげさまで前進です。……
Finder

私のデバイス(Android 2.1)では、コマンドは "adb pull /sdcard/test.jpg"となり、test.jpgを私のsdカードから現在のディレクトリにコピーします。最初に「adb shell」を使用してiTwips.apkファイルを見つけてください。これにより、デバイスでシェルが起動し、lsやcdなどの標準的なUnixコマンドを使用してディレクトリを参照できます。
Maurits Rijk、

こんにちは、実際にはデバイスの内部メモリに保存されているiTwips.apk。これにシェルをどのように使用できますか?次のコマンドadp -d <devicenumber> shell ..を使用していますが、機能しません..助けてください..よろしくお願いします。
Finder

こんにちは、ありがとうございます。SDカードから画像を取得できます。デバイス(managementApplicationフォルダー)からapkファイルをプルしたいのですが。iTwips apkはApplicationフォルダーに保存されます。助けてください。
ファインダー

16
@Finder @Maurits Rijk実際には、apkをプルするためだけにデバイスをroot化する必要はありません。あなたがそのapkの完全なパスを知っている限り。apkがインストールされている場合は、最初にでパッケージ名を確認しadb shell pm list packagesadb shell pm path your.package.name次にそのフルパスをPCから確認して、フルパスを見つけますadb pull /full/path/to/your.apk
Isa A

1550

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

65
これは最良の答えです、デバイスを腐敗させる必要はありません!! おかげでたくさん
マハナッドA.Alhariri

14
これは私のすべてのAndroidデバイスで機能し、受け入れられる答えになるはずです。
b.mcewan 2013年

8
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を参照てください。編集:以下の答えがこれを言っていることに気づきましたが、その答えはこの答えほど賛成されていません。
Hitechcomputergeek 2017年

9
うまくいきません。次のエラーが表示されますadb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist。これらのフォルダーをファイルブラウザーで参照すると、フォルダーが空になります。
18

8
@Bevorと同様の問題があり、プルするとapkが「存在しない」というエラーが発生しました。私が使用してそれを修正adb shellしてからcp PathToApk /sdcard/、その後、SDカードからのコピー。
コリン

124

ルートは必要ありません:

このコードは、名前が付いたサードパーティパッケージのパスを取得するので、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:>\すると、そこにそのパッケージが見つかります。


1
これは素晴らしい答えです!どうもありがとうございました:)
Drag0

1
何らかの理由で/ data / app /ディレクトリにAPKが見つかりません。そこには常にサブディレクトリがあります。
IgorGanapolsky

システムアプリの-f -s代わりに使用-f -3
palindrom 2017

57

私はこの問題の多くの解決策があなたの携帯電話をルート化する必要があるか、あなたがアプリをインストールしなければならないことを見てきました。それから多くのググリングの後、私は非根ざした/根ざした電話のためにこの解決策を得ました

これまでに入手したアプリを一覧表示します。

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コンテンツを抽出するだけで完了です。

それがあなたたちのために働くことを願っています


7
blog.shvetsov.com/2013/02/…から、opensslにzlibがない場合は、次のように機能する可能性があります。python -c "インポートzlib、sys; sys.stdout.write(zlib.decompress(sys.stdin.read()))" | タール-xvf -
KODI

1
これは私にとってうまくいったものであり、受け入れられた回答の手順ではありません。そして、今日私が私の古いアプリの1つのAPKを必要としたときにそれは本当に私を助けましたが、それは私の携帯電話以外からは利用できませんでした。
Zeeshan 14

1
:あなたのOpenSSLはzlibをサポートしていない場合はここでは詳しくありstackoverflow.com/questions/29830981/...
ニコヴィーデマン

19

デバイスからデスクトップに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/

目的は1つのapkを抽出することですが、ステップ4では、説明や以前の参照なしに2つの追加ファイルをプルします。
カルレスアルコレア

すべてのステップを明確にすることにより、この投稿を変更しました。この変更が役に立ち、理解しやすくなることを願っています。
ファリドハク

18
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)

これは私の意見では最も簡単な方法です。ありがとう!
8ビットカートリッジ

1
findstrの代わりにlinuxまたはmacを使用している人はgrepを使用します
Jeeva


7

@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」という名前になります。修正するのは簡単です。


7

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

6

上記のように、adbでプルコマンドを使用してapkを取得できます。

インストールされているアプリケーションについて話しているので、先に進んでAndroidファイルシステムの/ data / appディレクトリを調べてください。APKがそこにあります。

次に、adbコマンドを使用します-adb pull /data/data/appname.apk


6

すべてのアプリをバックアップするには、次の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オプションを省略してください。


5

あなたが知っている(または、「推測する」ことができる場合)へのパスをした場合.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ファイルで何かをしようとするときあなたの人生をずっと楽にします。


5

ここで説明する手順は、Android 7(Nougat)では機能しません[Android 6でも可能ですが、確認できません]。Nougatの下で.apkファイルを直接プルすることはできません(ルートモードでない限り、ルート化された電話が必要です)。ただし、adbシェルを使用して、.apkを電話の代替パス(/ sdcard / Downloadなど)にコピーしてから、代替パスからadbプルを実行できます。


3
受け入れられた回答(adb shell@Isa Aのコメントからのコマンドを含む)は、根ざしたものではなく、Android 7.1.1でうまく機能しました。
Jonathan Cottrill、2016

4
  1. 携帯電話でapkを抽出するアプリを開きます。
  2. 現在開いているアプリを入手するには:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. パッケージ名へのパスを取得します

    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

3

方法は次のとおりです。

デバイスにAPK Extractorをダウンロードしてインストールします。これは無料で、ほぼすべてのAndroidデバイスで互換性があります。もう1つの利点は、rootやその他の機能を必要としないことです。インストールしたら、起動します。デバイスにあるアプリのリストが表示されます。これには、後でインストールしたアプリやシステムアプリが含まれます。抽出するアプリを長押し(一度に複数またはすべてのアプリを選択できます)し、上部に表示される抽出オプションをクリックします。Bluetoothまたはメッセージングを介して共有するオプションもあります。完了すると、抽出されたアプリがAppName_AppPackage_AppVersionName_AppVersionCode.apkとして表示されます。これはデフォルトでパス/ sdcard / ExtractedApks /に保存されます。

AndroidAPKファイルを抽出する方法の詳細については、http//appslova.com/how-to-extract-apk-files-in-android/にアクセスしてください。


3

これらすべての回答には、デバイスから取得した各apkファイルに対して複数の手順が必要です。1.パッケージ名を決定し、2。ファイルを見つけ、3。ダウンロードします。特定の正規表現に一致するすべてのアプリに対してこれを行う単純なapk_grabberpythonスクリプト作成し、それらのapkをjarファイルに逆コンパイルしました。


1

私はモバイルから.apkファイルをプルするためにコードを使用していませんが、モバイルから.apkファイルを抽出するためにソフトウェアを使用しており、使用したソフトウェアは以下のGoogle Playリンクで表示されます。

  1. ESファイルエクスプローラーファイルマネージャー
  2. ASTRO Cloud&File Manager 3. ソフトウェアデータケーブル

お役に立てば幸いです。


2
ESファイルエクスプローラーを使用しました。私は根付いていません。ツール->アプリマネージャーに移動し、APKが必要なアプリを長押ししました。これでアプリが選択されました(他のアプリを選択できるようになりました)。[共有]ボタンを押して、APKを自分に送信できたと思います(Push Bulletを使用しますが、これでうまくいきます)。
シュルツァー2014年

あなたが腐敗していない場合は、アプリのバックアップを試して、play.google.com
store / apps / details?id


1

ルートやADBツールは必要ありません。PlayストアからMyAppSharerアプリをインストールします。


1

私は得た 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)

0

さらに別のbashスクリプト(つまり、ほとんどのUNIXベースのシステムで機能します)。ペドロロドリゲスの回答に基づくが、少し使いやすくなっています。

Pedroのバージョンに対する改善:

  1. オリジナルのアプローチは、Android 7に私のために動作しませんでした:adb pull不満保たれno such file or directoryながら、adb shellファイルにアクセスすることができました。したがって、一時ファイルを使用して別のアプローチを使用しました。
  2. 引数なしで起動すると、使用可能なすべてのパッケージが一覧表示されます。部分的なパッケージ名が提供されると、完全なパッケージ名を推測しようとします。いくつかの可能な拡張がある場合、それは文句を言うでしょう。
  3. 宛先パスをハードコードしていません。代わりに、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\""

0

最も簡単な方法は、電話に「ShareIt」アプリをインストールすることです。PCまたは他の電話にshareItアプリをインストールします。アプリがインストールされている電話から、ShareItを開いて送信します。他の電話またはPCで、ShareItを開いて受信します。


0

私はこれらすべての答えが本当に好きでした。それらすべてをエクスポートして名前を変更するほとんどのスクリプトは、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;
}
  1. adb(.exe)がパスまたは同じディレクトリにあることを確認してください
  2. スマートフォンを接続してください
  3. 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.

-1

これは、非技術的な答えを探している人に役立ちます

これは簡単なハックです

App Share/Send Proグーグルプレイストアからアプリケーションをダウンロードしてください。送信するアプリとメソッド送信アプリを選択します。

私は通常、Bluetoothを使用してアプリケーションを自分のPCまたは別の電話に送信します。


使い方は簡単ではありません
APEXBoi 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.