如何仅从 AAR 导入选定的本机库 ABI?

How to import only selected native library ABIs from AAR?

我有一个不寻常的问题 - 我的 Android 应用程序包含原生库,我为 armeabi-v7a 和 x86 构建了原生库。但是,现在我需要将第三方库集成到我的应用程序中,该应用程序还包含本机库(第三方库是 Crashlytics,我通过 build.gradle. 中的 Maven 将其包含在内)。问题是第三方库的 AAR 提供了所有架构(armeabi、arm64-v8a、armeabi-v7a、mips、mips64、x86 和 x86_64),而我的应用仅支持 armeabi-v7a 和 x86(计划中有 arm64-v8a)在不久的将来),所以当构建最终的 apk 时,它包含第 3 方库的所有 ABI,并且只有我的本机代码的 x86 和 armeabi-v7a ABI。这会导致我的应用程序在像 Galaxy S6 这样的 arm64 设备上启动时崩溃。

我的问题是:是否可以仅包含来自第 3 方 AAR 的选定 ABI?

请注意,我知道 APK splits,但这只能部分解决我的问题,即只有当我通过 Play 商店分发我的应用程序时它才有效。虽然 Play Store 支持 beta 测试分发,但更新的 APK 传播速度相当慢,因此在将更新推送到应用程序的 PlayStore beta 频道之前,我们通过 Crashlytics 的 beta 分发系统推送更新,这样速度要快得多。问题是 Crashlytics 的分发系统不支持 APK 拆分(或者我错了吗?)。因此,我实际上需要构建一个仅包含选定 ABI 的 "universal" APK。如何实现?

尽管我对 Crashlytics 的特定答案感到满意(例如,如何通过他们的测试版渠道分发 APK 拆分),但我对构建 "universal" APK 的解决方案更满意仅包含选定的 ABI,因为在我们公司,我们还向客户提供 SDK 作为仅包含受支持架构的 AAR 存档,我们希望指导他们在将我们的 SDK 与支持不同 ABI 的其他 SDK 集成时如何处理。

我正在使用最新的稳定版 Android studio (1.2.1.1)、gradle 2.4 和 android gradle 插件版本 1.2.3。

来自 Fabric 和 Crashlytics 的 Mike。目前,对于 Splits,我们并不知道要为测试人员提供哪种密度,因此只需将此行添加到您的特定风格或变体中,即可使用生成的通用 APK。

ext.betaDistributionApkFilePath = "path to the universal split APK"

此外,如果您正在使用 NDK 崩溃报告,以防它与您看到的崩溃相匹配,check out this link.

我遇到了和你一样的问题,但你确实在你发布的关于 APK Splits 的 link 上帮助了我! 在您的情况下,尝试将以下内容添加到 android 闭包内的 build.gradle 中:

    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'x86'
            universalApk true
        }
    }

其中的诀窍是将 universalApk 设置为 true 以便仅生成一个具有所有已定义架构的 APK,而不是将它们拆分为多个 APK。

另外不要忘记删除所有默认值的 reset()

packagingOptions {
    exclude 'lib/arm64-v8a/libcrashlytics-envelope.so'
    exclude 'lib/arm64-v8a/libcrashlytics.so'
    exclude 'lib/armeabi/libcrashlytics-envelope.so'
    exclude 'lib/armeabi/libcrashlytics.so'
    exclude 'lib/mips64/libcrashlytics-envelope.so'
    exclude 'lib/mips64/libcrashlytics.so'
    exclude 'lib/mips/libcrashlytics-envelope.so'
    exclude 'lib/mips/libcrashlytics.so'
    exclude 'lib/x86_64/libcrashlytics-envelope.so'
    exclude 'lib/x86_64/libcrashlytics.so'
}

这对我有用:

(例如:仅 armeabi & armeabi-v7a

build.gradle

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "armeabi-v7a"
        }
    }
}