我正在使用新的应用程序捆绑包格式(aab)发布应用程序。该应用程序包括一些用于armeabi-v7a的本地库。当我在arm64-v8a架构上通过Google Play安装该应用程序时,它不包含没有arm64-v8a本地文件的本地库。
根据此https://stackoverflow.com/a/39622499/534471,armeabi-v7a库应在arm64-v8a设备上运行(并且通过adb安装时可以正常工作,因此确实可以工作)。
Google Play控制台按体系结构,屏幕密度等显示了不同的apk。从apk的大小中,我可以清楚地看出哪些不包括本机库。我还使用本机libs Monitor应用程序来分析已安装的apk,并且它显然不包括我需要的本机库(如果该应用程序具有arm64-v8a so文件,则它包括arm64-v8a本机库,但如果只有armeabi,则不包括-v7a版本)。
我的gradle构建文件包括以下用于捆绑包配置的小段代码:
bundle {
language {
enableSplit = false
}
density {
enableSplit = true
}
abi {
enableSplit = true
// include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
现在这是我的问题:是否有办法告诉构建工具在每个apk中包括“次优”本机库,次优是可以在特定体系结构上运行的最接近版本?
PS:如果我为abi设置enableSplit = false,则它将包括本机库(如预期的那样),但不幸的是,对于包括x86在内的所有平台,仅20MB就大...
答案 0 :(得分:5)
没有必要告诉工具提供次佳的服务,这应该自动完成。如果该设备报告还支持armeabi-v7a,则它应该会收到包含该设备的APK。
编辑:
鉴于您的屏幕截图,您的应用似乎为arm64-v8a
体系结构提供了本机库,因此将提供arm64-v8a
库而不是armeabi-v7a
库。
还请注意,一台设备无法为同一应用加载来自不同体系结构的库,即,您不能期望某些库以64位加载而另一些库以32位加载。即使使用包含所有ABI的“胖” APK,Android平台也只会在安装应用后选择一个ABI并丢弃所有其他文件,因此从您为arm64-v8a
提供至少一个库的那一刻起, armeabi-v7a
库将永远加载到arm64-v8a
设备上。
编辑:
如果您无法为该架构提供所需的本机库,则应考虑从应用程序中排除某些ABI。这可以使用gradle配置中的abiFilters
块来实现:
ndk { abiFilters 'armeabi-v7a', 'x86' }