(4.6.11.8)Instant Run is disabled 在Multidex下使用Instant Run
2016-05-27 15:41
519 查看
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 功能,但是却遇到了一个问题:
Instant Run 在我们的项目中无法使用,这段提示的大意是开启了 multidex 之后,SDK的最低版本要是21才能使用 Instant Run 。
为什么会有这个出现提示呢?首先说说什么是 multidex 。
Android的Apk文件中代码部分会编译成 Dalvik Exexutable (DEX)文件,而每个DEX文件都是有方法数的限制的,4.0以前的是不能超过65536个方法,包括项目使用的类库,和自己写的代码的方法数之后,65536又是64k,这个限制又称为64k限制,说话在大量使用各种类库的今天超过64K个方法数还是挺容易的,怎么解决这个问题呢?
很明显减少方法数是一个比较困难的方式,因为使用的库就很多了,支付宝,微信,友盟,push消息....那么只能使用多个DEX文件了。使用多个DEX的方式,需要先在gradle里配置:
另外需要导入multidex的依赖在Application进行分包:
可以使用两种方式让Apk分包。
第一种,使用 MultiDexApplication :
使用 MultiDexApplication 作为application即可。
第二种,如果已经有了Application文件可以在Application重写 attachBaseContext 方法:
对于 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是这样的:
Build Variant Build Type加上productFlavors就是Build Variant,一般的Build Type有两种 debug 和 release 。对应的Build Variant就是:
利用Build Variant可以定义不同的APK,比如:可以设置不同的version,也可以设置不同的 minSdkVersion 。
下面看下如何使用 Build Variant 。
首先定义两个 productFlavors 。
同步完gradle之后,可以在View->Tool Windows找到 Build Variants :
![](http://static.open-open.com/lib/uploadImg/20160418/20160418221758_530.png)
可以看到对于的Build variant:
![](http://static.open-open.com/lib/uploadImg/20160418/20160418221759_299.png)
如果选择 appDebug 运行使用的 minSdkVersion 就是17,选择 instantDebug 运行使用的 minSdkVersion 就是21,在开发的时候使用 instantDebug 就可以使用 Instant Run 功能了,而且不会影响其他人的开发。
来自: https://segmentfault.com/a/1190000004962523
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 。
为什么会有这个出现提示呢?首先说说什么是 multidex 。
Multidex
Android的Apk文件中代码部分会编译成 Dalvik Exexutable (DEX)文件,而每个DEX文件都是有方法数的限制的,4.0以前的是不能超过65536个方法,包括项目使用的类库,和自己写的代码的方法数之后,65536又是64k,这个限制又称为64k限制,说话在大量使用各种类库的今天超过64K个方法数还是挺容易的,怎么解决这个问题呢?1.减少方法数 2.使用多个DEX文件
很明显减少方法数是一个比较困难的方式,因为使用的库就很多了,支付宝,微信,友盟,push消息....那么只能使用多个DEX文件了。使用多个DEX的方式,需要先在gradle里配置:
android { defaultConfig { minSdkVersion 17 targetSdkVersion 23 multiDexEnabled true } }
另外需要导入multidex的依赖在Application进行分包:
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有什么不一样呢?
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 :
![](http://static.open-open.com/lib/uploadImg/20160418/20160418221758_530.png)
可以看到对于的Build variant:
![](http://static.open-open.com/lib/uploadImg/20160418/20160418221759_299.png)
如果选择 appDebug 运行使用的 minSdkVersion 就是17,选择 instantDebug 运行使用的 minSdkVersion 就是21,在开发的时候使用 instantDebug 就可以使用 Instant Run 功能了,而且不会影响其他人的开发。
来自: https://segmentfault.com/a/1190000004962523
相关文章推荐
- [疯狂Java]集合:EnumSet、各Set性能分析(选择)
- Ext JS 6开发实例(四) :调整主视图
- CAS单点登录握手失败备忘
- Ext JS 6开发实例(四) :调整主视图
- C# ACCESS数据库链接
- PHP的垃圾回收机制是怎样的(腾讯)
- Struts2源码分析(一)
- Git进行版本控制添加文件时,中文文件名乱码显示数字问题
- Android 进程间通信,基于Messeger(IPC)
- Starting the application on Mac does not work(拷贝platforms到不同的位置,才能解决问题),还可设置DYLD_PRINT_LIBRARIES=1 观察动态库
- 轻型的接口访问频率限制服务模型的设计与实现【转】
- 问题:下载页面代码? 以及php中header的用法。
- [操作系统]实验四 主存空间的分配和回收
- intellij idea运行java项目
- spark job运行参数优化
- AFN3.1 POST请求 参数问题
- clamav扫描工具
- 简历浅析
- MVC和Web API 过滤器Filter [转]
- 分段控制器--UISegmentedControl 基本用法