AndroidVm

热知识:java常见的虚拟机如Hotspot虚拟机是基于栈结构的,而Dalvik是基于寄存器结构的。

常见的java虚拟机跑的是.class文件,而Dalvik跑的是.dex(.odex)文件。

image-20210602170532688

BoostMultiDex优化Dalvik虚拟机多Dex启动速度

Android 4.4 及以下采用的是 Dalvik 虚拟机,在通常情况下,Dalvik 虚拟机只能执行做过 OPT 优化的 DEX 文件,也就是我们常说的 ODEX 文件。

一个 APK 在安装的时候,其中的classes.dex会自动做 ODEX 优化,并在启动的时候由系统默认直接加载到 APP 的PathClassLoader里面,因此classes.dex中的类肯定能直接访问,不需要我们操心。

除它之外的 DEX 文件,也就是classes2.dex、classes3.dex、classes4.dex等 DEX 文件(这里我们统称为 Secondary DEX 文件),这些文件都需要靠我们自己进行 ODEX 优化,并加载到 ClassLoader 里,才能正常使用其中的类。否则在访问这些类的时候,就会抛出ClassNotFound异常从而引起崩溃。

因此,Android 官方推出了 MultiDex 方案。只需要在 APP 程序执行最早的入口,也就是Application.attachBaseContext里面直接调MultiDex.install,它会解开 APK 包,对第二个以后的 DEX 文件做 ODEX 优化并加载。这样,带有多个 DEX 文件的 APK 就可以顺利执行下去了。

这个操作会在 APP 安装或者更新后首次冷启动的时候发生,正是由于这个过程耗时漫长,才导致了我们最开始提到的耗时黑屏问题。

1
2
3
4
5
if (Build.VERSION.SDK_INT <= 19) { 
BoostMultiDex.install(this);
} else {
MultiDex.install(this);
}

Tips:

除以 2 ,右移 1,谁更好

A:没区别(ART有优化)

  1. ART 使用左移/右移重写了二次幂的乘法/除法(处理负数时会有增加额外的指令)。
  2. 右移和二次幂除法之间并没有明显的性能差距。
  3. 移位和乘除法的 Dalvik 字节码大小是一样的。
  4. 没有人优化了无符号除法(至少现在没有),但是你应该也没有用过。
Author

white crow

Posted on

2021-04-10

Updated on

2024-03-25

Licensed under