編輯:關於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的。
Android應用(APK)文件包含形式的可執行字節碼文件的Dalvik可執行文件(DEX)文件,其中包含用於運行你的應用程序的編譯代碼。在Dalvik可執行的規范限制了可以在單個文件DEX內引用到65536,包括Android框架方法,庫方法,並在自己的代碼方式方法的總數。在計算機科學的上下文中,術語基洛,K,表示1024(或2 ^ 10)。因為65,536等於64×1024,這個限制被稱為'64K參考限制'。
獲得過去此限制,您需要配置您的應用程序的構建過程,生成多個文件DEX,被稱為multidex配置。
之前的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(API級別21)和較高的使用一種稱為ART運行時它本身支持與應用程序APK文件加載多個DEX文件。ART在應用程序執行預編譯安裝時它會掃描類(.. N).dex文件,並將其編譯成由Android設備執行單一.oat文件。對於在Android 5.0運行時的更多信息,請參見介紹ART。
注意:在使用即時運行,當你的應用程序的Android Studio自動配置您的應用multidex的minSdkVersion
設置為21或更高。由於即時只運行與您的應用程序的調試版本的作品,你還需要為multidex配置您的發布版本,以避免64K限制。
在配置您的應用程序,以便使用64K或以上方法的引用,您應該采取措施,以減少你的應用程序代碼調用引用的總次數,包括您的應用程序代碼或包含的庫定義的方法。以下策略可以幫助您避免擊中DEX參考限值:
使用這些技術可以幫助您避免使你的應用更加方法引用所需的生成配置的變化。這些步驟還可以降低你的APK,這對其中帶寬成本很高的市場尤為重要的規模。
在Android SDK中提供的Android插件的搖籃構建工具21.1和更高版本支持multidex作為構建配置的一部分。請確保您更新了Android SDK構建工具工具和Android的支持庫使用最新版本的SDK經理嘗試配置您的應用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文件,哪些類可以包含在二次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這個插件來做到以下幾點:
這些設置會導致快速,增量編譯,因為只有修改模塊的DEX文件重新計算和重新包裝成APK文件。從這些結果APK建立可用於僅5.0設備在Android上進行測試。然而,通過實現配置作為香味後,將保留執行正常的生成與釋放,適當的最低水平SDK和ProGuard的設置的能力。
還可以構建其它變體,包括一個prodDebug
變種的構建,這需要更長的時間來建立,但可以用於測試開發之外。在所示的配置中,prodRelease
變異將是最後的測試和發布版本。如果您在命令行中執行任務的gradle,你可以使用標准的命令DevDebug
追加到結尾(例如./gradlew installDevDebug
)。有關使用香精與搖籃任務的詳細信息,請參閱搖籃Plugin用戶指南。
提示:您還可以提供定制清單,或每個口味的自定義應用程序類,允許您使用支持庫MultiDexApplication類,或調用MultiDex.install()只對需要它的變種。
構建變種可以使用multidex時,管理構建過程非常有用的。Android Studio中,您可以選擇在用戶界面構建這些變種。
有Android Studio中建立自己的應用程序的“devDebug”變種:
注:打開此窗口中的選項只在您成功同步的Android Studio和使用您的搖籃構建文件後工具> Android的>同步工程與搖籃文件命令。
當使用儀器測試,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、如何實現圓中水面上漲效果:利用Paint的setXfermode屬性為PorterDuff.Mode.SRC_IN畫出進度所在的矩形與圓的交集
知識點:這次將繼續上一篇文章沒有講完的Menu的學習,上下文菜單(Context menu)和彈出菜單(Popup menu)。上下文菜單上下文菜單提供對UI界面上的特定
隨著應用復雜度增加,後期的應用更傾向於模塊化、插件化來盡量減少主程序的容量,對此有幾種方法來解決:1.使用so來封裝共同模塊,通過加載庫的形式實現代碼共享2.使用jar形
使用意圖傳遞數據的幾種方式 點此獲取完整代碼 我們除了要從活動返回數據,也常常要傳遞數據給活動。對此我們可以使用Intent對象將這些數據傳遞給目標活動。