11 月 16 日, 谷歌宣布通过隔离拆分代码提高 Android 上 Chrome 的速度和内存使用率。通过这些改进,Android 上的 Chrome 现在使用的内存减少了 5-7%,并且启动和加载页面的速度比以前更快。
对于 Android 应用程序(包括 Android 上的 Chrome),编译后的 Java 代码存储在.dex 文件中。由于其多进程架构,Android 上 Chrome 的用户体验对 .dex 大小的增加特别敏感。
在 Android 上,Chrome 会一直运行 3 个以上的进程:浏览器进程、GPU 进程和一个或多个渲染器进程。Chrome 的 Java 代码绝大多数只在浏览器进程中使用,但加载代码的性能和内存成本是由所有进程支付的。
捆绑包和功能模块
最理想的情况是加载浏览器进程运行所需的最小 Java 块。谷歌通过使用 Android App Bundles 并将浏览器进程代码拆分为功能模块来接近这一点,功能模块可以在用户需要时才加载。
例如,如果一个应用程序有一个只有一部分用户需要的大型功能,该应用程序可以避免为不需要的用户安装。但是,对于更常用的功能,在运行时才下载的功能可能会给用户带来困扰——例如,如果移动数据不可用,则会带来额外的延迟或挑战。
最理想的情况是能够提前安装所有标准模块,但只在实际需要时才加载。
特征模块
在 Chrome 的情况下,渲染器和 GPU 进程中所需的少量代码可以保留在基本模块中,浏览器代码和其他高内存消耗的功能可以在需要的时候拆分成功能模块进行加载。使用这种方法,谷歌将加载在子进程中的 .dex 大小减少 75% ,到大约 2.5MB,启动更快,并使用更少的内存。
该架构还启用了浏览器进程的优化,通过在后台线程上预加载大部分浏览器进程代码来缩短启动时间,同时应用程序初始化导致加载时间缩短 7.6%。当需要浏览器代码的 Activity 或其他组件启动时,实际上它已经被加载了。
通过优化如何将特征分配到特征模块中,就可以实现按需加载特征,从而节省内存和加载成本。
结论
目前,Chrome 在 Android Oreo 或更高版本的 Android 的内存使用、启动时间、页面加载速度和稳定性方面拥有以下改进:
- 总内存使用量中位数提高了 5.2%
- 中值渲染器进程内存使用量提高了 7.9%
- GPU 进程内存使用中位数提高了 7.6%
- 浏览器进程内存使用中位数提高了 1.2%
- 95% 的启动时间提高了 7.6%
- 95% 的页面加载速度提高了 2.3%
- 浏览器崩溃率和渲染器挂起率的大幅改进