欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-21 20:38:52
前言: 区别于传统的JAVA程序,android程序的编译过程: Android Apk 默认的结构 一个简单的安卓程序,编译生成apk的时候,默认的apk结构是:|-- AndroidManifest.xml|-- assets/|-- res/|-- META-INF/|-- resources.arsc|-- classes.dex 原生的编译过程,只会生成一个dex文件,但是......

    前言:

        传统的java程序,java的源文件或者kt文件,经过编译会生成class文件,最终运行在java虚拟机上。但是android的手机内存有限,所以针对手机,android把class文件重新经过翻译解释打包等过程,打包成dex文件,dex文件包括了多个class文件,包括class文件的常量池等,可以理解为对原有的class文件做了压缩,去冗余,使得dex文件更小,运行起来更快,更适用于移动设备

        区别于传统的JAVA程序,android程序的编译过程:

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

    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

相关标签: Android相关