Root権限なしで、インストールされているAndroidアプリのAPKファイルを抽出しようとしています。
非システムアプリ用のすべてのAPKファイルは/ data/appにあり、このフォルダにアクセスするにはroot権限が必要であるため、これは不可能だと思いました。それから、Google Playストアには、根ざしていないデバイスでもAPKファイルにアクセスできるように見えるアプリが多数あることがわかりました。
誰かがこれが可能である方法を教えてもらえますか? rootなしでAPKファイルをバックアップするバックアップアプリはありませんか?
/ 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の功績
Androidは、パッケージ名にシーケンス番号を追加して最終的なAPKファイル名を生成します(これはAndroid OSのバージョンによって異なる可能性があります)。次の一連のコマンドは、非ルートデバイスに対して機能します。
目的のパッケージのAPKファイルのフルパス名を取得します。
adb Shell pm path com.example.someapp
これにより、出力はpackage:/data/app/com.example.someapp-2.apk
になります。
Androidデバイスから開発ボックスにAPKファイルを引き出します。
adb pull /data/app/com.example.someapp-2.apk
インストール済みアプリのリストを取得するために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);
}
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を引き出します。
Android開発用Eclipseがインストールされている場合:
私は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のパッケージ名をルート以外のデバイスで取得する方法を見つけました。それほどエレガントではありませんが、常に動作します。
ステップ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ファイルのフルパスが見つかります。
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