Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> MultiDex 官方教你解決64K方法

MultiDex 官方教你解決64K方法

編輯:關於Android編程

官網地址:http://developer.android.com/tools/building/multidex.html 大概意思翻譯一下,不是逐詞逐句,意會意會。。

由於Android平台的持續增長,Android應用程序的大小也隨之增大。當你的應用程序引用庫達到一定的規模,就會出錯(64K):


Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

最近在Android構建系統的版本顯示不同的錯誤,這是同一個問題的指示:


trouble writing output: Too many field references: 131000; max is 65536. You may try using --multi-dex option.

這兩種錯誤情況顯示一個共同的數字:65,536。這個數字是在它代表可以由一個單一的代碼的Dalvik可執行(DEX)字節碼文件中調用的引用的總數顯著。如果你已經建立了一個Android應用程序,並收到此錯誤,那麼恭喜你,你有很多的代碼!本文檔介紹了如何將突破這個限制,並繼續構建應用程序。

注:本文檔中提供的指導取代了Android開發者博客中給予的指導自定義類加載在Dalvik的。

關於64K參考限值


Android應用(APK)文件包含形式的可執行字節碼文件的Dalvik可執行文件(DEX)文件,其中包含用於運行你的應用程序的編譯代碼。在Dalvik可執行的規范限制了可以在單個文件DEX內引用到65536,包括Android框架方法,庫方法,並在自己的代碼方式方法的總數。在計算機科學的上下文中,術語基洛,K,表示1024(或2 ^ 10)。因為65,536等於64×1024,這個限制被稱為'64K參考限制'。

獲得過去此限制,您需要配置您的應用程序的構建過程,生成多個文件DEX,被稱為multidex配置。

Multidex支持到Android 5.0之前

之前的Android 5.0(API級別21)平台的版本,用於執行應用程序代碼的Dalvik運行。默認情況下,Dalvik的限制應用到每個APK一個classes.dex字節碼文件。為了解決這個限制,可以使用multidex支持庫,成為您的應用程序的主DEX文件的一部分,然後設法獲得額外的DEX文件和它們所包含的代碼。

注意:如果您的項目配置為multidex用的minSdkVersion 20或更低,並且部署到目標運行Android 4.4(API級別20)或更低的設備,Android Studio中禁用即時運行。

為Android 5.0及更高版本Multidex支持

是Android 5.0(API級別21)和較高的使用一種稱為ART運行時它本身支持與應用程序APK文件加載多個DEX文件。ART在應用程序執行預編譯安裝時它會掃描類(.. N).dex文件,並將其編譯成由Android設備執行單一.oat文件。對於在Android 5.0運行時的更多信息,請參見介紹ART。

注意:在使用即時運行,當你的應用程序的Android Studio自動配置您的應用multidex的minSdkVersion設置為21或更高。由於即時只運行與您的應用程序的調試版本的作品,你還需要為multidex配置您的發布版本,以避免64K限制。

避免64K限制


在配置您的應用程序,以便使用64K或以上方法的引用,您應該采取措施,以減少你的應用程序代碼調用引用的總次數,包括您的應用程序代碼或包含的庫定義的方法。以下策略可以幫助您避免擊中DEX參考限值:

  • 查看應用的直接和傳遞依賴-確保任何大庫的依賴關系,你在應用程式的方式,勝過的代碼量被添加到應用程序中使用。一個常見的反模式是包含一個非常大的圖書館,因為一些實用的方法是有用的。減少你的應用程序代碼依賴性往往可以幫助你避免DEX參考限值。
  • 使用ProGuard刪除未使用的代碼-配置ProGuard的為您的應用程序的設置來運行ProGuard,並將其確定您已經縮水啟用發布版本。啟用萎縮確保你不發貨未使用的代碼與您的APK。

使用這些技術可以幫助您避免使你的應用更加方法引用所需的生成配置的變化。這些步驟還可以降低你的APK,這對其中帶寬成本很高的市場尤為重要的規模。
 

配置您的Multidex與Gradle


