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

时间:2016-05-12 15:52:33

标签: 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 - 想知道特定库会为您的应用添加多少方法?只需在此网站上输入'compile'语句,它就会告诉您它的方法计数,依赖关系,JAR大小和DEX大小。
  3. Android Studio插件 - 这个优秀的插件会在Android Studio中显示每个依赖项的方法计数。
  4. 使用MultiDex支持库 如果您使用的是Android Studio,则此过程非常简单。如果不是,我强烈建议迁移,因为谷歌可能会很快放弃对Eclipse ADT插件和旧的基于Ant的构建系统的支持。
  5. 第1步

    在build.gradle

    中添加MultiDex支持库的依赖项
    dependencies { 
    ... 
       compile 'com.android.support:multidex:' 
       ... 
    }
    

    第2步

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

    defaultConfig { 
       ... 
    multiDexEnabled true 
    ... 
    }
    

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

    如果您尚未创建自己的Application类,只需在android.support.multidex.MultiDexApplication

    中将AndroidManifest.xml声明为您的应用程序类
       .... 
       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); 
       } 
    }
    

5 个答案:

答案 0 :(得分:10)

您可以打开终端并运行命令 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

答案 1 :(得分:6)

嘿,你可以尝试我的技巧,它可能对你有用

  1. 首先,您应该避免使用外部库。就像在库中具有相同的依赖关系一样。因此,尝试将该库与Android应用程序代码合并。 由于这为方法节省了很多空间。

  2. 使用有用的依赖项和库,例如,如果您想要Google Play服务,那么只包括有用的服务。参见示例

    compile "com.google.android.gms:play-services-location:9.4.0"
    compile "com.google.android.gms:play-services-maps:9.4.0" 
    
  3. 避免这个

    compile 'com.google.android.gms:play-services:9.4.0'
    
    1. 删除不需要的依赖项。在代码中使用非常可选择的依赖项。

    2. 如果所有方法都不能正常工作,那么请在代码中使用multidex。但它会创建多个dex文件。因此,您的代码将花费大量时间进行编译。

    3. 谢谢希望这会对你有所帮助。

答案 2 :(得分:4)

 defaultConfig
 {    
     multiDexEnabled true 
 }

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

并将此方法添加到您的应用程序类

@Override
protected void attachBaseContext(Context newBase) {

    super.attachBaseContext(newBase);

    MultiDex.install(this);
}

答案 3 :(得分:2)

点击文件然后点击项目结构点击弹出窗口左下方的应用。您将看到多个标签点击依赖关系标签然后点击右侧的加号选择图书馆依赖搜索您的欲望图书馆它将显示那些图书馆可在IDE中使用

答案 4 :(得分:2)

尽管使用Multidex Support Library库解决了这个问题,但它并不完美。要做的第一件事应该是确定您的应用程序当前有多少方法,以及每个依赖项添加了多少方法。之前您必须手动执行此操作,但现在有许多工具可供使用:

  1. 使用Gradle插件 - This是一个非常容易使用的Gradle插件,一段时间后会列出包的方法数和总数。您可以找到有关它的更多信息here
  2. www.methodscount.com - 只需在此网站上输入‘compile’语句即可告诉您方法计数,依赖关系,JAR大小和DEX大小。
  3. Android Studio插件 - 这个优秀的plugin显示了Android Studio中每个依赖项的方法计数。
  4.   

    无论您最终使用什么工具,都要使用它的信息   提供对您的应用程序的依赖项执行审计。你应该   寻找未使用的库或可以最小化甚至是最小的库   替换为您自己更简单的解决方案。如果您没有使用Proguard   删除未使用的代码,首先启用它,看看它是否解决了   问题(检查this)。使用Proguard很好......不好玩,但是一旦你成功了   它工作正常,它将显着减少方法数量。我摔倒   否则失败,您将不得不使用MultiDex支持库。

    查看gradle任务以删除Google Play服务库上未使用的包。

    <强>结论

    虽然Multidex Support Library在大多数情况下解决了DEX 64K问题,但应将其视为最后的手段。在尝试使用它之前,您应该审核项目是否存在不需要的依赖项,并使用ProGuard删除尽可能多的未使用的代码。如果您继续使用它,请确保在旧设备上测试您的应用程序。

    希望这会对你有所帮助。