Android Multidex(dex分包)

分包: 一个dex分成多个dex

什么要分包

单个 Dalvik Executable (DEX) 中, 可调用的最大的引用总数为 65536 ,若超过了将会报错.
这时就需要分成多个DEX文件.

为什么是65536个引用总数呢?

因为 引用采用short类型存储 2^(2*8)=65536,
由于64*1024=65536 ,所以又称为 64K引用限制

开启对多dex文件的支持

Android5.0之前:

Android5.0之前, 大多数平台采用Dalvik虚拟机来运行应用, 默认只使用一个classes.dex.

只需添加依赖库即可

android {defaultConfig {...multiDexEnabled true}...
}dependencies {implementation 'com.android.support:multidex:1.0.3'
}

Application添加

public class MyApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);// 启用MultiDex的入口MultiDex.install(this);}
}

Android5.0之后:

Android5.0之后, 大多数平台采用ART运行应用程序, 他会在安装预编译(AOT)时, 将多个classes.dex文件编译成单个oat文件.

所以你不需要做任何操作.

声明主DEX文件所需的类

classes.dex为主DEX文件, 其余的classes2.dex, classes2.dex, 等等均为辅DEX文件.

如果主DEX启动时, 所需要的类却被放在了辅DEX文件里, 那么就有可能抛出java.lang.NoClassDefFoundError异常.

手动配置主DEX所需的类

把启动页所需要的类都包含进去.

版本参数(参考)

classpath 'com.android.tools.build:gradle:3.2.0'
minSdkVersion 16

配置 multiDexKeepProguard 属性

这种方式支持全部 Proguard 语法, 能让配置更简单方便, 所以推荐使用这种方式.

  1. app目录下, 创建一个名为multidex-config.pro文件

    在该文件中放入主DEX所需的类的全类名, 前面加上-keep class

    -keep class me.luzhuo.multidexdemo.MainActivity
    -keep class me.luzhuo.multidexdemo.more.MoreMethod56// 将该包下的所有类都放到主DEX文件中
    // -keep class me.luzhuo.** {*;}
    
  2. 在Gradle文件中配置 multiDexKeepFile 属性

    android {buildTypes {release {multiDexKeepProguard file('multidex-config.pro')}debug {multiDexKeepProguard file('multidex-config.pro')}}
    }
    

只需上述两步即可, 编译运行.
你会发现第一次安装启动时白屏会很久, 这是因为系统需要加载多个dex生成ODEX, 比较耗时.
如果下次启动, 只需要加载ODEX就可以了, 所以就会很快启动.

我们的分包结果:

哪些包要指定到主DEX里:
一般来说与SplashActivity相关的类, 一般也不会太多.

启动时ANR无响应的解决方案

出现ANR的原因是提取DEX和DexOpt这两个耗时操作都在主线程进行,
就算你解决了64K限制, 也有可能在旧的机型上, 因为分配的内存不够你塞代码而闪退(linearAlloc限制).

官方给出的方案是: 使用R8压缩代码
(谁叫你写那么多代码, 我不管, 你试试摇树优化, 可以帮你删掉些没用的代码 -_-!!!)

Android Gradle 插件 > 3.4.0 时, 默认开启R8编译器, 编译任务是自动完成代码优化任务: 摇树优化(去除没用到的代码), 资源压缩, 混淆, 优化.

并且R8支持全部 ProGuard 规则.

注: 不要在测试版本里开启, 会拖累你的开发进度, 应当在发布版本里开启.

开启R8:

