资讯专栏INFORMATION COLUMN

Android 在 Multidex 下使用 Instant Run

liuhh / 1146人阅读

摘要:使用多个的方式,需要先在里配置另外需要导入的依赖在进行分包可以使用两种方式让分包。第一种,使用使用作为即可。下面看下如何使用。

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功能,但是却遇到了一个问题:

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


    
        ...
    

使用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有两种debugrelease。对应的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://www.ucloud.cn/yun/12716.html

相关文章

  • 引入 Tinker 之后如何 Debug 模式开启 Instant Run

    摘要:在爬坑之路一文中讲了在接入之后,中的一些坑,由此,热修复算告一段落,但是,在直接模式运行时,程序会报出如下错误好吧,使用时不能开启上也有一个同样的,引入之后如何在模式下开启,这里我将我的方法讲述一下,给大家一个参考。在《Tinker + Bugly + Jenkins 爬坑之路》一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模...

    番茄西红柿 评论0 收藏0
  • 引入 Tinker 之后如何 Debug 模式开启 Instant Run

    摘要:在爬坑之路一文中讲了在接入之后,中的一些坑,由此,热修复算告一段落,但是,在直接模式运行时,程序会报出如下错误好吧,使用时不能开启上也有一个同样的,引入之后如何在模式下开启,这里我将我的方法讲述一下,给大家一个参考。 在《Tinker + Bugly + Jenkins 爬坑之路》一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 R...

    chengtao1633 评论0 收藏0
  • 【腾讯Bugly干货分享】Android Patch 方案与持续交付

    摘要:在安卓系统上,可以通过的思路来达到这一目的下发补丁文件,更新版本。只是一个加载器既然做安卓方案,最好的结果就是能支持更新所有的代码和资源。安卓系统的实现是包装了一层真正的上下文,真正使用到的就是这个。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a31... Android 不仅系统版本众多,机型众多,而且各...

    Karuru 评论0 收藏0
  • 待学习android知识 - 收藏集 - 掘金

    摘要:但需要在代码中引入,操作起来不太方便,另一方面仿微信支付宝的支付密码输入框掘金大家好,我是狸小华,萌汉子一枚。自定义滑动确认控件掘金项目前言目前上有很多对于按钮误操作的控制。 Android 技术选型(持续更新中...) - 掘金github主页: https://github.com/hss01248 log打印 经典库logger的优化版https://www.zybuluo.co...

    BetaRabbit 评论0 收藏0
  • 【腾讯Bugly干货分享】微信热补丁 Tinker 的实践演进之路

    摘要:本期,我们邀请了腾讯开发工程师张绍文,为大家分享微信热补丁的实践演进之路。对于微信热补丁的更多信息,可以阅读我之前发的一篇文章。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ad7... Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享...

    Karrdy 评论0 收藏0

发表评论

0条评论

liuhh

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<