rootアクセスなしでインストール済みアプリのAPKを取得するにはどうすればよいですか?


196

インストールされているAndroidアプリのAPKファイルをルート権限なしで抽出しようとしています。

system-app以外のすべてのAPKファイルは/ data / appにあり、このフォルダーにアクセスするにはroot権限が必要であるため、これは不可能だと思いました。その後、ルート権限を取得していないデバイスでもAPKファイルにアクセスできるように見えるGoogle Playストアに多数のアプリがあることがわかりました。

誰かがこれがどのように可能かを教えてもらえますか?ルートなしでAPKファイルをバックアップするバックアップアプリはありませんか?


2
この質問はすでに答えられていると思います。親切に見与えるstackoverflow.com/a/12197924/1016544
WahibのUIハク




3
私がこれを読んだのは、@ pinasがこれをプログラムでコーディングする方法を尋ねていたということです-「これらのアプリはそれを行うが、どうやって?」と言うかのようにそれを行うアプリを参照します。ここでの「保留中」の理由は、私の意見では間違っているためです。
Richard Le Mesurier 2018

回答:


380

/ data / appへのアクセスはroot権限なしで可能です。そのディレクトリの権限はrwxrwx--xです。ディレクトリの実行権限は、そのディレクトリにアクセスできることを意味しますが、読み取り権限がないと、その内容のリストを取得できないことを意味します。そのため、ディレクトリにアクセスするには、アクセスするファイルの名前を知っている必要があります。Androidのパッケージマネージャーは、特定のパッケージに保存されているAPKの名前を通知します。

コマンドラインからこれを行うには、を使用adb shell pm list packagesして、インストールされているパッケージのリストを取得し、目的のパッケージを見つけます。

パッケージ名を使用すると、を使用してAPKの実際のファイル名と場所を取得できますadb shell pm path your-package-name

そして、完全なディレクトリを知っているので、最終的にadbを使用してプルすることができます adb pull full/directory/of/the.apk

Lollipopではapkパスが次のようになることを指摘した@tarnの功績 /data/app/your-package-name-1/base.apk


33
コマンドラインからこれを行うには、を使用adb shell pm list packagesして、インストールされているパッケージのリストを取得し、目的のパッケージを選択して追加-1.apkし、からプルし/data/appます。例:パッケージ名がの場合org.mozilla.firefox、を使用しますadb pull /data/app/org.mozilla.firefox-1.apk
sschuberth 2013年

11
APKの実際のファイル名を取得するには、adb shell pm path your-package-nameを使用します。より詳細な回答については、この質問を参照してください。stackoverflow.com

2
ロリポップAPKパスの/data/app/your-package-name-1/base.apkになります
タルン

これは私にはうまくいきません。私は次のエラーを取得する:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff

1
@ 0xcaff Androidは、この回答が提供されてから5年間でかなり変化しました。おそらく、このパスはそれらの変更の1つです。ご使用のバージョンのOSに適したパスを考え出すために、ログインしてファイルを手動で見つけることができるはずです。
mah

55

Androidは、パッケージ名にシーケンス番号を追加して、最終的なAPKファイル名を生成します(これはAndroid OSのバージョンによって異なる可能性があります)。次の一連のコマンドは、ルート権限を取得していないデバイスで機能します

  1. 目的のパッケージのAPKファイルの完全パス名を取得します。

    adb shell pm path com.example.someapp

    これにより、出力は次のようになりますpackage:/data/app/com.example.someapp-2.apk

  2. Androidデバイスから開発ボックスにAPKファイルをプルします。

    adb pull /data/app/com.example.someapp-2.apk

プルが成功した後のAPKの場所は、PC /ラップトップの../sdk/platform-tools/base.apkになります。


4
ルート権限を取得していないデバイスでこのソリューションが機能したことを確認できますが、最初のコマンドの前にパッケージ名を知っている必要があります。「adb shell pm list packages」を使用して、目的のアプリのパッケージ名がわからない場合に備えて、電話のすべてのパッケージのリストを取得します
AndroidNoob

