我有一点不寻常的问题 - 我的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。
答案 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。