【问题标题】:How to import only selected native library ABIs from AAR?如何从 AAR 仅导入选定的本机库 ABI?
【发布时间】:2015-09-05 22:07:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 查看产品风味中的ndk.abiFilter/defaultConfig DSL 是否会让你指定多个项目。我看到的例子只列出了一个。如果它确实接受逗号分隔的列表,那可能会解决您的问题。
  • 我在stackoverflow上问了一个问题。如果我在 abiFilter 中指定多个 ABI 说 DSL 方法“abiFilter”不存在,则会出现 gradle 错误。我什至尝试将多个 ABI 放在单个字符串中的 abiFilter 中,但这也不起作用 - 它使 APK 根本没有原生库。

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


【解决方案1】:
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'
}

【讨论】:

  • 好主意!我会尽快试试这个。
  • 这就像一个魅力,解决了我的问题。但是,如果它与通配符一起使用会更好......
  • packagingOptions { exclude '/lib/mips64/**' exclude '/lib/arm64-v8a/**' exclude '/lib/x86_64/**' }
【解决方案2】:

这对我有用:

(例如:仅 armeabiarmeabi-v7a

build.gradle

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

【讨论】:

  • 在不添加 gradle.properties 设置的情况下工作
【解决方案3】:

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

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

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

【讨论】:

  • 嗨迈克!我们已经通过 Crashlytics 分发了通用拆分 APK。是否可以像通过 PlayStore 一样分别分发 x86 和 armv7 拆分 - 通过为不同拆分指定不同的版本代码?然后,您的 Beta 版应用能否解决应在设备上下载和安装的 APK 版本?崩溃报告适用于 APK 拆分,前提是它们是通过 PlayStore 分发的,而不是通过 Crashlytics Beta 分发的。理想情况下,我只想告诉 gradle 仅使用 AAR 中的 armv7 和 x86 本机库。
  • 感谢您提供这些额外的详细信息,目前我们没有办法支持这一点,但我已经与团队分享了这个想法。
  • @MikeBonnell 是否仍支持 betaDistributionApkFilePath?我需要设置自定义 apk 名称,但也需要上传到 fabric/crashlytics。我确实确保在运行之前设置了 betaDistributionApkFilePath :app:crashlyticsUploadDistribution{$variant.name}?
  • 是的,它仍然受支持。另一种方法是使用 Fastlane.tools - github.com/fastlane/fastlane/tree/master/supply#readme
【解决方案4】:

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

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

其中的技巧是将universalApk 设置为true,以便仅生成一个具有所有已定义架构的APK,而不是将它们拆分为多个APK。

也不要忘记 reset() 删除所有默认值。

【讨论】:

  • 这不起作用。在我的应用程序中,我包含了“x86”、“armeabi-v7a”、“arm64-v8a”,但我的通用 APK 仍然包含“armeabi”、“mips”、“mips64”和“x86_64”。我的通用 APK 中只需要“x86”、“armeabi-v7a”和“arm64-v8a”。
  • 它对我来说很好......我正在使用 Android Gradle 插件 1.3.1,目标 SDK 22 和 Build Tools 版本 23.0.2。此外,它更改了最终 apk 文件的名称,现在应该将其命名为“-universal-.apk”。每个库还应该有一个,例如“-x86-.apk”(那些不是您想要的)。那么,如果您还没有清理干净,也许您正在尝试使用旧文件?
  • Jorge,如果你解压“-universal-.apk”,APK里面的“lib”文件夹的内容是什么?对我来说,这个文件夹包含我不想要的架构(例如“mips”和“armeabi”),即使我只包含“armeabi-v7a”和“x86”。
  • @DoDo 抱歉回复晚了。解压缩 apk 后,我只看到 lib 文件夹中的 armeabi-v7ax86 文件夹。你有没有像我在示例中提到的那样包含reset() 调用?
  • 回复晚了?!? 3 年零 5 个月过去了:-P。我很确定我在报告它不起作用之前的几天里复制粘贴了你的代码。然而,@mksaint13 的解决方案非常有效(直到今天仍然有效)。
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多