我打算从ABI拆分迁移到App Bundle功能。目前我正在使用此代码:
def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]
splits {
abi {
enable true
reset()
include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
// "armeabi", "mips", "mips64" last three not needed and not supported currently
universalApk true
}
}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
if (abi != null) {
output.versionCodeOverride =
abi * 1000 + variant.versionCode
}
}
}
每个ABI提供4个APK(+通用一个)。使用此代码的原因是减少应用程序大小,因为PanoWidget(使用NDK)和
renderscriptTargetApi 28
renderscriptSupportModeEnabled true
删除拆分配置(+4001到versionCode
)并构建Bundle后,我得到.aab文件,转换为.apks(使用bundletool)包含文件夹standalones/
。在里面我有四种“APK”,适用于x86,x86_64,armeabi-v7a和arm64-v8a ABI。现在一切都很好看。
现在我注意到应用程序代码根本没有使用RenderScript
,所以我认为使用supportMode
和targetApi
是多余的。我删除了这两行,在设备/模拟器上测试,一切正常。接下来我正在制作Bundle,现在它内部没有x86_64 APK版本.apks存档...如果没有RenderScript
支持,是否应该省略?我还在使用VrPanoramaView
,它可能为每个ABI都有一些特定的NDK代码(不要在GitHub上看到)......可悲的是我没有x86(32或64)设备用于测试和nom我害怕发布这个Bundle ...我错过了什么,我甚至需要_64版本?
编辑:
删除build.gradle中的这两个选项将删除RenderScript使用的本机库:librsjni.so
和libRSSupport.so
。将删除所有ABI的这两个库。
由于在禁用RenderScript之后,您仍然有3个ABI,看起来您的应用程序依赖于使用本机代码的其他库,但是不提供x86_64体系结构的库,这就是x86_64目录消失的原因。这可能意味着您的应用程序从未在x86_64上正常工作,因为x86_64目录将由平台加载,但某些本机库将丢失。
最终,您应该确定哪个库带来了这些本机库,并查看它们是否也可以构建64位版本,但在短期内,由于x86_64设备也支持x86(32位)库,因此不会有任何损失。
上一篇文章:
如果您的APK中有任何*.bc
文件,则会从APK中删除64位库,因为这些RenderScript文件仅为32位且无法在64位进程中加载。
如果迁移到更新版本的RenderScript,则不会生成*.bc
文件,并且将在APK中再次显示64位本机库。或者,如果您根本不需要RenderScript,则完全删除这些文件。