首页 文章

如何在没有root访问权限的情况下获取已安装应用的APK?

提问于
浏览
159

我正在尝试提取没有root权限的已安装Android应用的APK文件 .

我认为这是不可能的,因为非系统应用程序的所有APK文件都位于/ data / app中,访问此文件夹需要root权限 . 然后我发现Google Play商店中有很多应用即使在非root设备上也可以访问APK文件 .

有人能告诉我这是怎么回事吗?是否有备份应用程序备份没有root的APK文件?

10 回答

  • -1

    或者您可以从Google Play获取'Bluetooth File Transfer'并将主文件夹设置为 /system/ . 然后你甚至可以去 / .

  • 17

    没有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

    感谢@tarn指出在Lollipop下,apk路径将是 /data/app/your-package-name-1/base.apk

  • 6

    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
    
  • 0

    您无需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);
    }
    
  • -2

    当您安装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驱动程序

    • 在中间窗格中选择选项卡"File Explorer"并转到系统>应用程序

    • 现在您可以选择一个或多个文件,然后单击顶部的"Pull a file from the device"图标(选项卡右侧)

    • 选择目标文件夹 - tada!

  • 45
    • 检查已安装apk的列表(以下命令还列出了安装它的路径和包名称) . adb shell pm list packages -f

    • 使用 adb pull /package_path/package name /path_in_pc (可以从命令1上面获得的包路径和包名)

  • 6

    在Nougat(7.0)Android版本上运行 adb shell pm list packages 以列出设备上安装的软件包 . 然后运行 adb shell pm path your-package-name 以显示apk的路径 . 使用adb后将软件包复制到下载 adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download . 然后通过运行 adb pull /storage/emulated/0/Download/base.apk 将apk从Downloads下载到您的机器 .

  • 335

    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

    我找到了一种在非root设备中获取APK包名称的方法 . 它不是那么优雅,但总是有效 .

    Step 1 :在您的设备上,打开目标APK

    Step 2 :在PC cmd窗口中,键入以下命令:

    adb shell dumpsys activity a > dump.txt
    

    因为此命令的输出很多,建议重定向到文件 .

    Step 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文件的完整路径!

  • 5

    打开ES资源管理器 - >按左上角的菜单按钮(三个水平条纹) - >在库部分选择APP .

    因此,您将获得所有用户应用程序的列表 . 找到你的应用程序,并长时间推选它 . 然后在右下角按“更多”并选择“发送” . 然后你可以使用不同的选项,例如您可以选择“ES保存到”以将.apk文件保存到您的主目录或其他任何位置 .

相关问题