【发布时间】:2011-01-31 06:23:24
【问题描述】:
android 从 Marketplace 安装应用程序后,是否保留 .apk 文件?
Android 是否有一个标准的位置来保存此类文件?
【问题讨论】:
标签: android packages apk installation
android 从 Marketplace 安装应用程序后,是否保留 .apk 文件?
Android 是否有一个标准的位置来保存此类文件?
【问题讨论】:
标签: android packages apk installation
您可以使用包管理器 (pm) 而不是 adb shell 来列出包:
adb shell pm list packages | sort
并显示.apk 文件的位置:
adb shell pm path com.king.candycrushsaga
package:/data/app/com.king.candycrushsaga-1/base.apk
和adb pull 下载apk。
adb pull data/app/com.king.candycrushsaga-1/base.apk
【讨论】:
adb pull /data/app/com.example.app-filename.apk path/to/desired/destination
预装的应用程序位于/system/app 文件夹中。用户安装的应用程序位于/data/app。我猜你不能访问,除非你有一个根电话。
我这里没有root手机,但试试这个代码:
public class Testing extends Activity {
private static final String TAG = "TEST";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File appsDir = new File("/data/app");
String[] files = appsDir.list();
for (int i = 0 ; i < files.length ; i++ ) {
Log.d(TAG, "File: "+files[i]);
}
}
它确实列出了我根深蒂固的 htc 魔法和 emu 中的 apk。
【讨论】:
如果您只是想获取之前安装的某个 APK 文件,请执行以下操作:
你不需要root你的手机,使用adb,或者写任何东西。
【讨论】:
没有标准位置,但是您可以使用 PackageManager 来查找有关包的信息,并且您可以从那里获得的 ApplicationInfo 类包含有关特定包的各种信息:其 .apk 的路径、其数据目录的路径, 仅资源 .apk 的路径(用于前向锁定的应用程序)等。请注意,根据您与其他应用程序的关系,您可能有权或可能没有读取这些目录的权限;但是,所有应用都可以读取资源 .apk(对于非前向锁定应用来说,这也是真正的 .apk)。
如果您只是在 shell 中四处寻找,当前非前向锁定的应用程序位于 /data/app/.apk。 shell 用户可以读取特定的.apk,但它不能列出目录。在未来的版本中,命名约定将略有改变,所以不要指望它保持不变,但是如果你从包管理器中获得 .apk 的路径,那么你可以在 shell 中使用它。
【讨论】:
预装应用程序通常位于 /system/app 中,用户安装的应用程序位于 /data/app 中。
你可以使用“adb pull”,但是你需要知道APK文件的完整路径。在模拟器上,您可以使用“adb shell”+“ls”获取目录列表。但在安卓设备上,出于安全原因,您将无法在“/data”文件夹中执行此操作。那么如何找出 APK 文件的完整路径呢?
您可以通过编写一个查询 PackageManager 的程序来获取所有已安装应用的完整列表。短代码sn-p如下:
PackageManager pm = getPackageManager();
List<PackageInfo> pkginfo_list = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
List<ApplicationInfo> appinfo_list = pm.getInstalledApplications(0);
for (int x=0; x < pkginfo_list.size(); x++){
PackageInfo pkginfo = pkginfo_list.get(x);
pkg_path[x] = appinfo_list.get(x).publicSourceDir; //store package path in array
}
您还可以找到提供此类信息的应用程序。他们有很多。 Try this one (AppSender).
【讨论】:
从市场安装
安装后是否保留apk是市场的行为。安装后谷歌播放不保留apk。其他第三方市场可能有不同的行为。
从开发/调试工具(adb、eclipse、android studio)安装
当我们从调试工具安装apk时,直接调用adb install或者从eclipse/android studio,apk会被转移(adb push)到一个公共的可读写目录,通常是/data/local/tmp/。之后工具会使用pm命令安装,安装成功后会删除/data/local/tmp/中的临时apk。
我们可以从调试输出中获取这些信息,如下所示。
$ adb install bin/TestApplication.apk
3155 KB/s (843375 bytes in 0.260s)
pkg: /data/local/tmp/TestApplication.apk
Success
系统如何保存apk
当然,系统必须将所有 apk 存储在某个地方。系统根据 apk 的不同类型将 apk 保存在三个地方:
股票应用
这些通常由制造商提供,包括用于系统运行的核心应用和谷歌服务,您可以在目录/system/app和/system/priv-app下找到它们。
用户安装的应用程序
大多数 apk 都属于这一类。这些 apk 通常由用户从市场安装,或者由 adb install 安装,没有 -s 选项。您可以在目录/data/app 下找到它们以获取根设备。
SD卡上的应用
如果 apk 在其清单中使用 android:installLocation="auto" 启用其在 sdcard 中的安装位置,则可以将应用程序从系统的应用程序管理器菜单移至 sdcard。这些 apk 通常位于 sdcard /mnt/sdcard/asec 的安全文件夹中。
另一种强制安装位置到 sdcard 的方法是使用命令 adb install -s apk-to-install.apk。
请注意,预装应用程序的文件不再位于单个 .apk 文件中。对于最新的 android 版本,/system/app 或 /system/priv-app 目录中有一个包含每个预安装应用程序文件的文件夹。
【讨论】:
如果您正在寻找特定应用程序的路径,一个快速而肮脏的解决方案就是 grep 错误报告:
$ adb bugreport | grep 'dir=/data/app'
我不知道这会提供一个详尽的列表,所以它可能有助于先运行应用程序。
【讨论】:
您可以使用 ADB 拉取应用程序。我相信它们在 /data/App/ 中。
adb pull (location on device) (where to save)
请注意,您必须 root 手机才能提取受版权保护的应用程序。
【讨论】:
在 /data/app 但出于复制保护,我认为您无法访问它。
【讨论】:
如果您已获得 Root 权限,请下载应用 Root Explorer。根用户的最佳文件管理器。 无论如何,System/app 拥有手机自带的所有默认 apk,data/apk 拥有你已安装应用的所有 apk。只需长按您想要的 apk(在 Root Explorer 中),进入您的 /sdcard 文件夹并粘贴即可。
【讨论】:
使用它列出 /data/app/ 下的所有 .apk
adb bugreport | grep 'package name="' | grep 'codePath="/data' | cut -d'"' -f4
【讨论】:
您可以从其中任何一个中提取 .apks:
adb pull /mnt/asec
【讨论】:
.apk 文件可以位于 /data/app/ 目录下。使用 ES 文件资源管理器,我们可以访问这些 .APK 文件。
【讨论】:
如果你使用 eclipse goto DDMS 然后文件资源管理器在那里你会看到 System/Apps 文件夹和 apk 在那里
【讨论】:
当我在模拟器上安装我的应用程序时,它在
中显示了我的 .apk 文件数据/应用 然后我用 ls data/app //查看是否存在或 不是
安装应用程序后,只需使用 ls 命令 vie shell 并检查所需目录,但这取决于您尝试安装的应用程序类型。我用这个方法Install 如果有任何问题,请指出。
【讨论】:
在根设备上获取您找不到的apks 的另一种方法是使用 rom 工具箱。
使用应用管理器进行备份,然后转到storage/emulated/appmanager 并检查系统应用备份或用户应用备份。
【讨论】:
要查找apk,请从 Play 商店下载并安装蓝牙 App Sender。安装完成后,打开蓝牙 App Sender。它将显示您设备中安装的所有应用程序(.apk),然后您可以通过蓝牙轻松地将应用程序传输到您的PC。
【讨论】:
与所选答案中所写的相反,您不需要 root,并且可以获得已安装应用程序的 APK,这就是我在我的应用程序上所做的 (here)。示例:
List<PackageInfo> packages=getPackageManager().getInstalledPackages(0);
然后,对于列表中的每一项,您都可以访问packageInfo.applicationInfo.sourceDir,这是已安装应用的APK的完整路径。
【讨论】:
我来这篇文章是因为我想重新安装一些我非常喜欢的应用程序。 如果这是您的情况,只需转到 Google Play,然后查找“我的应用程序”、“全部”选项卡,您就会找到一种方法来重新安装您喜欢的某些应用程序。我遇到了一个问题,通过搜索一个应用程序找不到,但它在我的应用程序中,所以我可以在我的新手机中重新安装;)
【讨论】: