Android 在 Multidex 下使用 Instant Run

Instant Run是Android studio 2.0出现的新功能,在RunDebug的时候,只有在第一次build会花费大量的时间。以后再次Run或者Debug的时候会直接更新到手机上面,这样就能很快的显示出变化,加快了开发效率。
Instant Run要求Gradle的版本在2.0.0以上,minSdkVersion最低为15,最好minSdkVersion在21之上。随着Android studio 2.0正式版上线,想正式开始使用Instant Run功能,可是却遇到了一个问题:javascript

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.复制代码

大意是开启了multidex,SDK的最低版本要是21才能使用Instant Run。为何会有这个问题出现呢?
要回答这个问题,先要了解下什么是multidexhtml

Multidex

Android平台中代码会编译成Dalvik Executable(DEX)文件,而DEX文件是有方法数的限制的,不能超过65536个方法,包括使用的类库和本身写的代码的方法总数。65536就是64k,因此这个限制又称为64k限制,怎么解决这个解决这个限制的问题呢?有两个方案java

  1. 减小方法数
  2. 使用多个DEX文件(Multidex)

减小方法数当然是一个好方法,可是随着App功能的增长,控制必定的方式数是件很困难的事情,所以就须要使用Multidex的方案了。
使用Multidex,须要在gradle里面开启Multidex的设置,开启方式:android

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 17
        targetSdkVersion 23
        ...
        multiDexEnabled true
    }
    ...
}复制代码

还须要导入Multidex的依赖:app

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}复制代码

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

  • 使用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>复制代码
  • Application实现分包:
    @Override
      protected void attachBaseContext(Context base) {
          super.attachBaseContext(base);
          MultiDex.install(this);
      }复制代码

错误提示里面显示SDK大于21(Android 5.0)就能够,Android 5.0有不同的呢?答案是ARTgradle

ART

Android runtime(ART)是管理runtime和系统服务的技术,ART和Dalvik都可以从DEX的二进程文件中运行,ART是自然地支持Multiple DEX文件,ART在安装应用的时候扫描全部的DEX文件,编译成一个单独的.oat文件提供Android设备运行。更多的内容能够看:ARTui

Android 5.0上全面支持了ART技术,所以能够方便的使用Instant Run,一方面想使用Instant Run的强大功能,另外一方便又不能放弃低于5.0的Android设备。有没有一种可以二者兼具的方法呢?this

Build Variant

每次调试的都更新下minSdkVersion,这样一是使用不方便,另外是容易出错,容易把错误的代码提交到版本库,致使没必要要的错误出现,有没有一种方式可以经过配置构建不一样的环境,开发的时候使用Instant Run,Release的时候再支持Android 5.0如下的版本呢?这就要利用强大的gradle了。
要完成上面的任务须要使用一个功能productFlavors,productFlavors是gradle中的一个功能,能够根据不通的配置构建出不通的APK,好比构建不一样渠道的渠道包时会用到,通常productFlavors的DSL是这样的:spa

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
首先使用productFlavors:

android {
    productFlavors {
        instant {
            minSdkVersion 21
        }
        app {
            minSdkVersion 17
        }
    }
}复制代码

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

Build Variants

对于的Build Variant:

Build Variant

选择appDebug就能够运行minSdkVersion等于17的Apk,选择instantDebug就能够运行minSdkVersion等于21的Apk,后者就是使用Instant Run功能了。

相关文章
相关标签/搜索