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

时间:2015-06-19 20:00:16

标签: android gradle android-gradle crashlytics crashlytics-beta

我有一点不寻常的问题 - 我的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构建时,它包含第三方库的所有ABI,并且只有我的本机代码的x86和armeabi-v7a ABI。这会导致我的应用程序在像Galaxy S6这样的arm64设备上启动时崩溃。

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

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

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

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

4 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:20)

这对我有用:

(例如:仅 armeabi & armeabi-v7a

<强>的build.gradle

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

答案 2 :(得分:4)

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

ext.betaDistributionApkFilePath =&#34;通用分割的路径APK&#34;

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

答案 3 :(得分:-2)

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

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

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