android {buildTypes {release {// 启用R8minifyEnabled true// 启用资源压缩shrinkResources true// R8配置文件proguardFiles getDefaultProguardFile(// Android Gradle 生成'proguard-android-optimize.txt'),// Android Studio 生成'proguard-rules.pro'}}...}

proguard-rules.pro文件

该文件由Android Studio 帮你生成, 你可以添加自己的规则.

# 保留的代码
-keep class me.luzhuo.multidexdemo.more.MoreMethod57

关于这块内容, 已经在另一篇文章里讲过

参考文章: https://developer.android.google.cn/studio/build/multidex.html?hl=zh-cn

Android Multidex(dex分包)相关推荐

  1. 【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )

    文章目录 一.Dex 打包设置 1.多 Dex 支持 2.Dex 分包设置 3.开发和产品风格设置 ( 非必须 ) 二.完整 build.gradle 配置 1.build.gradle 配置 2.d ...

  2. dex分包方案概述与multidex包的配置使用

    参考资料: Android dex分包方案 Android分包MultiDex原理 <Android开发艺术探索> 博客中间会涉及到dex文件的反编译,参考博文: dex文件的反编译-de ...

  3. Android MultiDex 分包及加载原理

    彻底了解 65536 方法数超限的问题根源,与官方的 MultiDex 方案原理. Problem 日常开发中,一旦项目变的庞大起来,很容易遇到如下的编译错误: trouble writing out ...

  4. Android dex分包方案 (多dex)

    原文地址: http://my.oschina.net/853294317/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在 ...

  5. android multidex 3个dex,Android MultiDex中一个疑问

    Android MultiDex 使用过MultiDex都知道,AndroidStudio会在编译过程中划分多个dex,如class.dex,class2.dex... 这里有一个问题,主dex是如何 ...

  6. Android MultiDex 解析与使用

    Android MultiDex 解析与使用 背景 随着你的Apk不断的迭代更新,到你的apk到达一定大小的时候,你在编译apk的时候可能会出现下面的错误: Conversion to Dalvik ...

  7. Android MultiDex实践:如何绕过那些坑?

    本文是我的同事徐冬投稿,介绍他在方法数到达65k上限后,应用官方MultiDex方案时踩过的一些坑,以及如何解决这些棘手问题的实践过程. 前言 Android应用65k方法数的限制一直为广大开发者所诟 ...

  8. android MultiDex multidex原理原理下遇见的N个深坑(二)

    android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...

  9. Android MultiDex分析

    前言 我先占个坑吧,暂时不想分析了. MultiDex在install的时候,过久会导致ANR-- 这个问题经常见于低端机上. 原理 类加载机制系列3--MultiDex原理解析 Android Mu ...

最新文章

  1. 从上往下 流式布局_教大家怎么写前端布局
  2. 论对一个程序的满意程度 | 每日趣闻
  3. android studio修改项目包名
  4. 爬虫利器 puppeteer
  5. elasticsearch 集群no known master node
  6. 《Python学习笔记》——南溪的python编程笔记
  7. 【JZOJ4922】【NOIP2017提高组模拟12.17】环
  8. python编程师app_新技能:用 Python 写一个安卓 APP
  9. 第十二章UML与Rational Rose 软件
  10. 17种最重要的项目管理方法
  11. 信息安全工程师真题1
  12. jquery蝴蝶飞舞网页动画js特效代码
  13. 基于主从博弈的智能小区代理商定价策略及电动汽车充电管理
  14. photoshop抠图场景二
  15. java 截图_Java实现网页截屏
  16. Spring 集成与分片详解
  17. 通过PS制作一个苹果样式的“牛仔裤”
  18. 算法基础--梯度消失的原因
  19. 制作一个经典坦克大战
  20. [bx]与loop指令

热门文章

  1. Win7 下U盘安装Ubuntu16.04 双系统详细图文教程
  2. 影视管理系统-七星修改二开米酷影视7.2完整版源码
  3. Matlab|基于时间序列预测的粒子群优化混合非线性回归和自回归技术的比较
  4. COOX基础培训之RS
  5. Ghost-最好安装原装的最新版本的ghost(不是onekeyghost等封装版本,而是symantec英文版),推荐使用大白菜安装系统
  6. oracle简单入门(全面)
  7. 清华大学张长水教授:机器学习和图像识别(附视频、PPT下载)
  8. 探索接入网和网络运营商——光纤接入网(FTTH)
  9. 使用鱼骨图构建AS-IS和TO-BE - 过程改进和讨论
  10. dx12 龙书第十八章学习笔记 -- 立方体贴图