Instant Run
是Android studio 2.0新的逆天功能,在Run
和Debug
的時候,只有在第一次build會花費大量的時間,之後再次Run或者Debug的時候會直接把變化的代碼更新到手機,再上面生成一個新的APK直接運行,這樣就能很快的顯示出更改代碼之後的變化,加快了開發效率和調試效率,每次更改代碼50多秒的build時間還是挺浪費的。
Instant Run
要求Gradle的版本在2.0以上,minSdkVersion必須爲15以上,最好的minSdkVersion是21(後面會解釋爲什麼是21)。隨着Android studio 2.0正式版上線,想正式的在團隊內容推行Instant
Run
功能,但是卻遇到了一個問題
1
2
3
|
Instant Run isdisabled:Instant Run does notsupport deploying build variants with multidex enabled,toa
target with API level20orbelow.TouseInstant Run withamultidex enabled build variant,deploy toa
target with API level21orhigher.
|
Instant Run
在我們的項目中無法使用,這段提示的大意是開啓了multidex
之後,SDK的最低版本要是21才能使用Instant
Run
。
爲什麼會有這個出現提示呢?首先說說什麼是multidex
。
Multidex
Android的Apk文件中代碼部分會編譯成Dalvik Exexutable
(DEX)文件,而每個DEX文件都是有方法數的限制的,4.0以前的是不能超過65536個方法,包括項目使用的類庫,和自己寫的代碼的方法數之後,65536又是64k,這個限制又稱爲64k限制,說話在大量使用各種類庫的今天超過64K個方法數還是挺容易的,怎麼解決這個問題呢?
- 減少方法數
- 使用多個DEX文件
很明顯減少方法數是一個比較困難的方式,因爲使用的庫就很多了,支付寶,微信,友盟,push消息….那麼只能使用多個DEX文件了。
使用多個DEX的方式,需要先在gradle裏配置:
1
2
3
4
5
6
7
8
|
android{
defaultConfig{
minSdkVersion17
targetSdkVersion23
multiDexEnabled true
}
}
|
另外需要導入multidex的依賴在Application進行分包:
1
2
3
|
dependencies{
compile'com.android.support:multidex:1.0.0'
}
|
可以使用兩種方式讓Apk分包。
第一種,使用MultiDexApplication
:
1
2
3
4
5
6
7
8
|
<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
方法:
1
2
3
4
5
|
@Override
protectedvoidattachBaseContext(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是這樣的:
1
2
3
4
5
6
7
8
9
|
android{
productFlavors{
flavor1{
}
flavor2{
}
}
}
|
Build Variant
Build Type加上productFlavors就是Build Variant,一般的Build Type有兩種debug
和release
。對應的Build
Variant就是:
1
2
3
4
|
flavor1+debug
flavor1+release
flavor2+debug
flavor2+release
|
利用Build Variant可以定義不同的APK,比如:可以設置不同的version,也可以設置不同的minSdkVersion
。
下面看下如何使用Build Variant
。
首先定義兩個productFlavors
。
1
2
3
4
5
6
7
8
9
10
|
android{
productFlavors{
instant{
minSdkVersion21
}
app{
minSdkVersion17
}
}
}
|
同步完gradle之後,可以在View->Tool Windows找到Build Variants
:
可以看到對於的Build variant:
如果選擇appDebug運行使用的minSdkVersion
就是17,選擇instantDebug運行使用的minSdkVersion
就是21,在開發的時候使用instantDebug
就可以使用Instant
Run
功能了,而且不會影響其他人的開發。