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

DoD*_*oDo 28 android gradle crashlytics android-gradle-plugin crashlytics-beta

我有一个不寻常的问题 - 我的Android应用程序包含本机库,我为armeabi-v7a和x86构建了本机库.但是,现在我需要将第三方库集成到我的应用程序中,该应用程序还包含本机库(第三方库是Crashlytics,我从build.gradle中通过Maven包含它).问题是,第三方库的AAR提供了所有arhitectures(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拆分,但这只能部分地解决我的问题,即仅当我通过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.

小智 24

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'
}
Run Code Online (Sandbox Code Playgroud)

  • PackagingOptions { 排除 '/lib/mips64/**' 排除 '/lib/arm64-v8a/**' 排除 '/lib/x86_64/**' } (2认同)

Man*_*ger 20

这对我有用:

(例如:只有armeabiarmeabi-v7a)

的build.gradle

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "armeabi-v7a"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在不添加gradle.properties设置的情况下工作 (4认同)