Android app bundle -> apk 不包含必需的本机库

Android app bundle -> apk doesn't include required native library

我正在使用新的应用程序包格式 (aab) 发布应用程序。该应用程序包含一些 armeabi-v7a 的本机库。当我通过 Google 在 arm64-v8a 架构上播放安装应用程序时,它不包含没有 arm64-v8a so 文件的本地库。

根据这个 ,armeabi-v7a 库应该 运行 在 arm64-v8a 设备上(通过 adb 安装时它工作正常,所以它确实工作)。

Google Play 控制台按架构、屏幕密度等显示不同的 apk。从 apk 大小我可以清楚地分辨出哪些不包含本机库。我还使用本机库监视器应用程序来分析已安装的 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 中包含 "next best" 本机库,其次最好是最接近 运行 特定架构的版本?

PS:如果我为 abi 设置 enableSplit = false 那么它将包含本机库(如预期的那样)但不幸的是对于包括 x86 在内的所有平台,它本身就有 20MB 大...

对于那些还没有看到 Google Play 如何将应用程序包拆分为 apk 的人,这里是屏幕截图:

无需告诉工具提供次佳服务,这应该自动完成。如果设备报告也支持 armeabi-v7a,它应该会收到包含它的 APK。

编辑:

根据您的屏幕截图,您的应用似乎为 arm64-v8a 架构提供了本机库,因此将提供 arm64-v8a 个库,而不是 armeabi-v7a 个库。

另请注意,一台设备无法为同一应用加载不同架构的库,即您不能指望某些库以 64 位加载而另一些以 32 位加载。即使 "fat" APK 包含所有 ABI,Android 平台在安装您的应用后也只会 select 一个 ABI 并丢弃所有其他文件,因此从您提供至少一个 ABI 的那一刻起arm64-v8a、none 的 armeabi-v7a 库将永远加载到 arm64-v8a 设备上。

编辑

如果您不能为该架构提供所需的本机库,您应该考虑从您的应用中排除一些 ABI。这可以使用 gradle 配置中的 abiFilters 块来实现:

ndk { abiFilters 'armeabi-v7a', 'x86' }