Instant Run
是Android studio 2.0出现的新功能,在Run
和Debug
的时候,只有在第一次build会花费大量的时间。以后再次Run
或者Debug
的时候会直接更新到手机上面,这样就能很快的显示出变化,加快了开发效率。Instant Run
要求Gradle的版本在2.0.0以上,minSdkVersion
最低为15,最好minSdkVersion
在21之上。随着Android studio 2.0正式版上线,想正式开始使用Instant Run
功能,可是却遇到了一个问题:javascript
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.复制代码
大意是开启了multidex
,SDK的最低版本要是21才能使用Instant Run
。为何会有这个问题出现呢?
要回答这个问题,先要了解下什么是multidex
。html
在Android
平台中代码会编译成Dalvik Executable
(DEX)文件,而DEX文件是有方法数的限制的,不能超过65536
个方法,包括使用的类库和本身写的代码的方法总数。65536
就是64k,因此这个限制又称为64k限制
,怎么解决这个解决这个限制的问题呢?有两个方案java
减小方法数当然是一个好方法,可是随着App功能的增长,控制必定的方式数是件很困难的事情,所以就须要使用Multidex
的方案了。
使用Multidex
,须要在gradle里面开启Multidex
的设置,开启方式:android
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 17
targetSdkVersion 23
...
multiDexEnabled true
}
...
}复制代码
还须要导入Multidex
的依赖:app
dependencies {
compile 'com.android.support:multidex:1.0.0'
}复制代码
可使用两种方式让Apk分包。ide
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
实现分包:@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}复制代码
错误提示里面显示SDK大于21(Android 5.0)就能够,Android 5.0
有不同的呢?答案是ART
。gradle
Android runtime(ART)
是管理runtime和系统服务的技术,ART和Dalvik都可以从DEX的二进程文件中运行,ART是自然地支持Multiple DEX
文件,ART在安装应用的时候扫描全部的DEX文件,编译成一个单独的.oat文件提供Android设备运行。更多的内容能够看:ARTui
在Android 5.0
上全面支持了ART
技术,所以能够方便的使用Instant Run
,一方面想使用Instant Run
的强大功能,另外一方便又不能放弃低于5.0的Android设备。有没有一种可以二者兼具的方法呢?this
每次调试的都更新下minSdkVersion
,这样一是使用不方便,另外是容易出错,容易把错误的代码提交到版本库,致使没必要要的错误出现,有没有一种方式可以经过配置构建不一样的环境,开发的时候使用Instant Run
,Release的时候再支持Android 5.0
如下的版本呢?这就要利用强大的gradle了。
要完成上面的任务须要使用一个功能productFlavors
,productFlavors是gradle中的一个功能,能够根据不通的配置构建出不通的APK,好比构建不一样渠道的渠道包时会用到,通常productFlavors
的DSL是这样的:spa
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
。
首先使用productFlavors
:
android {
productFlavors {
instant {
minSdkVersion 21
}
app {
minSdkVersion 17
}
}
}复制代码
同步完gradle
以后,能够在View->Tool Windows找到Build Variants
:
对于的Build Variant:
选择appDebug就能够运行minSdkVersion
等于17的Apk,选择instantDebug就能够运行minSdkVersion
等于21的Apk,后者就是使用Instant Run
功能了。