Instant Run
是Android studio 2.0出現(xiàn)的新功能拌倍,在Run
和Debug
的時(shí)候玄柏,只有在第一次build會(huì)花費(fèi)大量的時(shí)間兼呵。之后再次Run
或者Debug
的時(shí)候會(huì)直接更新到手機(jī)上面,這樣就能很快的顯示出變化驮瞧,加快了開(kāi)發(fā)效率氓扛。
Instant Run
要求Gradle的版本在2.0.0以上,minSdkVersion
最低為15论笔,最好minSdkVersion
在21之上采郎。隨著Android studio 2.0正式版上線,想正式開(kāi)始使用Instant Run
功能狂魔,但是卻遇到了一個(gè)問(wèn)題:
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.
大意是開(kāi)啟了multidex
蒜埋,SDK的最低版本要是21才能使用Instant Run
。為什么會(huì)有這個(gè)問(wèn)題出現(xiàn)呢最楷?
要回答這個(gè)問(wèn)題整份,先要了解下什么是multidex
。
Multidex
在Android
平臺(tái)中代碼會(huì)編譯成Dalvik Executable
(DEX)文件籽孙,而DEX文件是有方法數(shù)的限制的烈评,不能超過(guò)65536
個(gè)方法,包括使用的類庫(kù)和自己寫(xiě)的代碼的方法總數(shù)犯建。65536
就是64k讲冠,所以這個(gè)限制又稱為64k限制
,怎么解決這個(gè)解決這個(gè)限制的問(wèn)題呢适瓦?有兩個(gè)方案
- 減少方法數(shù)
- 使用多個(gè)DEX文件(Multidex)
減少方法數(shù)固然是一個(gè)好方法沟启,但是隨著App功能的增加,控制一定的方式數(shù)是件很困難的事情犹菇,因此就需要使用Multidex
的方案了。
使用Multidex
芽卿,需要在gradle里面開(kāi)啟Multidex
的設(shè)置揭芍,開(kāi)啟方式:
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 17
targetSdkVersion 23
...
multiDexEnabled true
}
...
}
還需要導(dǎo)入Multidex
的依賴:
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
可以使用兩種方式讓Apk分包。
- 使用
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>
-
Application
實(shí)現(xiàn)分包:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
錯(cuò)誤提示里面顯示SDK大于21(Android 5.0)就可以卸例,Android 5.0
有不一樣的呢称杨?答案是ART
肌毅。
ART
Android runtime(ART)
是管理runtime和系統(tǒng)服務(wù)的技術(shù),ART和Dalvik都能夠從DEX的二進(jìn)程文件中運(yùn)行姑原,ART是天然地支持Multiple DEX
文件悬而,ART在安裝應(yīng)用的時(shí)候掃描所有的DEX文件,編譯成一個(gè)單獨(dú)的.oat文件提供Android設(shè)備運(yùn)行锭汛。更多的內(nèi)容可以看:ART
在Android 5.0
上全面支持了ART
技術(shù)笨奠,因此可以方便的使用Instant Run
,一方面想使用Instant Run
的強(qiáng)大功能,另一方便又不能放棄低于5.0的Android設(shè)備唤殴。有沒(méi)有一種能夠兩者兼具的方法呢般婆?
Build Variant
每次調(diào)試的都更新下minSdkVersion
,這樣一是使用不方便朵逝,另外是容易出錯(cuò)蔚袍,容易把錯(cuò)誤的代碼提交到版本庫(kù),導(dǎo)致不必要的錯(cuò)誤出現(xiàn)配名,有沒(méi)有一種方式能夠通過(guò)配置構(gòu)建不同的環(huán)境啤咽,開(kāi)發(fā)的時(shí)候使用Instant Run
,Release的時(shí)候再支持Android 5.0
以下的版本呢渠脉?這就要利用強(qiáng)大的gradle了宇整。
要完成上面的任務(wù)需要使用一個(gè)功能productFlavors
,productFlavors是gradle中的一個(gè)功能,可以根據(jù)不通的配置構(gòu)建出不通的APK连舍,比如構(gòu)建不同渠道的渠道包時(shí)會(huì)用到没陡,一般productFlavors
的DSL是這樣的:
android {
productFlavors {
flavor1 {
}
flavor2 {
}
}
}
還需要使用另一個(gè)就是Build Variant
,* Build Type加上productFlavors*就是Build Variant
索赏。比如一般的Build Type有兩種debug
和release
盼玄。對(duì)應(yīng)的Build Variant就是:
flavor1+debug
flavor1+release
flavor2+debug
flavor2+release
利用Build Variant
可以配置不同的APK,設(shè)置不通的version
潜腻,也可以設(shè)置不通的minSdkVersion
埃儿。
首先使用productFlavors
:
android {
productFlavors {
instant {
minSdkVersion 21
}
app {
minSdkVersion 17
}
}
}
同步完gradle
之后,可以在View->Tool Windows找到Build Variants
:
對(duì)于的Build Variant:
選擇appDebug就可以運(yùn)行minSdkVersion
等于17的Apk,選擇instantDebug就可以運(yùn)行minSdkVersion
等于21的Apk融涣,后者就是使用Instant Run
功能了童番。