Android 在 Multidex 下使用 Instant Run

Instant Run是Android studio 2.0新的逆天功能,在RunDebug的时候,只有在第一次build会花费大量的时间,之后再次Run或者Debug的时候会直接把变化的代码更新到手机,再上面生成一个新的APK直接运行,这样就能很快的显示出更改代码之后的变化,加快了开发效率和调试效率,每次更改代码50多秒的build时间还是挺浪费的。

Instant Run要求Gradle的版本在2.0以上,minSdkVersion必须为15以上,最好的minSdkVersion是21(后面会解释为什么是21)。随着Android studio 2.0正式版上线,想正式的在团队内容推行Instant Run功能,但是却遇到了一个问题

Java
1
2
3
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里配置:

Java
1
2
3
4
5
6
7
8
android {
     defaultConfig {
         minSdkVersion 17
         targetSdkVersion 23
      
         multiDexEnabled  true
     }
}

另外需要导入multidex的依赖在Application进行分包:

Java
1
2
3
dependencies {
   compile 'com.android.support:multidex:1.0.0'
}

可以使用两种方式让Apk分包。

第一种,使用MultiDexApplication

Java
1
2
3
4
5
6
7
8
< 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方法:

Java
1
2
3
4
5
@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是这样的:

Java
1
2
3
4
5
6
7
8
9
android {
  
     productFlavors {
         flavor1 {
         }
         flavor2 {
         }
     }
}

Build Variant Build Type加上productFlavors就是Build Variant,一般的Build Type有两种debugrelease。对应的Build Variant就是:

Java
1
2
3
4
flavor1 + debug
flavor1 + release
flavor2 + debug
flavor2 + release

利用Build Variant可以定义不同的APK,比如:可以设置不同的version,也可以设置不同的minSdkVersion

下面看下如何使用Build Variant

首先定义两个productFlavors

Java
1
2
3
4
5
6
7
8
9
10
android {
     productFlavors {
         instant {
             minSdkVersion 21
         }
         app {
             minSdkVersion 17
         }
     }
}

同步完gradle之后,可以在View->Tool Windows找到Build Variants

510369169-5714c5be0c6ad_articlex

可以看到对于的Build variant:

2910141721-5714c5ce0da18_articlex

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值