当应用代码和库代码代码超过64K限制时,早期版本的构建系统会出现如下提示:

XML/HTML代码
  1. Conversion to Dalvik format failed:  
  2. Unable to execute dex: method ID not in [0, 0xffff]: 65536  

  最近版本的构建系统会出现如下提示,指出同样的错误:

XML/HTML代码
  1. trouble writing output:  
  2. Too many field references: 131000; max is 65536.  
  3. You may try using --multi-dex option.  

  其实都是相同的问题,只是提示方式不一样。

  关于64K限制

  APK文件包含由DEX文件组成的可执行的字节码文件,包含运行app编译后的代码。DEX文件有一个65535个方法的限制,如果超过这个限制,会在构建的时候报错。这些方法包含Android Framework方法,库方法和你自己写的方法。因为65535=64*1024,所以这个限制又被称为64K限制。

  Android5.0之前的版本的多dex支持

  在Android5.0之前,使用Dalvik运行时来执行应用代码。默认情况下,在每个APK中,Dalvik限制一个classes.dex 字节码文件。为了突破这个限制,你可以使用multidex support library。

  注意:如果你的项目配置多dex的最小SDK版本为20甚至更低,Android Stuido将禁用Instant Run。

  Android5.0及以上的版本的多dex支持

  Android5.0(API level 21)或更高的版本,使用ART运行时在执行应用代码。原生的支持从APK文件中直接载入多个dex文件。

  避免64K限制

  下面的方法可以帮助你减少dex方法的限制:

  1、 查看你的app的直接的或间接的依赖:

  尽量减少不必要的依赖的引用。

  2、 通过ProGuard来减少未使用的代码:

  通过配置ProGuard来启用ProGuard,确保你在发布版本的时候启用了压缩。

  用Gradle来配置你的应用的多dex

  在Android SDK Build Toos 21.1或更高的版本中,Android的Gradle插件在你的构建配置中提供了multidex的支持。在尝试配置你的multidex之前,确保你的Android SDK Build Tools和Android Support Repository升级到最新版本。

  设置你的开发的app使用multidex,你需要对你的开发项目作出一些改动,遵循如下几步:

  1、 更改你的Gradle构建配置来启用multidex。

  2、 更改你的manifest来添加MultiDexApplication类。

  更改你的build.gradle文件配置来添加支持库并且启用multidex输出,如下:

XML/HTML代码
  1. android {  
  2.     compileSdkVersion 21  
  3.     buildToolsVersion "21.1.0"  
  4.   
  5.     defaultConfig {  
  6.         ...  
  7.         minSdkVersion 14  
  8.         targetSdkVersion 21  
  9.         ...  
  10.   
  11.         // Enabling multidex support.  
  12.         multiDexEnabled true  
  13.     }  
  14.     ...  
  15. }
XML/HTML代码
  1. dependencies {  
  2.   compile 'com.android.support:multidex:1.0.0'  
  3. }  

       在AndroidManifest.xml中,添加MultiDexApplication类:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.android.multidex.myapplication">  
  4.     <application  
  5.         ...  
  6.         android:name="android.support.multidex.MultiDexApplication">  
  7.         ...  
  8.     </application>  
  9. </manifest>  

  当你添加如上配置到你的app中,Android 构建工具生成一个主要的dex文件(classes.dex)和支持多个(classes2.dex,classes3.dex)。构建系统将它们打包到一个APK中发布。

  多Dex支持库的局限

  Multidex支持库有一些你需要了解的局限:

  1、 在某种情况下可能会导致ANR问题,如果第二个dex文件过大的话。为了防止这个问题发生,你需要使用ProGuard来进行压缩。

  2、 在Android4.0极其早期版本中会遇到一些问题。

  3、 应用的multidex配置会需要更大的内存分配,这在Dalvik虚拟机中会导致崩溃。

  4、 其他复杂的情形。

  优化Multidex开发构建

  Multidex配置会显著的增加构建时间,因为构建系统必须来衡量将那些类放到住Dex文件中,那些类放到第二个dex文件中。这就意味着会拖慢开发进程。

  为了有效减缓构建multidex输出的时间,你需要使用Android 插件创建两个variantion:

  一个开发flavor和一个生产flavor。

  如下:

XML/HTML代码
  1. android {  
  2.     productFlavors {  
  3.         // Define separate dev and prod product flavors.  
  4.         dev {  
  5.             // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin  
  6.             // to pre-dex each module and produce an APK that can be tested on  
  7.             // Android Lollipop without time consuming dex merging processes.  
  8.             minSdkVersion 21  
  9.         }  
  10.         prod {  
  11.             // The actual minSdkVersion for the application.  
  12.             minSdkVersion 14  
  13.         }  
  14.     }  
  15.           ...  
  16.     buildTypes {  
  17.         release {  
  18.             runProguard true  
  19.             proguardFiles getDefaultProguardFile('proguard-android.txt'),  
  20.                                                  'proguard-rules.pro'  
  21.         }  
  22.     }  
  23. }  
  24. dependencies {  
  25.   compile 'com.android.support:multidex:1.0.0'  
  26. }
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/environment/675.html
2017年5月9日
发布:鸡啄米 分类:Android开发环境 浏览: 评论:0