我打算从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(+通用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,现在.apks存档中没有x86_64 APK版本...如果没有RenderScript
支持,是否应该忽略它?我仍在使用VrPanoramaView
,并且每个ABI可能都有一些特定的NDK代码(在GitHub上看不到)...可悲的是,我没有用于测试和nom的x86(32或64)设备害怕释放此捆绑包...我是否缺少smth,我甚至需要_64版本吗?
答案 0 :(得分:1)
编辑:
在build.gradle中删除这两个选项将删除RenderScript使用的本机库:librsjni.so
和libRSSupport.so
。对于所有ABI,将删除这两个库。
自从禁用RenderScript之后,您仍然有3个ABI,看来您的应用程序依赖于其他使用本机代码的库,但没有提供x86_64体系结构的库,这就是x86_64目录消失的原因。这可能意味着您的应用之前从未在x86_64上正常运行,因为平台将加载x86_64目录,但某些本机库将丢失。
最终,您应该确定哪个库带来了这些本机库,并查看它们是否也可以构建64位版本,但是在短期内,由于x86_64设备也支持x86(32位)库,因此一切都不会中断。 / p>
上一篇文章:
如果您的APK中有任何*.bc
文件,则64位库将从APK中删除,因为这些RenderScript文件仅为32位,并且无法在64位进程中加载。
如果您迁移到RenderScript的最新版本,则不会生成*.bc
文件,并且64位本机库将再次出现在APK中。或者,如果您根本不需要RenderScript,请完全删除这些文件。