Android dex分包方法简介

目录

 

什么是dex

为什么用到分包 

mutidex使用方法


  • 什么是dex

        Dex就是Dalvik VM executes的全称,可以认为是安卓虚拟机的可执行程序。

  • 为什么用到分包 

        大致可以分为2个原因。

        1 dex中包含的方法囊括了所有依赖的jar包和源码中的方法。在稍微大一些的项目中,这个方法数目是很可观的。而dex中表示方法数目的是short类型。所有最大只能表示到65536. 因此会出现一个dex无法保存所有方法的情况,此时需要分包。这里一般都是报错:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

        或者其他类似的包含65536的错误。一般都是这个原因导致的。

        2 还有一个情况是,方法数并没有达到上限,但是安装运行报错。因为在android虚拟机有一个optdex来优化dex,在优化过程中每个optdex都有固定大小的缓冲区。最初的时候3.0之前只有5m, 现在最大的好像是16m了。但是无论多大,如果出现了超过上限的情况也会报错。一般报错内容包含optde字样。

        因此针对以上两种情况。需要使用分包机制。避开这些限制。

  • mutidex使用方法

     目前安卓系统已经提供了可用的方法。以studio开发为例。

   defaultConfig {
        applicationId "com.example.demo"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 20180727
        versionName "8.0.8"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

     首先在defaultConfig中添加mutilDexEnabled 为true。之后在dependependecies中添加依赖

api 'com.android.support:multidex:1.0.1'

     添加完依赖之后有两种方法可以实现分包。

     1 项目中的Application子类不要直接继承Application,而是继承MultiDexApplication。例如:

public class MyApp extends MultiDexApplication {

    @Override
    public void onCreate(){
        super.onCreate();
        EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false)
                .sendNoSubscriberEvent(false).eventInheritance(false).build();

    }

    2 如果不想修改Application的继承关系。那么可以复写applicaiton子类中的attachBaseContext方法:


    @Override
    protected void attachBaseContext(Context base){
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值