【问题标题】:Android app bundle -> apk doesn't include required native libraryAndroid 应用程序包 -> apk 不包含必需的本机库
【发布时间】:2018-12-08 02:50:07
【问题描述】:

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

根据https://stackoverflow.com/a/39622499/534471,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 中包含“次佳”本机库,次佳是可以在特定架构上运行的最接近的版本?

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

对于那些还没有看到 Google Play 如何将 app bundle 拆分为 apk 的人,这里有一个屏幕截图:

【问题讨论】:

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


    【解决方案1】:

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

    编辑:

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

    另请注意,一台设备无法为同一个应用加载不同架构的库,也就是说,您不能期望某些库以 64 位加载,而另一些库以 32 位加载。即使使用包含所有 ABI 的“胖”APK,Android 平台在安装您的应用程序时只会选择一个 ABI 并丢弃所有其他文件,因此从您为arm64-v8a 提供至少一个库的那一刻起,@ 987654325@ 库将永远加载到arm64-v8a 设备上。

    编辑

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

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

    【讨论】:

    • “没有必要告诉工具提供次优服务,这应该自动完成”->这是我的期望。我认为这是 Google Play 中的一个错误,因为我可以看到它为所有拆分创建的 apk,而提供给我的设备的 apk 显然没有本机库。我会联系他们的支持人员。
    • 关于 ndkFilter。 Google Play 创建的 apk 包含 armeabi-v7a 本机库,但仅适用于提供给 armeabi-v7a 设备的 apk。我在问题中添加了一个屏幕截图以说明这一点。所以没有 abi 过滤器,或者没有带有 armeabi-v7a 本机库的 apk。
    • 我根据你的截图编辑了我的答案。我认为应用程序可以在一个设备上同时加载 32 位和 64 位的混合可能只是一种误解?
    • 提供给 arm64-v8a 设备的 apk 不包含任何本机库。 aab 文件只有 armeabi-v7a 的库。我期望 Google Play 为 arm64-v8a 设备创建 apk,包括 armeabi-v7a 库,因为该库也将在 arm64-v8a 上运行。
    • 好的,这样就可以了:ndk { abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'mips' }abi { enableSplit = true } 在捆绑配置中,通过 Google Play 部署,64 位设备接收 armeabi-v7a 库,一切正常,如果你想添加对于你的回答,我很乐意接受
    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多