文档章节

Android 在 Multidex 下使用 Instant Run

丁佳辉
 丁佳辉
发布于 2016/07/28 15:30
字数 1151
阅读 9
收藏 0
点赞 0
评论 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

共有 人打赏支持
丁佳辉
粉丝 18
博文 382
码字总数 195396
作品 0
浦东
程序员
Android高级之十三讲-HotFix、热加载和热更新

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

liuzxgeek ⋅ 2016/12/14 ⋅ 0

Android Studio工具修理集

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1、Common依赖项目找不到。因为主项目没有引进setting.gradle 2、从Eclipse移植到AS,最重要的两个文件是setting.gradle和...

liuzxgeek ⋅ 2016/07/22 ⋅ 0

彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(二)

在上一篇博客中,我给大家详细介绍了ant实现Android多分包技术,具体可以点击查看:彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(一);接下来的这篇博客我将带领大家一起学习...

tan6458 ⋅ 2017/01/09 ⋅ 0

Android Studio 3.1.2 bug 修复版发布,改进 lint 审查

Android Studio 3.1.2 bug 修复版已发布,本次更新修复了一些错误,并改进了某些场景下 lint 审查的速度。详细的修复内容请查看 Android Studio 3.1.2 的发布说明。 此外,Android Studio 3....

局长 ⋅ 04/24 ⋅ 1

android studio升级至2.3后运行app,在手机上没有自己启动

这种情况一般是工具关闭了热启动,可以在如下的截图中修改一下配置即可。 在android studio2.3版本之前调试运行app,在手机上都是自行启动。但是在2.3(包括2.3),减少编译时间,更改了Ins...

天鬼 ⋅ 04/04 ⋅ 0

ARetrofit组建化最佳路由

Android组件化超级路由,为简单而生。 Github 源码: ARetrofit 原文 demo demo apk 下载 一 介绍 从命名来看,做Android开发的小伙伴们感觉是不是似曾相识…是的,Retrofit,一款优秀的网络框...

CharlesZhu ⋅ 06/05 ⋅ 0

Android动态化框架App Bundles

Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用...

code_xzh ⋅ 05/16 ⋅ 0

virjar/xposedhooktool

hook base工具 Android 破解的hook工具,集成一些帮助破解的常用功能,如自动网络抓包、网络堆栈爆破、文件日志、webview调试环境 入口在 com.virjar.xposedhooktool.hotload.XposedInit,但是...

virjar ⋅ 04/22 ⋅ 0

MultiDex是什么?这个怎么理解?

安卓MultiDex,MultiDexApplication

开源中国原谅帽派送员 ⋅ 05/21 ⋅ 0

apk 编译加速器--fastdex

如果你忍受不了 apk 龟速的编译(尤其是项目中有多个dex,将近两分钟才能编译结束),fastdex 可以帮助你加快 apk 生成过程。 使用方式 1、关闭Instant Run功能 点击左上角Android studio ->...

大鹏2022 ⋅ 2017/03/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 15分钟前 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 24分钟前 ⋅ 0

springcloud+jps+mybatis多数据库配置

多数据库配置 配置我们目录结构设置: config ---datasource ----jpa ----mybatis ----redis Datasource中是数据的相关配置 Jap中是springDatajpa的相关配置 Mybatis中是mybatis的相关配置 ...

大-智-若-愚 ⋅ 31分钟前 ⋅ 0

Spring mvc HandlerMapping 实现机制

概述 当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。 HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。 Spring MVC 默认...

轨迹_ ⋅ 35分钟前 ⋅ 0

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部