30

我有一个不寻常的问题 - 我的 Android 应用程序包含本机库,我为 armeabi-v7a 和 x86 构建本机库。但是,现在我需要将第三方库集成到我的应用程序中,该应用程序还包含本机库(第三方库是Crashlytics,我通过 Maven 从我的 build.gradle 中包含。)。问题是第三方库的 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 设备上启动时崩溃。

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

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

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

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

4

4 回答 4

27
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'
}
于 2016-01-11T18:52:09.077 回答
22

这对我有用:

(例如:只有armeabiarmeabi-v7a

构建.gradle

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "armeabi-v7a"
        }
    }
}
于 2016-08-29T14:03:28.303 回答
4

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

ext.betaDistributionApkFilePath = "通用拆分 APK 的路径"

此外,如果您使用 NDK 崩溃报告,如果它与您看到的崩溃相匹配,请查看此链接。

于 2015-06-19T20:14:01.467 回答
-1

我和你有同样的问题,但你实际上帮助我发布了你发布的关于APK 拆分的链接!在您的情况下,尝试将以下内容添加到闭包内的 build.gradle 中android

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

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

也不要忘记reset()删除所有默认值的那个。

于 2015-12-14T20:25:36.403 回答