Android 在 Multidex 下使用 Instant Run

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

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

Instant Run is disabled: Instant Run does not support deploying build variants with multidex enabled, to a target with API level 20 or below. To use Instant Run with a multidex enabled build variant, deploy to a target with API level 21 or higher. Instant Run在咱們的項目中沒法使用,這段提示的大意是開啓了multidex以後,SDK的最低版本要是21才能使用Instant Run。app

爲何會有這個出現提示呢?首先說說什麼是multidex。ide

Multidex Android的Apk文件中代碼部分會編譯成Dalvik Exexutable(DEX)文件,而每一個DEX文件都是有方法數的限制的,4.0之前的是不能超過65536個方法,包括項目使用的類庫,和本身寫的代碼的方法數以後,65536又是64k,這個限制又稱爲64k限制,說話在大量使用各類類庫的今天超過64K個方法數仍是挺容易的,怎麼解決這個問題呢?gradle

減小方法數 使用多個DEX文件 很明顯減小方法數是一個比較困難的方式,由於使用的庫就不少了,支付寶,微信,友盟,push消息....那麼只能使用多個DEX文件了。ui

使用多個DEX的方式,須要先在gradle裏配置:this

android { defaultConfig { minSdkVersion 17 targetSdkVersion 23debug

multiDexEnabled true
}

} 另外須要導入multidex的依賴在Application進行分包:調試

dependencies { compile 'com.android.support:multidex:1.0.0' } 可使用兩種方式讓Apk分包。code

第一種,使用MultiDexApplication:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.jjz"> <application ... android:name="android.support.multidex.MultiDexApplication"> ... </application> </manifest> 使用MultiDexApplication做爲application便可。

第二種,若是已經有了Application文件能夠在Application重寫attachBaseContext方法:

@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 對於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是這樣的:

android {

productFlavors {
    flavor1 {
    }
    flavor2 {
    }
}

} Build Variant Build Type加上productFlavors就是Build Variant,通常的Build Type有兩種debug和release。對應的Build Variant就是:

flavor1+debug flavor1+release flavor2+debug flavor2+release 利用Build Variant能夠定義不一樣的APK,好比:能夠設置不一樣的version,也能夠設置不一樣的minSdkVersion。

下面看下如何使用Build Variant。

首先定義兩個productFlavors。

android { productFlavors { instant { minSdkVersion 21 } app { minSdkVersion 17 } } } 同步完gradle以後,能夠在View->Tool Windows找到Build Variants:

能夠看到對於的Build variant:

若是選擇appDebug運行使用的minSdkVersion就是17,選擇instantDebug運行使用的minSdkVersion就是21,在開發的時候使用instantDebug就可使用Instant Run功能了,並且不會影響其餘人的開發。

相關文章
相關標籤/搜索