Android应用程序包-> APK不包含必需的本机库

时间:2018-06-29 00:26:38

标签: android google-play android-app-bundle

我正在使用新的应用程序捆绑包格式(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就大...

对于尚未了解Google Play如何将应用捆绑包拆分为APK的用户,以下是屏幕截图: enter image description here

1 个答案:

答案 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' }