構建超過65535方法數的安卓程序

今天的码报是什么意思:

码报开奖结果本期 www.iwqgw.icu  隨著安卓平臺的不斷發展,安卓應用的大小也在不斷增加。當你的應用和引用庫的大小達到了一定的規模,你會遇到構建的錯誤,錯誤指出,你的應用達到了安卓應用構建架構(build architecture)的限制,早期版本中錯誤信息如下:

[plain] view plain copy

  1. Conversion to Dalvik format failed:  

  2. Unable to execute dex: method ID not in [0, 0xffff]: 65536  

在最近的版本中,錯誤提示有所不同,但是他們指向了同一個問題

[plain] view plain copy

  1. trouble writing output:  

  2. Too many field references: 131000; max is 65536.  

  3. You may try using --multi-dex option.  

這兩個錯誤信息中出現了一個共同的數字:65536。這個數字是很重要的,他代表了在一個可執行Dalvik(dex)字節碼文件中可飲用的方法總數。如果你在構建一個安卓應用程序的時候遇到了這個錯誤,祝賀你,你已經有了相當多的代碼!這個文檔解釋了如何越過這個限制從而可以繼續構建你的app。

注意:本文的指導繼承了來自于安卓開發者的博文Custom Class Loading in Dalvik.


關于65k的引用限制


安卓應用(APK)文件包含著以可執行Dalvik(DEX)文件表示的可執行字節碼文件,這個文件中包含著在app中執行的編譯代碼。DEX的說明中限制在一個DEX文件中可被引用的方法總數不能超過65536,包括安卓框架(framework)的方法,庫(library)方法和你自己代碼中的方法。如果希望超過這個限制則需要在安卓構建的過程中生成多個DEX文件,我們稱之為multidex配置。


Multidex支持安卓5.0以前的系統

安卓5.0以前的系統版本在Dalvik運行的時候執行y應用代碼。通常來說,Dalvik限制每個apk文件只有一個classes,dex字節碼文件。為了避開這個限制,我們可以使用multidex支持庫(multidex support library),它成為了你的app中原生DEX文件的一部分,并且可以管理使用額外的DEX文件以及這些DEX文件包含的代碼。


Multidex支持安卓5.0及更高版本的系統

安卓5.0以及更高版本的系統,通過ART可以直接從APK中加載多個DEX文件。ART在應用程序安裝的時候會進行預編譯,通過掃描所有的classes(...N).dex文件,將他們編譯成為一個.oat文件,從而可以在安卓裝置中執行。如果想了解更多關于安卓5.0的運行機制,請看關于ART的介紹、


避免65k的限制

在配置你的app支持65k或更多的方法引用之前,你應該采取措施減少代碼中的引用總數,包括代碼中的方法以及引用的類庫中的方法。下面的幾個策略能夠幫助你們避免dex的引用限制。

審查你的app中直接或間接的依賴-確保任何大型的依賴庫在app中的引用要比在程序中添加大量代碼更有價值。一個典型的反例就是添加一個很大的依賴庫只因為需要使用其中很少的功能。減少代碼中的依賴經??梢園鎦惚苊鈊ex引用限制。


通過混淆器移除未使用的代碼-安裝混淆器,設置應用執行混淆器,使得app在發布構建的時候能夠收縮(shrinking),收縮能夠確保未使用的代碼不會被裝置到APK中。


在Gradle下為你的APP配置Multidex

Gradle的安卓插件在安卓SDK工具(Android SDK Build Tools)21.1及以上版本支持將multidex作為構建配置的一部分。在試圖為app安配置multidex之前,請確認你使用SDK Managert更新了安卓SDK構建工具以及安卓支持庫到最新版本。

設置你的app開發工程能夠使用multidex配置,需要你對工程做一些修改。特別是你需要執行以下步驟:

  • 改變你的Gradle構建配置使得能夠支持multidex

  • 修改manifest去引用MultiDexApplication類

修改你的app Gradle 構建文件配置包括支持庫以及能夠輸出multidex,如下所示

[plain] view plain copy

  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. }  

  16.   

  17. dependencies {  

  18.   compile 'com.android.support:multidex:1.0.0'  

  19. }  

注意:在你的Gradle 構建文件中,你可以指定multiDexEnabled設置在defaultConfig, buildType, 或者productFlavor或者

在manifest中的application元素中增加來自multidex支持庫中的MultiDexApplication類

[html] view plain copy

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

  2. <manifest xmlns:android="//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中增加了這些配置,安卓構建工具夠早了一個原生的DEX(classes.dex)并且支持(classes2.dex,classes3.dex)等等,構建系統也會將這些信息打包到apk中。

注意:如果app使用了擴展的Application類,你可以覆蓋(override)他的attachBaseContext()方法并且調用MultiDex,install(this)從而支持multidex。如需了解更多信息,請參考MultiDexApplication文檔。

來源:CSDN

上一篇: Android線程的正確使用姿勢

下一篇: Android開發人員應避免的10個誤區

分享到: 更多
幸运一分快三计划软件下载 三张炸金花技巧 500彩票幸运快三计划软件下载 大乐透100期走势图表开门彩 棋牌娱乐app 金库电子游戏平台 雪缘园即时比分直播 老重时时彩走势图片 3分赛车计划彩票稳赚技巧 天津时时后三走势图 分分彩怎么压稳赚不亏 最稳定追长龙的方法 最新打鱼棋牌游戏 欢乐生肖开奖历史走势图 四川时时真的吗 8码倍投