web-dev-qa-db-ja.com

Androidデバイスからapkファイルを取得する方法を教えてください。

Androidデバイスからapkファイルを入手するにはどうすればよいですか?または、apkファイルをデバイスからシステムに転送する方法を教えてください。

417
Finder

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"を入力することで確認できます。

80
Maurits Rijk

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
1363
Yojimbo

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より上で実行した場合は、そのパッケージがそこにあります。

104
Faris Al-Abed

私はあなたがあなたの電話を根絶しなければならないか、あるいはあなたがアプリをインストールしなければならないかのどちらかであるこの問題に対する多くの解決策を見ました。それからずっとグーグルした後に私はこれを得ました 根ざしていない/根ざした電話のための解決策

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

adb Shell pm list packages

それから、Twitterなどのアプリを選択します。

adb backup -apk com.Twitter.Android

ここで重要なことは、バックアップを暗号化するためのパスワードを設定しないことです

これでb​​ackup.apという名前のファイルが作成されますが、それでも開くことはできません。そのためには、ddコマンドを使用して再度抽出する必要があります。

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

この後、あなたがしなければならないのはタールの内容を抽出することであり、それは完了です。

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

52
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)
17
RVR

すべてのAndroidのバージョンで動作する一つのライナー:

adb Shell 'cat `pm path com.example.name | cut -d':' -f2`' > app.apk
9
Vitaly Dyatlov

@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"という名前です。修正するには「簡単」であるべきです。

8
elcuco

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
7
Pedro Rodrigues

上記のように、adbのpullコマンドを使ってapkを取得できます。

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

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

6
aditya.gupta

.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ファイルで何かをしようとするとき、あなたの人生をずっと楽にします。

5
m01

ここに概説されている手順は、Android 7(Nougat)(そしておそらくAndroid 6、しかし私は確認することができない)のためにはたらきません。 Nougatの直下に.apkファイルを引っ張ることはできません(ルートモード以外の場合、ただしルート設定された電話が必要です)。しかし、adbシェルを使用して、.apkを電話の代替パス(/ sdcard/Downloadなど)にコピーしてから、代替パスからadb pullを実行することができます。

5
SamG

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

4
HEXcube

これらすべての答えは、デバイスから取得した各apkファイルに対して複数の手順を必要とします。 1.パッケージ名を決定し、2.ファイルを見つけ、3.ダウンロードします。私は簡単な apk_grabber pythonスクリプト を与えられた正規表現にマッチするどんなアプリのためにでもこれをするために作り、そしてそれらのapkをjarファイルに逆コンパイルする。

3
Jeff Brateman

これを行う方法は次のとおりです。

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/

3
Pramod Mahato

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/
3
Farid Haq

非常に、非常に快適な1分のソリューションをしたいですか?

あなただけのこのアプリ https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (Google Playのスマートファイルマネージャ)。

「アプリ」をタップして選択し、「バックアップ」をタップします。それはあなたのファイルシステムのapp_backupフォルダに入ります;)

1
user3350906

ルートやADBツールが不要な方法。 Playストアから MyAppSharer appをインストールします。

1
moberme

私は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)
1
vanduc1102

私は携帯電話から.apkファイルを引っ張るためにコードを使用していませんが、私は携帯電話から.apkファイルを抽出するためにソフトウェアを使用しており、私が使用したソフトウェアはグーグルプレイリンクで以下です:

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

それがあなたに役立つことを願っています。

1
surhidamatya

さらに別のbashスクリプト(つまり、ほとんどのUNIXベースのシステムで動作します)。 Pedro Rodriguesによる答え に基づくが、やや使いやすいです。

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

  1. adb pullはファイルにアクセスできましたが、no such file or directoryadb 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
MarSoft

私は本当にこれらすべての答えが好きでした。それらすべてをエクスポートして名前を変更するためのほとんどのスクリプトは、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;
}
  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.
0
Gerben Versluis

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

0
Sirsendu
  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
0
Bryan Ibrahim