Android App Bundle中平台特定Assets文件未按预期拆分问题
问题分析与解决方案
核心原因
bundletool 默认仅会对 lib 目录下符合Android约定结构的 .so 文件进行ABI维度拆分,不会自动识别assets目录下的ABI子目录并关联到对应平台拆分规则。你看到的所有平台特定Assets被打包进base-master.apk,是因为这些文件没有被标记为某一ABI专属资源,默认会被归入基础包。
解决方案一:通过Gradle配置关联Assets与ABI
在App模块的build.gradle(或build.gradle.kts)中,明确配置ABI拆分规则,并将对应目录的Assets绑定到指定ABI:
Groovy 版本
android { // 启用ABI拆分 splits { abi { enable true reset() include 'arm64-v8a', 'armeabi-v7a' // 按需添加需要支持的ABI universalApk false // 不生成通用APK } } // 配置Bundle的Assets过滤规则,关联ABI与对应Assets目录 bundle { abi { each { abi -> assetFilter { include "assets/${abi.name}/**" } } } } }
Kotlin DSL 版本
android { splits { abi { isEnable = true reset() include("arm64-v8a", "armeabi-v7a") isUniversalApk = false } } bundle { abi { each { abi -> assetFilter { include("assets/${abi.name}/**") } } } } }
配置完成后重新构建AAB,再用bundletool执行build-apks命令,对应ABI的Assets就会被打包到base-$PLATFORM.apk中。
解决方案二:使用Asset Packs(适合大型资源)
如果平台特定Assets体积较大,推荐创建独立的Asset Pack模块,每个模块对应一个ABI,实现更清晰的资源管理:
创建Asset Pack模块:
新建一个模块(例如命名为asset-arm64-v8a),其build.gradle配置如下:plugins { id 'com.android.asset-pack' } android { namespace "com.yourpackage.assetarm64v8a" assetPack { packName = "asset-arm64-v8a" dynamicDelivery { deliveryType = "install-time" // 随App安装时交付,也可设为on-demand按需下载 filters { abi("arm64-v8a") } } } }将
arm64-v8a对应的.py文件放入该模块的src/main/assets目录,同理创建对应armeabi-v7a的Asset Pack模块。主App模块依赖Asset Packs:
在主App的build.gradle中添加依赖:dependencies { implementation assetPack project(':asset-arm64-v8a') implementation assetPack project(':asset-armeabi-v7a') }
验证方法
执行build-apks时,可以指定设备配置来验证拆分结果:
# 获取当前连接设备的配置文件 bundletool get-device-spec --output=device-spec.json # 基于设备配置生成APKs bundletool build-apks --bundle=app.aab --output=app.apks --device-spec=device-spec.json
解压生成的APKs文件,即可看到对应ABI的Assets已被打包到平台专属APK中。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

