android-support-multidex解决Dex 文件方法数超过65536

MultiDex的产生背景

当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。

但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容。

为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能。

MultiDex的简要原理

我们以APK中有两个dex文件为例,第二个dex文件为classes2.dex。

兼容包在Applicaion实例化之后,会检查系统版本是否支持 multidex,classes2.dex是否需要安装。
如果需要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。
通过反射将classes2.dex注入到当前的classloader中。


目前比较常用的方法:
(1) 应用插件化
(2) 分割Dex


本篇文章主要针对分割Dex展开探讨。

Google看来也意识到了目前应用方法数爆棚的问题, 目前在已经在API 21中提供了通用的解决方案,那就是android-support-multidex.jar. 这个jar包最低可以支持到API 4的版本(Android L及以上版本会默认支持mutidex).
下载地址:
http://download.csdn.net/detail/dfskhgalshgkajghljgh/9518153


具体集成:
1.将如下配置加入工程 build.gradle中

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile files('libs/android-support-multidex.jar')
}

2.导入jar包

从sdk\extras\android\support\multidex\library\libs 目录将android-support-multidex.jar导入工程中,或者从上面的链接下载。当然studio跟eclipse不同的是,jar导入后,要有另外的操作,如下图:
这里写图片描述
这样jar才算真正导入成功。

3.MultiDexApplication的继承
如果你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类,
如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法:

public class MyApplication extends Application {  
    @Override  
    protected void attachBaseContext(Context base) {  
        super.attachBaseContext(base);  
        MultiDex.install(this);  
    }  
}

4.在manifest文件中,添加MultidexApplication,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="teach.focus.notification">

    <application
        android:name=".MyMultiDexApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

5.运行项目后,到处apk,解压后,看是否存在两个dex文件,如图所示:

这里写图片描述

当然上次听一个哥们说,多dex加载的时候,第二个dex会比较慢,具体原因还没有研究。
具体代表,facebook用的分包,微信用的插件,后面将大力介绍插件。


如有错误欢迎指出来,一起学习。
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页