如何防止Android中的多Dex

时间:2016-11-08 16:25:36

标签: android aar multidex

我们使用Java开发了一个android库(aar),它依赖于android支持库v4。实际上,我们已经扩展了ViewPagerandroid.support.v4.view.ViewPager)类并在库的GUI中使用它。

我们已经在库中应用了proguard,它可以与我们的测试应用程序一起运行,但是我们有一个客户已经用原生C ++开发了它的Android应用程序,他们将把我们的组件集成到他们的应用程序中,并且在构建时存在问题

他们在构建时收到com.android.dex.DexIndexOverflowException,这表明在一个dex中允许使用超过64K的方法。

他们要求我们使用更少或更小的依赖项,因为他们必须将我们的组件依赖项包含到他们的构建设置中,他们的一个建议是我们应该从android支持源中提取ViewPager并将其放入我们的组件中源代码。

现在问题是

  1. 如果我们从android源中提取ViewPager并将其添加到我们的 库源代码然后会减少方法的数量 防止提到异常?这样做是一种好习惯吗?
  2. 解决此问题的最佳方法是什么?
  3. 由于

3 个答案:

答案 0 :(得分:3)

  

如果我们从Android源代码中提取ViewPager并将其添加到我们的库源代码中,那么它会减少防止提到的异常的方法量吗?

可能不是,至少对release构建而言。您的客户应该已经配置了ProGuard,它将识别并删除通过库提取的不必要的代码。

  

这样做是一种好习惯吗?

没有。您的客户应该比这更清楚。

  

解决此问题的最佳方法是什么?

大多数情况下,这不是你的问题。这是您客户的问题。您的客户指责您,但您的问题中没有证据表明您的库是客户DEX方法参考的重要来源。

您的客户应该配置ProGuard,您的客户应该使用Android Studio 2.2+中的APK Analyzer来查看其方法引用的来源。

您在图书馆中可以:

  • 尝试使用比support-v4更集中的依赖关系。 ViewPager本身位于support-core-ui工件中。但是,如果您使用的是FragmentPagerAdapterFragmentStatePagerAdapter,则还需要support-fragment(如果您使用的是这些类的v4版本)或{{1} (如果您使用的是这些类的support-v13版本。)

  • 在您创建的使用您的库的某个演示项目上使用APK Analyzer,这样您就可以看到您的库使用了多少个DEX方法引用,以查看您是否真的是此类引用的重要来源。 / p>

  • 为您的客户建议保留所需类别的ProGuard设置,以帮助他们有效地使用ProGuard。

答案 1 :(得分:0)

您可以在jumboMode文件中设置build.gradle,如下所示:

dexOptions {
    jumboMode true
}

此选项允许您在.dex文件中包含32位宽的字符串引用。因此,您可以在项目中使用2 ^ 32个引用的字符串。

希望它有所帮助。

答案 2 :(得分:0)

可用选项包括:

  1. 是的,您可以从支持库中提取ViewPagerViewPager从支持库导入一些也需要提取的文件。这将减少方法数量,但差异很大。
  2. 您还可以在exclude文件中的依赖项中使用build.gradle参数。
  3.     compile ('com.android.support:recyclerview-v7:+') {
            exclude module: 'support-v4'
        }