Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發環境 >> Android Studio(十九):突破64K方法限制

Android Studio(十九):突破64K方法限制

編輯:Android開發環境

  當應用代碼和庫代碼代碼超過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. }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved