Instant Run
是Android studio 2.0新的逆天功能,在Run
和Debug
的时候,只有在第一次build会花费大量的时间,以后再次Run或者Debug的时候会直接把变化的代码更新到手机,再上面生成一个新的APK直接运行,这样就能很快的显示出更改代码以后的变化,加快了开发效率和调试效率,每次更改代码50多秒的build时间仍是挺浪费的。html
Instant Run
要求Gradle的版本在2.0以上,minSdkVersion必须为15以上,最好的minSdkVersion是21(后面会解释为何是21)。随着Android studio 2.0正式版上线,想正式的在团队内容推行Instant Run
功能,可是却遇到了一个问题:android
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
。微信
为何会有这个出现提示呢?首先说说什么是multidex
。app
Android的Apk文件中代码部分会编译成Dalvik Exexutable
(DEX)文件,而每一个DEX文件都是有方法数的限制的,4.0之前的是不能超过65536个方法,包括项目使用的类库,和本身写的代码的方法数以后,65536又是64k,这个限制又称为64k限制,说话在大量使用各类类库的今天超过64K个方法数仍是挺容易的,怎么解决这个问题呢?ide
减小方法数gradle
使用多个DEX文件ui
很明显减小方法数是一个比较困难的方式,由于使用的库就不少了,支付宝,微信,友盟,push消息....那么只能使用多个DEX文件了。this
使用多个DEX的方式,须要先在gradle里配置:spa
android { defaultConfig { minSdkVersion 17 targetSdkVersion 23 multiDexEnabled true } }
另外须要导入multidex的依赖在Application进行分包:debug
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>
使用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有什么不同呢?
为何Android 5.0会不同呢,由于ART
。
Android runtime(ART)是管理runtime和系统服务的技术,ART和Dalvik可以读取DEX的二进程文件,ART自然地支持multiple DEX文件,ART在安装应用的时候扫描全部的DEX文件,编译成一个单独的.oat
文件提供Android设备运行。更多的内容能够看:ART
一方面想使用Instant Run
的强大功能,另外一方便又不能放弃4.0的Android设备。有没有一种可以二者兼具呢?
不能每次调试的都去更改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
功能了,并且不会影响其余人的开发。