如何让Android应用获取其他已安装应用的APK文件路径?
获取Android已安装应用APK路径及内容的方法
首先明确:PackageInfo.installLocation是安装位置的枚举值,不是文件路径——它的取值是INSTALL_LOCATION_INTERNAL_ONLY、INSTALL_LOCATION_PREFER_EXTERNAL等常量,仅用于标识应用优先安装在内部存储还是外部存储,和APK实际路径无关。
获取APK路径的正确方式
通过PackageManager获取ApplicationInfo对象,它提供了直接获取APK路径的字段:
sourceDir:主APK(通常是base.apk)的完整路径splitSourceDirs:拆分APK(如split_config_xxx.apk)的路径数组,仅当应用采用App Bundle拆分安装时存在
示例代码:
PackageManager packageManager = getPackageManager(); // 获取所有已安装应用的ApplicationInfo列表 List<ApplicationInfo> installedApps = packageManager.getInstalledApplications(0); for (ApplicationInfo appInfo : installedApps) { // 获取主APK路径 String mainApkPath = appInfo.sourceDir; // 获取拆分APK路径(如果有) String[] splitApkPaths = appInfo.splitSourceDirs; if (splitApkPaths != null) { for (String splitPath : splitApkPaths) { // 处理每个拆分APK } } }
直接读取APK内容
拿到路径后,可通过文件流直接读取APK文件内容,用于分享或其他操作:
// 以主APK为例 File mainApkFile = new File(mainApkPath); try (FileInputStream inputStream = new FileInputStream(mainApkFile)) { // 读取流内容,可复制到输出流实现分享、保存等操作 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 处理读取到的字节 } } catch (IOException e) { e.printStackTrace(); }
注意事项
- 权限要求:
- Android 11及以上,需要在Manifest中添加
QUERY_ALL_PACKAGES权限(或针对特定包添加QUERY_PACKAGE权限),才能获取所有已安装应用的信息。 - 读取APK文件时,系统允许应用访问通过
ApplicationInfo获取的路径,无需额外存储权限(Android 10+的Scoped Storage规则不影响此场景)。
- Android 11及以上,需要在Manifest中添加
- 避免硬编码路径:
/data/app/...这类路径在不同Android版本中可能有结构变化,依赖系统API获取的路径才是稳定可靠的。 - 系统应用兼容:系统应用的APK路径(如
/system/app/、/system/priv-app/下的文件)也可通过sourceDir正确获取。
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

