Android 在 Multidex 下使用 Instant Run

姜家志發表於2016-05-19

Instant Run是Android studio 2.0新的逆天功能,在RunDebug的時候,只有在第一次build會花費大量的時間,之後再次Run或者Debug的時候會直接把變化的程式碼更新到手機,再上面生成一個新的APK直接執行,這樣就能很快的顯示出更改程式碼之後的變化,加快了開發效率和除錯效率,每次更改程式碼50多秒的build時間還是挺浪費的。

Instant Run要求Gradle的版本在2.0以上,minSdkVersion必須為15以上,最好的minSdkVersion是21(後面會解釋為什麼是21)。隨著Android studio 2.0正式版上線,想正式的在團隊內容推行Instant Run功能,但是卻遇到了一個問題

Instant Run在我們的專案中無法使用,這段提示的大意是開啟了multidex之後,SDK的最低版本要是21才能使用Instant Run

為什麼會有這個出現提示呢?首先說說什麼是multidex

Multidex

Android的Apk檔案中程式碼部分會編譯成Dalvik Exexutable(DEX)檔案,而每個DEX檔案都是有方法數的限制的,4.0以前的是不能超過65536個方法,包括專案使用的類庫,和自己寫的程式碼的方法數之後,65536又是64k,這個限制又稱為64k限制,說話在大量使用各種類庫的今天超過64K個方法數還是挺容易的,怎麼解決這個問題呢?

  1. 減少方法數
  2. 使用多個DEX檔案

很明顯減少方法數是一個比較困難的方式,因為使用的庫就很多了,支付寶,微信,友盟,push訊息….那麼只能使用多個DEX檔案了。

使用多個DEX的方式,需要先在gradle裡配置:

另外需要匯入multidex的依賴在Application進行分包:

可以使用兩種方式讓Apk分包。

第一種,使用MultiDexApplication

使用MultiDexApplication作為application即可。

第二種,如果已經有了Application檔案可以在Application重寫attachBaseContext方法:

對於Instant Run很遺憾的是APK依賴的庫比較多,沒有辦法將方法數減少到64K以下,也就是無法去掉MultiDex.在提示裡面說如果使用MultiDex最小的SDK大於等於21(Android 5.0)以上也是可以使用,我們Android 5.0有什麼不一樣呢?

ART

為什麼Android 5.0會不一樣呢,因為ART

Android runtime(ART)是管理runtime和系統服務的技術,ART和Dalvik能夠讀取DEX的二程式檔案,ART天然地支援multiple DEX檔案,ART在安裝應用的時候掃描所有的DEX檔案,編譯成一個單獨的.oat檔案提供Android裝置執行。更多的內容可以看:ART

一方面想使用Instant Run的強大功能,另一方便又不能放棄4.0的Android裝置。有沒有一種能夠兩者兼具呢?

Build Variant

不能每次除錯的都去更改minSdkVersion,這樣一是不方便,另外是容易出錯,錯誤的把程式碼提交到版本庫,導致不必要的錯誤出現。

有沒有一種方式能夠通過配置構建出不同的環境,答案是:gradle。

使用gradle中的Build Variant可以做到不用每次都更改minSdkVersion還能使用Instant Run

productFlavors是gradle中的一個功能,能夠根據不通的定義構建不通的APK,比如構建不同渠道構建不同的渠道包,一般productFlavors的DSL是這樣的:

Build Variant Build Type加上productFlavors就是Build Variant,一般的Build Type有兩種debugrelease。對應的Build Variant就是:

利用Build Variant可以定義不同的APK,比如:可以設定不同的version,也可以設定不同的minSdkVersion

下面看下如何使用Build Variant

首先定義兩個productFlavors

同步完gradle之後,可以在View->Tool Windows找到Build Variants

510369169-5714c5be0c6ad_articlex

可以看到對於的Build variant:

2910141721-5714c5ce0da18_articlex

如果選擇appDebug執行使用的minSdkVersion就是17,選擇instantDebug執行使用的minSdkVersion就是21,在開發的時候使用instantDebug就可以使用Instant Run功能了,而且不會影響其他人的開發。

相關文章