文档章节

Android 在 Multidex 下使用 Instant Run

丁佳辉
 丁佳辉
发布于 2016/07/28 15:30
字数 1151
阅读 11
收藏 0

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 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个方法数还是挺容易的,怎么解决这个问题呢?

减少方法数 使用多个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:

可以看到对于的Build variant:

如果选择appDebug运行使用的minSdkVersion就是17,选择instantDebug运行使用的minSdkVersion就是21,在开发的时候使用instantDebug就可以使用Instant Run功能了,而且不会影响其他人的开发。

本文转载自:https://segmentfault.com/a/1190000004962523

共有 人打赏支持
丁佳辉
粉丝 20
博文 412
码字总数 197400
作品 0
浦东
程序员
私信 提问
Android Studio 2.0 Preview 5 发布

Android Studio 2.0 Preview 5 发布,更新如下: Instant Run: We've made a huge number of changes in this area. Among the user visible features, we now support "cold swap": if the......

oschina
2016/01/15
8.7K
38
Android高级之十三讲-HotFix、热加载和热更新

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 组件化与插件化:前者对功能进行拆分后,独立开发,打成一个包发布;后者对功能拆分,使用主包+分包,可以分别独立发布。...

liuzxgeek
2016/12/14
0
0
Android Studio 2.0 Beta 6 发布

Android Studio 2.0 Beta 6 发布,该版本修复了如下重要的 bug: Apps that were using multiple processes (via android:process in the manifest) were not being updated properly with I......

oschina
2016/02/26
8.9K
31
Android Studio 2.2 的新鲜事

Android Studio 2.2 现在可以下载。Android Studio 2.2 已在 Google I/O 2016 上预展,是全球各地数百万 Android 开发者使用的 IDE 最新版本。 此版本包含增强功能,主要面向三大主题:速度、...

局长
2016/09/24
5.4K
12
Multidex记录二:缺陷&解决

个人博客地址 http://dandanlove.com/ Multidex记录一:介绍和使用 Multidex记录二:缺陷&解决 记录Multidex缺陷&解决 为什么要用记录呢,因为我从开始接触Android时我们的项目就在65535的边...

静默加载
10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[Spring4.x]基于spring4.x纯注解的Web工程搭建

在前文中已经说明了如何基于 Spring4.x+ 版本开发纯注解的非web项目,链接如下: https://my.oschina.net/morpheusWB/blog/2985600 本文则主要说明,如何在Web项目中,"基于spring纯注解方式...

morpheusWB
15分钟前
1
0
基础编程题目集-7-13 日K蜡烛图

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开...

niithub
31分钟前
3
0
Jenkins window 下的安装使用

1.下载:https://jenkins.io/download/ 双击安装完毕,将自动打开浏览器: http://localhost:8080 打开对应位置的文件,将初始密钥粘贴至输入框。 第一个是 安装默认的软件;第二个是 自定义...

狼王黄师傅
33分钟前
1
0
深入解析react关于事件绑定this的四种方式

这篇文章主要介绍了详解react关于事件绑定this的四种方式,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 在react组件中,每个方...

前端攻城小牛
42分钟前
2
0
JS正则表达式

url的正则表达式:包括IP,域名(domain),ftp,二级域名,域名中的文件,域名加上端口!用户名等等信息 `function` `IsURL(str_url) {``var` `strRegex =``"^((https|http|ftp|rtsp|mm...

前端小攻略
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部