プーラーのローカルマシン上のどのフォルダーにAPKが入りますか?編集:nvm、adb pullを実行したときにどのディレクトリにいても...
Adam Johns

@IgorGanapolsky adb pull /data/app/com.example.someapp-2/base.apk
Chris-Jr

@zelanix adb pullを実行した後、.apkファイルをcできます。ありがとう
Vijaya Varma Lanke

21

インストール済みアプリのリストを取得するためのROOT権限は必要ありません。

あなたはそれをandroid PackageManagerで行うことができます。

以下は小さなコードスニペットです。

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}

7
  1. インストールされているapkのリストを確認します(以下のコマンドでは、インストールされているパスとパッケージ名もリストされます)。 adbシェルpmリストパッケージ-f
  2. 使用ADBプル/ PACKAGE_PATH /パッケージ名/ path_in_pc (パッケージパスとパッケージ名の1は、上記のコマンド1から取得することができます)

6

Eclipse for Android開発がインストールされている場合:

  • デバイスをデバッグデバイスとして使用します。スマートフォンで:[設定]> [アプリケーション]> [開発]を選択し、USBデバッグを有効にします。http://developer.android.com/tools/device.htmlをご覧ください。
  • EclipseでDDMS-windowを開きます:ウィンドウ>パースペクティブを開く>その他...> DDMS、http: //developer.android.com/tools/debugging/ddms.htmlを参照
  • デバイスが表示されない場合は、デバイスにUSBドライバーを(再)インストールしてみてください
  • 中央のペインでタブ「ファイルエクスプローラー」を選択し、システム>アプリに移動します
  • これで、1つ以上のファイルを選択して、上部(タブの右側)にある[デバイスからファイルをプル]アイコンをクリックできます。
  • ターゲットフォルダを選択-多田!

/ system / appにはsystem-apps(別名プリインストール済みアプリ)のみがあります。
arne.jans 2015年

6

Nougat(7.0)では、Androidバージョンを実行adb shell pm list packagesして、デバイスにインストールされているパッケージを一覧表示します。次にadb shell pm path your-package-name、apkのパスを表示するために実行します。adbを使用してパッケージをDownloadsにコピーした後adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download。次に、を実行して、ダウンロードからapkをマシンにプルしますadb pull /storage/emulated/0/Download/base.apk


2

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

List PackageManager.getInstalledApplications()はインストールされたアプリケーションのリストを提供し、ApplicationInfo.sourceDirは.apkファイルへのパスです。

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

0

ルート以外のデバイスでAPKのパッケージ名を取得する方法を見つけました。それはそれほどエレガントではありませんが、常に機能します。

ステップ1:デバイスで、ターゲットAPKを開きます

手順2:PCのcmdウィンドウで、次のコマンドを入力します。

 adb shell dumpsys activity a > dump.txt

このコマンドの出力は多数なので、ファイルにリダイレクトすることをお勧めします。

ステップ3:このdump.txtファイルを任意のエディターで開きます。

Android 4.4以前のデバイスの場合:
ファイルの先頭は次のようになります。

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

パッケージ名は3行目にあり、この例ではcom.tencent.mmです。

Android 4.4以降の場合:
dumpsysの出力が少し変更されました。「Stack#1」を検索してみてください。パッケージ名はそのすぐ下にあります。

また、「baseDir」を検索すると、apkファイルの完全なパスが見つかります。


-1

ESエクスプローラーを開く->左上隅のメニューボタン(3本の横縞)を押します->ライブラリセクションでAPPを選択します。

したがって、すべてのユーザーアプリのリストを取得します。アプリを見つけて、長押しして選択します。次に、右下隅にある[その他]を押し、[送信]を選択します。次に、さまざまなオプションを使用できます。たとえば、「ES Save To」を選択して、.apkファイルをホームディレクトリまたは他の場所に保存できます。


-2

または、Google Playから「Bluetoothファイル転送」を取得して、ホームフォルダーをに設定できます/system/。その後、あなたも行くことができます/

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