能否通过Android API中PackageManager的getPackageInfo方法获取已安装应用的架构信息?
获取Android已安装应用的架构类型(arm-v7a/arm64等)
当然可以!通过Android系统API,我们完全能获取到已安装应用的架构信息,下面分场景给你具体的实现方案和注意事项:
方法一:利用ApplicationInfo的ABI字段(推荐)
Android从API 21开始就提供了直接获取应用ABI的字段,不同版本的API有细微差异,直接看代码更清晰:
Java 示例代码
PackageManager pm = getApplicationContext().getPackageManager(); String targetPackage = "com.example.yourtargetapp"; // 替换为目标应用包名 try { ApplicationInfo appInfo = pm.getApplicationInfo(targetPackage, 0); String primaryAbi; String[] supportedAbis; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // API 26及以上,推荐使用这两个字段 primaryAbi = appInfo.primaryCpuAbi; supportedAbis = appInfo.supportedAbis; } else { // API 21-25,使用旧字段 primaryAbi = appInfo.cpuAbi; supportedAbis = appInfo.cpuAbis; } // 输出结果 Log.d("AppArch", "主架构: " + primaryAbi); Log.d("AppArch", "支持的所有架构: " + Arrays.toString(supportedAbis)); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); Log.e("AppArch", "未找到目标应用"); }
Kotlin 示例代码
val pm = applicationContext.packageManager val targetPackage = "com.example.yourtargetapp" try { val appInfo = pm.getApplicationInfo(targetPackage, 0) val primaryAbi = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { appInfo.primaryCpuAbi } else { appInfo.cpuAbi } val supportedAbis = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { appInfo.supportedAbis } else { appInfo.cpuAbis } Log.d("AppArch", "主架构: $primaryAbi") Log.d("AppArch", "支持的所有架构: ${supportedAbis.contentToString()}") } catch (e: PackageManager.NameNotFoundException) { e.printStackTrace() Log.e("AppArch", "未找到目标应用") }
方法二:解析Native库目录路径(兼容边缘场景)
如果遇到某些旧系统或特殊应用(比如部分定制ROM下的应用)ABI字段返回异常,可以通过应用的Native库目录路径提取架构信息——因为应用的Native库默认存放在/data/app/<包名>/lib/<ABI>格式的路径下,我们只需要截取最后一段即可:
PackageManager pm = getApplicationContext().getPackageManager(); String targetPackage = "com.example.yourtargetapp"; try { ApplicationInfo appInfo = pm.getApplicationInfo(targetPackage, 0); String libDir = appInfo.nativeLibraryDir; if (libDir != null) { String abi = libDir.substring(libDir.lastIndexOf("/") + 1); Log.d("AppArch", "从路径解析的架构: " + abi); } else { // 应用无Native库(纯Java/Kotlin应用),返回设备当前运行架构 Log.d("AppArch", "该应用无Native库,使用设备架构: " + Build.SUPPORTED_ABIS[0]); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
注意事项
- 权限说明:获取这些信息不需要额外权限,普通第三方应用都能正常访问
PackageManager的这些接口。 - 纯Java/Kotlin应用:这类应用没有编译的Native库,此时ABI字段会返回设备当前运行的架构(因为系统会用对应架构的ART虚拟机运行它)。
- 多架构APK:如果应用是包含多个架构的"胖APK",
supportedAbis数组会返回所有内置的架构类型,primaryCpuAbi则是设备实际优先加载的架构。
内容的提问来源于stack exchange,提问作者RevealedSoulEven




