簡體   English   中英

如何在沒有 root 訪問權限的情況下獲取已安裝應用程序的 APK?

[英]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 設備

  1. 獲取所需包的 APK 文件的完整路徑名。

     adb shell pm path com.example.someapp

    這將輸出為: package:/data/app/com.example.someapp-2.apk

  2. 將 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 拉到您的機器上。

  1. 檢查已安裝 apk 的列表(以下命令還列出了它的安裝路徑和包名稱)。 adb shell pm list packages -f
  2. 使用adb pull /package_path/package name /path_in_pc (包路徑和包名可以從上面的命令1中得到。)

我得到一個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 開發時:

  • 將您的設備用作調試設備。 在您的手機上:設置 > 應用程序 > 開發並啟用 USB 調試,請參閱http://developer.android.com/tools/device.html
  • 在 Eclipse 中,打開 DDMS 窗口:Window > Open Perspective > Other... > DDMS,參見http://developer.android.com/tools/debugging/ddms.html
  • 如果您看不到您的設備,請嘗試(重新)為您的設備安裝 USB 驅動程序
  • 在中間窗格中選擇選項卡“文件資源管理器”並轉到系統 > 應用程序
  • 現在您可以選擇一個或多個文件,然后單擊頂部的“從設備中提取文件”圖標(選項卡右側)
  • 選擇目標文件夾 - tada!

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

可以通過免費和開源的 Ghost Commander 應用程序獲取已安裝應用程序的 APK 文件,該應用程序可在F-DroidPlay 商店中獲得。

在 Ghost Commander 應用程序中,轉到應用程序,然后只需按列表中的一個應用程序並選擇復制 .apk 文件將在其他文件面板中可用; 你可以把它放在你想要的任何地方。

請注意,由於 Ghost Commander 是一個雙面板文件管理器,您首先必須使用另一個面板並在那里打開一個文件夾(我們要將 apk 文件復制到其中)。 然后,轉到另一個面板並轉到那里的應用程序。

(如果您沒有看到“應用程序”,請先點擊箭頭並選擇主頁。)

鏈接:

  1. https://f-droid.org/packages/com.ghostsq.commander/
  2. https://sourceforge.net/projects/ghostcommander/
  3. https://play.google.com/store/apps/details?id=com.ghostsq.commander

或者您可以從Google Play獲取“藍牙文件傳輸”並將主文件夾設置為/system/ 然后你甚至可以去/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM