Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何仅从AAR导入选定的本机库ABI?_Android_Gradle_Android Gradle Plugin_Crashlytics_Crashlytics Beta - Fatal编程技术网

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

Android 如何仅从AAR导入选定的本机库ABI?,android,gradle,android-gradle-plugin,crashlytics,crashlytics-beta,Android,Gradle,Android Gradle Plugin,Crashlytics,Crashlytics Beta,我有一个不寻常的问题——我的Android应用程序包含本机LIB,我为armeabi-v7a和x86构建本机LIB。但是,现在我需要将第三方库集成到我的应用程序中,该应用程序也包含本机库(第三方库是我在build.gradle中通过Maven包含的)。问题是,第三方库的AAR提供了所有的ARHIT体系结构(armeabi、arm64-v8a、armeabi-v7a、mips、mips64、x86和x86_64),而我的应用程序只支持armeabi-v7a和x86(arm64-v8a计划在不久的将

我有一个不寻常的问题——我的Android应用程序包含本机LIB,我为armeabi-v7a和x86构建本机LIB。但是,现在我需要将第三方库集成到我的应用程序中,该应用程序也包含本机库(第三方库是我在build.gradle中通过Maven包含的)。问题是,第三方库的AAR提供了所有的ARHIT体系结构(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

请注意,我知道,但这只能部分解决我的问题,也就是说,只有通过Play Store分发我的应用程序,它才能工作。虽然Play Store支持beta测试分发,但更新后的APK的传播速度相当慢,因此在将更新推送到应用程序的Play Store beta频道之前,我们通过Crashlytics的beta分发系统推送更新,这要快得多。问题是Crashlytics的分发系统不支持APK拆分(还是我错了?)。因此,我实际上需要构建一个“通用”APK,它只包含选定的ABI。如何做到这一点

尽管我甚至对Crashlytics的特定答案(例如,如何通过测试版渠道分发APK拆分)感到满意,但对于构建只包含选定ABI的“通用”APK的解决方案,我会更加满意,因为在我们公司,我们还将SDK作为AAR档案提供给我们的客户,这些档案只包含受支持的体系结构,我们希望指导他们在将我们的SDK与支持不同ABI的其他SDK集成时如何处理这种情况


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

这里是Fabric和Crashlytics的Mike。对于Splits,目前我们还不知道测试仪提供的密度,所以只需将这一行添加到您的特定口味或变体中,即可使用生成的通用APK

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


另外,如果您使用的是NDK崩溃报告,以防它与您看到的崩溃相匹配,

我遇到了与您相同的问题,但您实际上在发布的链接中帮助了我! 在您的情况下,尝试将以下内容添加到
android
闭包中的build.gradle中:

    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'x86'
            universalApk true
        }
    }
其中的诀窍是将
universalApk
设置为
true
,以便只生成一个包含所有已定义架构的APK,而不是将它们拆分为多个APK

另外,不要忘记清除所有默认值的
reset()

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

查看product flavor/
defaultConfig
DSL中的
ndk.abiFilter
是否允许您指定多个项目。我看到的例子只有一个。如果它接受逗号分隔的列表,这可能会解决您的问题。我在stackoverflow上问了一个问题。如果我在abiFilter中指定多个abi,表示DSL方法“abiFilter”不存在,则会出现gradle错误。我甚至尝试将多个ABI放在abiFilter的单个字符串中,但这也不起作用-它使APK根本没有本地库。嗨,迈克!我们已经通过Crashlytics发布了universal split APK。是否可以像通过PlayStore一样,通过为不同的拆分指定不同的版本代码,分别分发x86和armv7拆分?然后,您的测试版应用程序能否解决应该在设备上下载和安装哪个APK版本?如果通过PlayStore而不是Crashlytics Beta分发,则崩溃报告可以与APK拆分一起使用。理想情况下,我只想告诉gradle只使用AAR中的armv7和x86本机库。感谢这些额外的细节,目前我们还没有办法支持这一点,但我已经与团队分享了这个想法。@MikeBonnell是否仍然支持betaDistributionApkFilePath?我需要设置自定义apk名称,但也需要上传到fabric/crashlytics。。我确保在运行app:crashlyticsUploadDistribution{$variant.name}之前设置了BetadistributionAppFilePath?是的,它仍然受支持。另一种方法是使用Fastlane.tools-这不起作用。在我的应用程序中,我包含了“x86”、“armeabi-v7a”、“arm64-v8a”,但我的通用APK仍然包含“armeabi”、“mips”、“mips64”和“x86_64”。在我的通用APK中,我只需要“x86”、“armeabi-v7a”和“arm64-v8a”。它对我很好用。。。我正在使用Android Gradle插件1.3.1,目标是SDK 22和构建工具版本23.0.2。此外,它还更改了最终apk文件的名称,现在应该称为“-universal-.apk”之类的名称。每个库也应该有一个,例如“-x86-.apk”(这些不是您想要的)。因此,如果您没有进行清理,那么可能您正在尝试使用旧文件?Jorge,如果您解压缩“-universal-.apk”,apk中“lib”文件夹的内容是什么?对我来说,此文件夹包含我不想要的架构(如“mips”和“armeabi”),尽管我只包含了“armeabi-v7a”和“x86”。@DoDo很抱歉回复太晚。解压apk后,我只看到
lib
文件夹中的
armeabi-v7a
x86
文件夹。您是否包括了我在示例中提到的
reset()?!?3年零5个月过去了:-P.我很确定我在报告它不起作用之前的几天复制粘贴了你的代码。然而,@mksaint13的解决方案起到了很好的效果(直到今天仍然有效)。去吧