You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android是否提供ABI专属资源限定符用于APK拆分?

针对按ABI拆分APK并使用专属资源限定符的解决方案

好问题!Android确实提供了ABI专属的资源限定符,完全可以解决你按不同ABI分发对应Python二进制文件、控制APK体积的需求。

1. 官方支持的ABI资源限定符

Android系统原生支持以下常见CPU架构对应的资源限定符:

  • armeabi-v7a:32位ARM架构(适配多数旧款Android设备)
  • arm64-v8a:64位ARM架构(现代Android设备的主流选择)
  • x86:32位x86架构(适配模拟器或部分小众平板/设备)
  • x86_64:64位x86架构(适配高端x86设备或64位模拟器)

你可以直接用这些限定符命名资源子目录,以raw资源为例,目录结构应该是这样:

res/
├── raw-armeabi-v7a/
│   └── python_runtime.so  # 对应armeabi-v7a的Python二进制文件
├── raw-arm64-v8a/
│   └── python_runtime.so  # 对应arm64-v8a的Python二进制文件
├── raw-x86/
│   └── python_runtime.so  # 对应x86的Python二进制文件
└── raw-x86_64/
    └── python_runtime.so  # 对应x86_64的Python二进制文件

⚠️ 注意:所有ABI对应的二进制文件必须使用完全相同的文件名,这样系统会根据设备的CPU架构自动加载对应目录下的资源。

2. 配置Gradle启用ABI拆分

仅创建资源目录还不够,你需要在Module级别的build.gradle(或build.gradle.kts)中配置APK拆分规则,让Gradle为每个ABI生成独立的APK:

Groovy语法(build.gradle)

android {
    // ... 其他基础配置(compileSdk、defaultConfig等)

    splits {
        abi {
            enable true  // 开启ABI拆分功能
            reset()      // 清空默认的ABI包含列表
            include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'  // 指定要拆分的ABI类型
            universalApk false  // 可选:关闭通用APK生成(避免产出包含所有ABI的大包)
        }
    }

    // 可选:为拆分后的APK添加ABI标识,方便区分版本
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def abi = output.getFilter(com.android.build.OutputFile.ABI)
            if (abi != null) {
                outputFileName = "${variant.name}-v${variant.versionName}-${abi}.apk"
            }
        }
    }
}

Kotlin DSL语法(build.gradle.kts)

android {
    // ... 其他基础配置

    splits {
        abi {
            isEnable = true
            reset()
            include("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
            isUniversalApk = false
        }
    }

    applicationVariants.all {
        outputs.map { it as com.android.build.gradle.internal.api.ApkVariantOutputImpl }.forEach { output ->
            val abi = output.getFilter(com.android.build.OutputFile.ABI)
            if (abi != null) {
                output.outputFileName = "${name}-v${versionName}-${abi}.apk"
            }
        }
    }
}

3. 额外实用提示

  • 如果你使用Android App Bundle (AAB) 发布到Google Play,无需手动配置APK拆分——Google Play会自动根据用户设备的ABI、屏幕密度等特性,生成并分发最小化的适配APK,资源限定符依然会正常生效。
  • 务必保证Python二进制文件是针对对应ABI编译的,否则会出现加载失败或运行崩溃的问题。
  • ABI属于设备硬件特性类的资源限定符,匹配优先级高于语言、屏幕密度等,系统会优先选择与设备ABI完全匹配的资源目录。

内容的提问来源于stack exchange,提问作者Binoy Babu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:31:14