web-dev-qa-db-ja.com

rootアクセスなしでインストール済みアプリのAPKを取得する方法を教えてください。

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

非システムアプリ用のすべてのAPKファイルは/ data/appにあり、このフォルダにアクセスするにはroot権限が必要であるため、これは不可能だと思いました。それから、Google Playストアには、根ざしていないデバイスでもAPKファイルにアクセスできるように見えるアプリが多数あることがわかりました。

誰かがこれが可能である方法を教えてもらえますか? rootなしでAPKファイルをバックアップするバックアップアプリはありませんか?

172
pinas

/ data/appへのアクセスはroot権限なしで可能です。そのディレクトリのパーミッションはrwxrwx - xです。ディレクトリに対する実行権限は、そのディレクトリにアクセスできることを意味しますが、読み取り権限がないということは、その内容の一覧を取得できないことを意味します。 Androidのパッケージマネージャは、特定のパッケージ用に保存されているapkの名前を教えてくれます。

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

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

そして完全なディレクトリを知って、私達はadb pull full/directory/of/the.apkを使用してようやくadbを引っ張ることができます

Lollipopの下では、apkパスは/data/app/your-package-name-1/base.apkになることを指摘してくれた@tarnの功績

347
mah

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

インストール済みアプリのリストを取得するために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);
}
18
Sagar Waghmare
  1. インストールされているapkのリストを確認してください(次のコマンドでは、インストールされているパスとパッケージ名も表示されます)。 adbシェルpmリストパッケージ-f
  2. adb pull/package_path /パッケージ名/ path_in_pc(パッケージパスとパッケージ名は上記のコマンド1から取得できます)
7
goldy021

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にコピーした後。それからadb pull /storage/emulated/0/Download/base.apkを実行して、ダウンロードからあなたのマシンにapkを引き出します。

6
Buhiire Keneth

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

  • デバッグデバイスとしてあなたのデバイスを使用してください。お使いの携帯電話に:設定>アプリケーション>開発およびUSBデバッグを有効にする、 http://developer.Android.com/tools/device.html を参照してください。
  • EclipseでDDMSウィンドウを開きます。ウィンドウ>パースペクティブを開く>その他...> DDMS、 http://developer.Android.com/tools/debugging/ddms.html を参照してください。
  • デバイスが表示されない場合は、そのデバイス用にUSB-Driverを(再)インストールしてみてください。
  • 中央のペインで[File Explorer]タブを選択して[system]> [app]に移動します。
  • これで、1つ以上のファイルを選択してから、上部(タブの右側)にある[デバイスからファイルを取り出す]アイコンをクリックできます。
  • ターゲットフォルダを選択 - ただいま!
6
anon

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

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

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

ステップ2:PCのcmdウィンドウで、次のコマンドを入力してください。

 adb Shell dumpsys activity a > dump.txt

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

ステップ:この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ファイルのフルパスが見つかります。

0
Swing

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
Pankaj Arora