Android dex分包方法的简介

  • 什么是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]: 6553

或者其他类似的包含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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值