返回

抖音 BoostMultiDex 优化实践:Android 低版本 APP 首次启动时间减少 80%(一)

Android

提升Android低版本设备启动速度:BoostMultiDex的奥秘

在快节奏的移动应用时代,应用的首次启动时间往往决定了用户的体验。当用户打开应用时,漫长的等待只会让人心烦意乱,影响他们的使用情绪。对于Android低版本设备来说,这个问题尤为突出。

Android低版本的启动难题

Android低版本设备(4.X及以下,SDK < 21)采用Dalvik虚拟机作为Java运行环境。与高版本相比,Dalvik虚拟机在启动时需要将整个DEX(Dalvik Executable,包含已编译的字节码)文件加载到内存中,并对其进行解释执行。

然而,由于低版本Android系统内存有限,加载如此大文件需要花费大量时间。另外,DEX文件的加载需要经过三个耗时的步骤:DEX文件验证、优化和解释,这使得首次启动时间异常漫长。

BoostMultiDex的救赎

为了解决Dalvik虚拟机的痛点,Google在Android 4.4中引入了MultiDex机制。MultiDex将一个大的DEX文件拆分为多个较小的DEX文件(每个文件大小不超过64K),并分别加载到内存中。

与直接加载单个大DEX文件相比,MultiDex的优势显而易见:

  • 缩短加载时间: 多个小DEX文件的加载速度比单个大DEX文件快得多。
  • 减少内存占用: 多个小DEX文件可以并行加载,避免了大DEX文件占据大量内存的情况。
  • 提高稳定性: 由于DEX文件更小,出现加载失败或验证错误的可能性也更低。

Android 5.0及更高版本默认启用了MultiDex机制,而4.X及以下版本则需要手动开启。

实践中的优化

在字节跳动旗下短视频巨头抖音中,我们对BoostMultiDex进行了进一步优化,以提升低版本Android设备上的启动速度:

  1. 优化DEX文件: 通过移除无用的代码、合并相同代码块等优化技术,减小DEX文件的大小。
  2. 并行加载DEX文件: 使用并发线程并行加载多个DEX文件,缩短加载时间。
  3. 自定义ClassLoader: 重写ClassLoader,以优化DEX文件加载过程。

通过这些优化,我们在低版本Android设备上实现了应用首次启动时间减少80%的惊人效果。

最佳实践指南

在使用BoostMultiDex时,建议遵循以下最佳实践:

  1. 仅在需要时使用: 只有在DEX文件大于64K时才使用BoostMultiDex。
  2. 优化DEX文件: 尽可能减小DEX文件的大小。
  3. 并行加载DEX文件: 使用并发线程并行加载多个DEX文件。
  4. 监控DEX文件加载时间: 使用性能监控工具监控DEX文件加载时间,并根据需要进行优化。

结语

BoostMultiDex是一种有效且实用的技术,可以显著减少Android低版本设备上应用的首次启动时间。通过对BoostMultiDex的优化,我们可以为用户提供更流畅、更愉悦的应用体验。

常见问题解答

  1. 什么是DEX文件?
    DEX文件(Dalvik Executable)包含已编译的字节码,是Dalvik虚拟机执行Java程序所需的文件。

  2. 为什么低版本Android设备的启动时间较长?
    低版本Android设备的Dalvik虚拟机在启动时需要将整个DEX文件加载到内存中,并对其进行解释执行,这需要花费大量时间。

  3. MultiDex如何缩短启动时间?
    MultiDex将一个大的DEX文件拆分为多个较小的DEX文件,并并行加载它们,从而显著缩短加载时间。

  4. 除了MultiDex之外,还有哪些优化技术可以提升Android低版本设备的启动速度?
    其他优化技术包括使用ProGuard混淆代码、优化图像资源、使用冷启动优化方案等。

  5. 如何手动开启MultiDex?
    在Android 4.X及以下版本中,需要在清单文件中添加android:multiDexEnabled属性并将其设置为true,如:

    <application
        android:multiDexEnabled="true"
        ... />