在Android SDK中提供的Android插件的搖籃構建工具21.1和更高版本支持multidex作為構建配置的一部分。請確保您更新了Android SDK構建工具工具和Android的支持庫使用最新版本的SDK經理嘗試配置您的應用multidex之前。(

(上邊的都是廢話,下邊是解決方法————————————————————————————————————————————————————————————)

設置您的應用開發項目中使用multidex配置要求你做一些修改您的應用程序開發項目。特別需要執行以下步驟:

  • 改變你的搖籃構建配置,使multidex
  • 修改你的清單來引用MultiDexApplication

修改模塊級的build.gradle文件配置包括支持庫,使multidex輸出,顯示在下面的代碼片段:

android { 
  compileSdkVersion 21 
  buildToolsVersion "21.1.0" 

  defaultConfig { 
    ... 
    minSdkVersion 14 
    targetSdkVersion 21 
    ... 

    //啟用multidex支持。
    multiDexEnabled 真正
  } 
  ... 
} 

依賴性{ 
 編譯“com.android.support:multidex:1.0.0' 
}

在您的清單中添加的MultiDexApplication從multidex支持庫類應用元素。

<?xml的version = "1.0" encoding = "utf-8" ?> 
 
   
    ... 
   

當這些配置設置添加到應用程序,Android編譯工具構建需要一個主DEX(classes.dex)及其配套(classes2.dex,classes3.dex)。然後,構建系統將它們打包成用於分配的APK文件。

注意:如果您的應用程序使用擴展的Application類,則可以覆蓋attachBaseContext()方法,並調用MultiDex.install(this),以使multidex。欲了解更多信息,請參閱MultiDexApplication參考文檔。

在multidex支持庫的限制

該multidex支持庫有一些已知的限制,你應該了解和測試,當你將其納入您的應用程序構建配置為:

  • 的.dex文件啟動期間安裝到設備的數據分區是復雜的,並可能導致在應用無響應(ANR)錯誤如果二次DEX文件是大的。在這種情況下,你應該申請代碼縮減技術使用ProGuard盡量減少DEX文件的大小,並刪除代碼的未使用的部分。
  • 使用multidex可能無法運行由於Dalvik的linearAlloc錯誤(發行早於Android 4.0的(API級別14)平台版本的設備開始應用22586)。如果你是早於14 API目標水平,確保執行與這些版本的平台測試您的應用程序可以在啟動時的問題或當類特殊群體被加載。代碼收縮可以減少或可能消除這些潛在的問題。
  • 使用multidex配置,使非常大的內存分配請求的應用程序可能在運行時由於Dalvik的linearAlloc限制(第崩潰78035)。此分配限制是在Android 4.0的(API級別14)增加,但應用仍有可能之前的Android 5.0(API級別21)碰上在Android版 ??本中此限制。
  • 有關於在Dalvik運行時中執行時需要什麼樣的課程列入小學DEX文件復雜的要求。Android編譯工具的更新處理Android的要求,但它可能是其他包括圖書館有額外的依賴性要求,包括使用內省或Java方法調用的本地代碼。直到multidex構建工具的更新,使您可以指定必須包括在主DEX文件類,某些庫可能無法使用。

優化Multidex開發版本


一個multidex配置要求顯著上升構建的處理時間,因為構建系統必須做出什麼類必須包含在主DEX文件,哪些類可以包含在二次DEX文件復雜的決定。這意味著,常規建立與multidex發展過程的一部分執行通常需要更長的時間,並有可能減緩您的開發過程。

為了減輕通常較長的建立multidex輸出時間,你應該創建使用搖籃的Android插件構建輸出兩種變化productFlavors:開發風味和生產的味道。

對於開發味,設置一個最小的SDK版本21.此設置更快產生multidex輸出采用ART-支持的格式。對於釋放香味,設置符合你的實際的最低支持率的最低SDK版本。此設置生成APK multidex是與更多的設備兼容,但需要更長的時間來建立。

下面構建配置示例演示了如何設置這些味道在搖籃構建文件:

安卓{ 
  productFlavors { 
    //定義獨立開發並督促產品的味道。
    開發{ 
      //開發利用的minSdkVersion = 21,允許Android的插件的gradle 
      //預DEX每個模塊,並產生一個APK,可以在測試
      // Android的棒棒糖無需耗時的DEX合並過程。
      的minSdkVersion 21 
    } 
    督促{ 
      //應用程序的實際的minSdkVersion。
      的minSdkVersion 14 
    } 
  } 
     ... 
  buildTypes { 
    發布{ 
      runProguard 真正
      proguardFiles getDefaultProguardFile ( 'proguard-android.txt' ), 
                        'proguard-rules.pro' 
    } 
  } 
} 
dependencies { 
 compile 'com.android.support:multidex:1.0.0' 
}

完成此配置更改後,您可以使用devDebug您的應用程序,它結合了屬性的變異開發productFlavor和調試buildType。使用此目標創建了ProGuard的殘疾人,multidex調試應用程序啟用,並設置的minSdkVersion到Android API 21級這些設置導致了Android gradle這個插件來做到以下幾點:

  1. 建設作為單獨的DEX文件的應用程序(包括依賴)的每個模塊。這通常被稱為預德興。
  2. 包括不加修改地在每個APK文件DEX。
  3. 最重要的是,模塊DEX文件將不會合並,所以長期運行計算來確定主DEX文件的內容是可以避免的。

這些設置會導致快速,增量編譯,因為只有修改模塊的DEX文件重新計算和重新包裝成APK文件。從這些結果APK建立可用於僅5.0設備在Android上進行測試。然而,通過實現配置作為香味後,將保留執行正常的生成與釋放,適當的最低水平SDK和ProGuard的設置的能力。

還可以構建其它變體,包括一個prodDebug變種的構建,這需要更長的時間來建立,但可以用於測試開發之外。在所示的配置中,prodRelease變異將是最後的測試和發布版本。如果您在命令行中執行任務的gradle,你可以使用標准的命令DevDebug追加到結尾(例如./gradlew installDevDebug)。有關使用香精與搖籃任務的詳細信息,請參閱搖籃Plugin用戶指南。

提示:您還可以提供定制清單,或每個口味的自定義應用程序類,允許您使用支持庫MultiDexApplication類,或調用MultiDex.install()只對需要它的變種。

使用Build變種Android Studio中

構建變種可以使用multidex時,管理構建過程非常有用的。Android Studio中,您可以選擇在用戶界面構建這些變種。

有Android Studio中建立自己的應用程序的“devDebug”變種:

  1. 打開生成變種從左邊的側邊欄的窗口。該選項旁邊的收藏夾
  2. 單擊構建變量的名稱,以選擇一個不同的變型中,如圖1。


​圖1.在Android工作室的屏幕截圖左圖顯示出構建變量。

:打開此窗口中的選項只在您成功同步的Android Studio和使用您的搖籃構建文件後工具> Android的>同步工程與搖籃文件命令。

測試Multidex應用


當使用儀器測試,multidex應用程序,則需要額外的配置,以使測試儀器。由於代碼在multidex應用類的位置不是一個單一的DEX文件內,儀表測試不正確除非配置為multidex運行。

為了測試與儀器測試中multidex應用,配置MultiDexTestRunner從multidex測試支持庫。下面的示例的build.gradle文件演示了如何配置您的構建來使用這個測試運行:

安卓{ 
 defaultConfig { 
   ... 
   testInstrumentationRunner “com.android.test.runner.MultiDexTestRunner” 
 } 
}

注:借助Android插件搖籃版本低於1.1時,您需要添加以下依賴於multidex的儀器

dependencies { 
  androidTestCompile ( 'com.android.support:multidex-instrumentation:1.0.1' )  { 
    exclude group :  'com.android.support' ,  module :  'multidex' 
  } 
}

您可以直接使用儀器測試運行的類或擴展,以滿足您的測試需求。或者,您可以在這樣現有的儀器儀表覆蓋的onCreate:

public  void onCreate ( Bundle arguments )  { 
  MultiDex . install ( getTargetContext ()); 
  super . onCreate ( arguments ); 
  ... 
}

注:目前不支持multidex創建APK測試使用。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved