You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否通过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

火山引擎 最新活动