android - 如何通过导入正确的库来避免 DEX 64K LIMIT

标签 android gradle android-support-library android-appcompat android-multidex

我遇到了这个问题,在编译我使用的所有库时,我溢出了 Dalvik 中的 64k 方法限制。当我导入支持库时,我开始遇到这个问题,因为有些已经包含在其他库中,最终超出了限制。

有没有办法验证一个库是否在当前项目中未使用或已经通过另一个库依赖项导入?

目前,我排除了那些我确定知道的人,但必须手动执行此操作似乎很奇怪。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:multidex:1.0.1'
    compile "com.android.support:percent:${supportLibVersion}"
    compile("com.android.support:design:${supportLibVersion}") {
        exclude module: 'support-v4'
    }
    compile("com.android.support:cardview-v7:${supportLibVersion}") {
        exclude module: 'support-v4'
    }

    compile('com.github.nkzawa:socket.io-client:0.4.1') {
        exclude group: 'org.json', module: 'json'
    }
    compile('com.astuetz:pagerslidingtabstrip:1.0.1') {
        exclude module: 'support-v4'
    }
//...
}

目前的解决方案:

  1. 使用 Gradle 插件 – 前段时间我们编写了一个非常易于使用的 Gradle 插件,它按包列出了方法的数量以及总数。您可以在此处找到更多相关信息。
  2. www.methodscount.com – 想知道一个特定的库将向您的应用程序添加多少种方法?只需在此网站上输入“编译”语句,它就会告诉您它的方法数、依赖项、JAR 大小和 DEX 大小。
  3. Android Studio 插件 – 这个出色的插件显示了 Android Studio 中每个依赖项的方法数。
  4. 使用 MultiDex 支持库 如果您使用的是 Android Studio,则该过程非常简单。如果您不是,我强烈建议您迁移,因为 Google 可能很快就会放弃对 Eclipse ADT 插件和旧的基于 Ant 的构建系统的支持。

第一步

在 build.gradle 中添加 MultiDex 支持库的依赖

dependencies { 
... 
   compile 'com.android.support:multidex:' 
   ... 
}

第 2 步

通过在 gradle 配置的 buildType 或 productFlavor 部分设置 multiDexEnabled 标志来启用多 dexing。

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

现在根据您的项目,您有 3 个选项:

如果您还没有创建自己的 Application 类,只需在 AndroidManifest.xml 中将 android.support.multidex.MultiDexApplication 声明为您的应用程序类即可

   .... 
   android:name="android.support.multidex.MultiDexApplication" 
   ... 

如果您已经有自己的 Application 类,请让它扩展 android.support.multidex.MultiDexApplication 而不是 android.app.Application

如果您的 Application 类正在扩展某个其他类,而您不想或不能更改它,请重写 attachBaseContext(),如下所示:

public class MyApplication extends FooApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 
}

最佳答案

您可以打开终端并运行命令 gradlew app:dependencies 来测试哪些依赖项已经包含在其他依赖项中作为项目的传递依赖项以及每个依赖项的各自版本。

例如,我为我使用的 com.android.support:design 库的一个项目获得了以下依赖关系图表:

+--- com.android.support:design:23.3.0
|    +--- com.android.support:appcompat-v7:23.3.0
|    |    +--- com.android.support:support-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-v4:23.3.0
|    |    |         \--- com.android.support:support-annotations:23.3.0
|    |    +--- com.android.support:animated-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-vector-drawable:23.3.0 (*)
|    |    \--- com.android.support:support-v4:23.3.0 (*)
|    +--- com.android.support:support-v4:23.3.0 (*)
|    \--- com.android.support:recyclerview-v7:23.3.0
|         +--- com.android.support:support-v4:23.3.0 (*)
|         \--- com.android.support:support-annotations:23.3.0

关于android - 如何通过导入正确的库来避免 DEX 64K LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37191869/

相关文章:

java - 如何在 Spring Boot Gradle 项目的 .jar 根目录中构建文件夹?

gradle - NaN 中的错误,但它们指向不同的模块。 ... Webpack 无法区分上下文,并且无法加载正确的上下文

android - 从 gradle 构建 Android 项目时找不到参数的方法 android()

android - 使用任何 Android 设计支持库元素时出错

android - 将支持库布局属性提取到样式中

javascript - 我可以从 android 浏览器 JavaScript 中获取哪些信息?

android - 如何安装 bundletool?

android - Android Widget 的高程(阴影)

android - GridLayoutManager setSpanSizeLookup 不工作

android - 怎么把文件存到sd卡