![](/img/trans.png)
[英]how to installed apk without uninstalling the current apk of the same App
[英]How do I get the APK of an installed app without root access?
我正在嘗試在沒有 root 權限的情況下提取已安裝的 Android 應用程序的 APK 文件。
我認為這是不可能的,因為所有非系統應用程序的 APK 文件都位於 /data/app 中,訪問此文件夾需要 root 權限。 然后我發現 Google Play 商店中有許多應用程序似乎可以訪問 APK 文件,即使在非 Root 設備上也是如此。
有人能告訴我這怎么可能嗎? 沒有備份應用程序可以在沒有 root 的情況下備份 APK 文件嗎?
無需root權限即可訪問/data/app; 該目錄的權限是 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。 APK 文件存儲到您運行控制台的目錄中。
感謝@tarn 指出在 Lollipop 下,apk 路徑將是/data/app/your-package-name-1/base.apk
Android 將序列號附加到包名稱以生成最終的 APK 文件名(這可能會因 Android OS 的版本而異)。 以下命令序列適用於非 root 設備:
獲取所需包的 APK 文件的完整路徑名。
adb shell pm path com.example.someapp
這將輸出為: package:/data/app/com.example.someapp-2.apk
。
將 APK 文件從 Android 設備拉到開發框中。
adb pull /data/app/com.example.someapp-2.apk
拉取成功后 APK 的位置會在你的 pc/laptop 上的 ../sdk/platform-tools/base.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 從 Downloads 拉到您的機器上。
我得到一個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)
當您安裝了 Eclipse for Android 開發時:
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
打開 ES explorer -> 按下左上角的 Menu 按鈕(三個水平條紋) -> 在 Libraries 部分中選擇 APPs。
因此,您將獲得所有用戶應用程序的列表。 找到您的應用程序並長按選擇它。 然后按右下角的“更多”並選擇“發送”。 然后您可以使用不同的選項,例如您可以選擇“ES Save To”以便將.apk 文件保存到您的主目錄或其他任何地方。
我找到了一種在非 root 設備中獲取 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 文件的完整路徑!
一行命令,按包分開下載到路徑
SEARCH_APP="minecraft" && PKGS=$(adb shell pm list packages | grep ${SEARCH_APP}) && for PKG in ${PKGS}; do PKG=${PKG#*:} && mkdir -p ${SEARCH_APP}/${PKG} && PKG_FILES=$(adb shell pm path ${PKG}) && for PKG_FILE in ${PKG_FILES}; do PKG_FILE=${PKG_FILE#*:} && adb pull $PKG_FILE ${SEARCH_APP}/${PKG}; done; done
或者您可以從Google Play獲取“藍牙文件傳輸”並將主文件夾設置為/system/
。 然后你甚至可以去/
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.