使用 Multidex 对应用程序性能、稳定性、兼容性的影响...?
Impact of using Multidex on app performance, stability, compatibility...?
我的应用程序的下一个版本大约有 70K 个方法。
了解使用 Multidex 的确切含义(这通常意味着使用 Multidex 支持库来支持 API<21)对我做出这个决定很重要:
我应该付出很多努力(即通过微调我的 Proguard 配置以更积极地收缩,转储一些第 3 方库等)来遵守 64K 方法限制,还是我应该只是启用 Multidex?
documentation 表明 Multidex 支持库可能有一些严重的副作用(参见 Limitations of the multidex support library
)。
我应该期待什么?
- 在某些设备上安装失败?
- 应用程序启动缓慢(在第一次启动时或始终如此)?
- 某些设备出现新的崩溃或 ANR 问题?
- 整体性能下降?
非常感谢您对自己迁移到 Multidex 的反馈。
我不是 Dalvik 方面的专家,但我从事过几个项目,在某些时候需要 MultiDex,这些是我学到的一些经验教训:
Failed installs on some devices?
一些设备,特别是旧的 Gingerbread 手机(还有 ICS),使用非常小的 LinearAlloc 缓冲区,这可能会在安装或冷启动具有 too many classes or whose class hierarchy is too complex 的应用程序时导致错误。启用 MultiDex 不会直接导致此问题,但允许开发人员继续 "code bloat" 直到应用程序变得太大而无法在这些设备上 运行 ......有时只有在数百个时才会注意到非常伤心的用户开始致电您的客户支持。
Slow startup of the app (on 1st startup or always)?
安装或升级后的第一次启动肯定比较慢,主要是因为从 APK 中提取二级 dex 文件到文件系统中需要昂贵的 I/O 操作。随后的启动也会受到 类 的大小和复杂性的影响,这些 类 必须加载才能启动您的第一个 Activity
,因此最好 keep the main components of the app (specially activities) in the primary dex 尽量减少启动时间,尽管并非总是可以这样做。
New crashes or ANRs on some devices?
我们已经在 Alcatel OneTouch (2.3.3) 和 Google Nexus One (2.3.6) 手机中看到由 dex 提取时间过长引起的 ANR。在更现代的设备中,升级和冷启动 multidex 应用程序可能需要更长的时间,但通常不会导致 ANR。
Overall performance degradation?
Class 加载变得更慢并且以不可预知的方式影响应用程序。如果您使用 DI 系统、Protobuf 或其他生成数百个 类 的框架,那么您可能会发现一些应用程序工作流 becoming 20-25% slower after enabling multidex。缓解这种情况的一种方法是通过例如后台线程或 BroadcastReceiver
提前加载 类,但这些当然会增加应用程序的内存占用并可能减慢设备。
此外,如果 dexopts 发现主 dex 中缺少 类,一些安装时 dex 优化也可能被跳过,因此在 CPU 和内存使用方面可能会有相当大的惩罚甚至如果只有几个 类 最终出现在二级 dex 文件中。
Should I put a lot of effort (i.e. by fine tuning my Proguard configuration to shrink more aggressively, dumping some 3rd party libs etc.) to comply with the 64K methods limit, or should I just enable Multidex?
MultiDex 解决了 64K 的方法限制,但它不是灵丹妙药,恕我直言,不应作为避免优化 APK 大小的借口,但如果
- 您只针对现代设备(例如 API 16+)
- Performance/cold-start次并不重要
- 您没有时间进一步优化应用
那么 MultiDex 可能是合适的,否则剥离不必要的代码是可行的方法。
我最终选择了 multidex,主要是因为我的应用程序的路线图最终会迫使我这样做(因为我计划在不久的将来集成大型库)。
已经有一个多月了,installs/updates 的 multidex APK 已经有数十万个,所以我现在可以很有信心地说,在我的特定情况下,迁移到 multidex 没有任何明显的副作用案例.
(注意:更新仅针对 API 11+,因此我不能说 Android 2.x 存在潜在问题)。
我的应用程序的下一个版本大约有 70K 个方法。
了解使用 Multidex 的确切含义(这通常意味着使用 Multidex 支持库来支持 API<21)对我做出这个决定很重要:
我应该付出很多努力(即通过微调我的 Proguard 配置以更积极地收缩,转储一些第 3 方库等)来遵守 64K 方法限制,还是我应该只是启用 Multidex?
documentation 表明 Multidex 支持库可能有一些严重的副作用(参见 Limitations of the multidex support library
)。
我应该期待什么?
- 在某些设备上安装失败?
- 应用程序启动缓慢(在第一次启动时或始终如此)?
- 某些设备出现新的崩溃或 ANR 问题?
- 整体性能下降?
非常感谢您对自己迁移到 Multidex 的反馈。
我不是 Dalvik 方面的专家,但我从事过几个项目,在某些时候需要 MultiDex,这些是我学到的一些经验教训:
Failed installs on some devices?
一些设备,特别是旧的 Gingerbread 手机(还有 ICS),使用非常小的 LinearAlloc 缓冲区,这可能会在安装或冷启动具有 too many classes or whose class hierarchy is too complex 的应用程序时导致错误。启用 MultiDex 不会直接导致此问题,但允许开发人员继续 "code bloat" 直到应用程序变得太大而无法在这些设备上 运行 ......有时只有在数百个时才会注意到非常伤心的用户开始致电您的客户支持。
Slow startup of the app (on 1st startup or always)?
安装或升级后的第一次启动肯定比较慢,主要是因为从 APK 中提取二级 dex 文件到文件系统中需要昂贵的 I/O 操作。随后的启动也会受到 类 的大小和复杂性的影响,这些 类 必须加载才能启动您的第一个 Activity
,因此最好 keep the main components of the app (specially activities) in the primary dex 尽量减少启动时间,尽管并非总是可以这样做。
New crashes or ANRs on some devices?
我们已经在 Alcatel OneTouch (2.3.3) 和 Google Nexus One (2.3.6) 手机中看到由 dex 提取时间过长引起的 ANR。在更现代的设备中,升级和冷启动 multidex 应用程序可能需要更长的时间,但通常不会导致 ANR。
Overall performance degradation?
Class 加载变得更慢并且以不可预知的方式影响应用程序。如果您使用 DI 系统、Protobuf 或其他生成数百个 类 的框架,那么您可能会发现一些应用程序工作流 becoming 20-25% slower after enabling multidex。缓解这种情况的一种方法是通过例如后台线程或 BroadcastReceiver
提前加载 类,但这些当然会增加应用程序的内存占用并可能减慢设备。
此外,如果 dexopts 发现主 dex 中缺少 类,一些安装时 dex 优化也可能被跳过,因此在 CPU 和内存使用方面可能会有相当大的惩罚甚至如果只有几个 类 最终出现在二级 dex 文件中。
Should I put a lot of effort (i.e. by fine tuning my Proguard configuration to shrink more aggressively, dumping some 3rd party libs etc.) to comply with the 64K methods limit, or should I just enable Multidex?
MultiDex 解决了 64K 的方法限制,但它不是灵丹妙药,恕我直言,不应作为避免优化 APK 大小的借口,但如果
- 您只针对现代设备(例如 API 16+)
- Performance/cold-start次并不重要
- 您没有时间进一步优化应用
那么 MultiDex 可能是合适的,否则剥离不必要的代码是可行的方法。
我最终选择了 multidex,主要是因为我的应用程序的路线图最终会迫使我这样做(因为我计划在不久的将来集成大型库)。
已经有一个多月了,installs/updates 的 multidex APK 已经有数十万个,所以我现在可以很有信心地说,在我的特定情况下,迁移到 multidex 没有任何明显的副作用案例.
(注意:更新仅针对 API 11+,因此我不能说 Android 2.x 存在潜在问题)。