Android multidex的实现

本文详细介绍了如何在Android应用中启用MultiDex,以解决方法数超过64K的问题。通过添加依赖、配置Gradle、指定或继承MultiDexApplication,以及创建并指定主dex列表,确保应用正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网镇楼 为方法数超过 64K 的应用启用 MultiDex | Android 开发者 | Android Developers

为什么需要 multidex

单个 DEX 文件内可引用的方法总数不能超过 65536。

怎么使用

1 添加依赖

dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}   

2 app下的 build.gradle 添加

defaultConfig {
        //其他的忽略
        
        //enable multidex
        multiDexEnabled true
    }

3 指定 Application 为 MultiDexApplication

在项目注册文件中,指定 Application 为 MultiDexApplication

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

但是这种方式的局限是,应用的 Application 都是自定义的,直接指定为 MultiDexApplication 就不能做某些初始化等。
于是可修改为应用的 Application 继承 MultiDexApplication:

public class MyApplication extends MultiDexApplication { ... }

继承的方式也有局限,所以推荐这种方式:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);

        //enable multidex
        MultiDex.install(this);
    }
}

指定主dex要打包的文件

创建 my_multidex_list.txt 文件,名称任意命名。这个文件里指明的文件就会打包到主 dex 。

my_multidex_list.txt 与 build.gradle 文件在同一目录下。
不放在同一目录也可以,但是要保证 multiDexKeepFile file () 语句找得到 my_multidex_list.txt 文件。

multidex 的相关类必须放进去,否则会报错。

按照规则添加需要打包进去的类。

// multidex 
androidx/multidex/MultiDex$V14$ElementConstructor.class
androidx/multidex/MultiDex$V14$ICSElementConstructor.class
androidx/multidex/MultiDex$V14$JBMR11ElementConstructor.class
androidx/multidex/MultiDex$V14$JBMR2ElementConstructor.class
androidx/multidex/MultiDex$V14.class
androidx/multidex/MultiDex$V19.class
androidx/multidex/MultiDex$V4.class
androidx/multidex/MultiDex.class
androidx/multidex/MultiDexApplication.class
androidx/multidex/MultiDexExtractor$1.class
androidx/multidex/MultiDexExtractor$ExtractedDex.class
androidx/multidex/MultiDexExtractor.class
androidx/multidex/ZipUtil$CentralDirectory.class
androidx/multidex/ZipUtil.class
androidx/swiperefreshlayout/widget/CircularProgressDrawable$ProgressDrawableSize.class
androidx/versionedparcelable/NonParcelField.class
androidx/versionedparcelable/ParcelField.class
androidx/versionedparcelable/VersionedParcelize.class
androidx/viewpager/widget/ViewPager$DecorView.class

// 我添加的
com/luo/multidexdemo/MyApplication.class
com/luo/multidexdemo/MainActivity.class

在 app 的 build.gradle 下添加

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            multiDexKeepFile file ('my_multidex_list.txt')
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值