当前位置: 移动技术网 > IT编程>开发语言>Java > 【Android 基础】Multi-Dex 原理(一) -- 背景和使用

【Android 基础】Multi-Dex 原理(一) -- 背景和使用

2020年07月23日  | 移动技术网IT编程  | 我要评论

    前言:

        传统的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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网