【Android 基础】Multi-Dex 原理(一) -- 背景和使用
前言:
传统的java程序,java的源文件或者kt文件,经过编译会生成class文件,最终运行在java虚拟机上。但是android的手机内存有限,所以针对手机,android把class文件重新经过翻译解释打包等过程,打包成dex文件,dex文件包括了多个class文件,包括class文件的常量池等,可以理解为对原有的class文件做了压缩,去冗余,使得dex文件更小,运行起来更快,更适用于移动设备
区别于传统的JAVA程序,android程序的编译过程:
1、Android Apk 默认的结构
一个简单的安卓程序,编译生成apk的时候,默认的apk结构是:
|-- AndroidManifest.xml
|-- assets/
|-- res/
|-- META-INF/
|-- resources.arsc
|-- classes.dex
原生的编译过程,只会生成一个dex文件,但是由于工程的扩展,我们经常会遇到65536的错误,意思是dex文件中的方法超限了。为啥是65536呢:
|-- classes.dex -- 结构 -- .dex file
header
constant pool ---------method id 方法索引,它是一个USHORT类型
class defination1
...
class defination n
data
在dex文件中,所有的方法通过一个USHORT类型的索引进行索引,而USHORT的长度是0~65535,所以当方法超过这个限制的时候,就会报这个错误,如果规避这个错误呢?android提供了一个方案 : Muti - dex
2. Android 接入muti - dex方法
- android 5.0 (SDK 21) 以上的版本Google已经做好了处理,所以在build.gradlew里添加对应的配置即可
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
- android 5.0 以下的版本,需要自己行的做一下配置处理
defaultConfig {
minSdkVersion 14
targetSdkVersion 28
multiDexEnabled true
build.gradlew中minisdkversion支持兼容的最新的sdk版本小于21,说明需要支持5.0以下的版本,此时需要手动的添加依赖
dependencies {
implementation 'androidx.multidex:multidex:2.0.1'
}
需要将应用的application和MultiDexApplication进行绑定,绑定方式有三种:
(1)androidmanifest 中直接定义
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application 直接使用support下的MultidexApplication
android:name="com.xxx.MultidexApplication" >
...
</application>
</manifest>
(2)自定义的application直接继承MultidexApplication
public class MyApplication extends MultidexApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
(3)如果application已经继承了自定义的application,此时需要在attachBaseContext中,install
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
采用multidex的方式,最后生成的apk,会有多个dex
本文地址:https://blog.csdn.net/xing_827/article/details/107355275