如何只从AAR导入选定的本地库ABI?

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

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

请注意,我知道APK拆分 ,但这只能部分解决我的问题,即只有通过Play商店分发我的应用程序时才有效。 尽pipePlay商店支持Betatesting版本,但是更新后的APK的传播速度相当缓慢,所以在推出应用程序的PlayStoretesting版频道更新之前,我们会通过Crashlytics的beta版本更新系统推送更新版本,速度更快。 问题是Crashlytics的分配系统不支持APK分割(或者我错了吗?)。 因此,我实际上需要构build一个只包含选定ABI的“通用”APK。 如何实现?

尽pipe即使Crashlytics特定的答案(例如,如何通过他们的beta版渠道分发APK分裂),我也会满意,但是对于构build仅包含选定ABI的“通用”APK的解决scheme,我会更加满意,因为我们公司还向我们的客户提供SDK作为仅包含受支持体系结构的AAR存档,并且当我们的SDK与具有不同ABI支持的其他SDK集成时,我们想要告诉他们如何处理案例。

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

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

这适用于我:

(例如:只有armeabiarmeabi-v7a

的build.gradle

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

gradle.properties

 android.useDeprecatedNdk=true; 

迈克从织物和Crashlytics在这里。 使用Splits,目前,我们并不知道提供哪种密度的testing仪,所以只需将这一行添加到您的特定风味或变体中即可使用生成的通用APK。

ext.betaDistributionApkFilePath =“通用分裂APK的path”

此外,如果您使用的是NDK崩溃报告,以防万一您看到的崩溃, 请查看此链接。

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

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

这里的技巧是将universalApk设置为true ,以便只生成一个包含所有已定义体系结构的APK,而不是将它们分成几个APK。