拖慢 APP 启动的 5 个常见问题
- English |
- 中文
在过去的几个月里,通过 NimbleDroid 的分析,我们分享了很多导致安卓 APP 运行变慢的常见问题。在本文中,我们把这些问题总结如下。
-
Java 发射的使用。在 Java 和安卓开发中,反射是非常有用的特性。但是如果使用不当,反射往往是导致安卓 APP 严重性能问题的元凶。例如,你使用 Gson 来序列化/反序列化大量的数据,使用反射的 adapter 会严重拖慢你的 APP。请使用自定义的 adapter。我们的建议是,理解你们使用反射(或者利用反射的库)会导致怎样的后果。更多关于安卓平台反射问题的分析,请看这篇文章。
-
依赖注入。依赖注入可以极大地减少你需要编写(以及调试)的代码。这很棒,依赖注入让我们可以打造更优秀的 APP,并且让我们的开发过程更加顺畅。但是你需要时刻留意依赖注入为 APP 运行带来的额外开销。例如,如果你使用的 Roboguice 框架,你的 APP 相比于使用 Dagger 1 会增加很长的启动时间(长达 2000ms),Dagger 2 的性能会更好。除了极大的性能开销,Roboguice 还比 Dagger 1 和 Dagger 2 多 10K 个方法。更多关于安卓平台依赖注入最佳实践的内容,请看这篇文章。
-
主线程中的慢方法。慢方法就是那些会导致主线程超过 32ms 延迟的方法,这会导致用户感知到 APP 的卡顿。慢方法会让你的 APP 使用起来很不流畅,严重影响品牌的形象。尽管安卓系统的开发者选项的严格模式可以检测到慢方法,但它却不能给予任何提示,而阻塞主线程的情况又非常多,每种情况都需要考虑。更多关于慢方法的问题,请看这篇文章。
-
ClassLoader.getResourceAsStream。对于大量的 APP 和 SDK 来说,ClassLoader.getResourceAsStream() 就是一个噩梦。尤其是在安卓平台上第一次执行这个方法时,系统会两次解压 APK 文件,检查 APK 签名。因此这个方法的调用非常慢,而且执行时间和 APK 的大小成正比。在 20MB 的 APK 中,执行时间超过 2s 的非常常见。关于 为什么 ClassLoader.getResource 如此之慢的问题,请看这篇文章。
-
第三方库和 SDK 中的性能问题。我们发现很多第三方库和 SDK 都存在严重的性能问题。这并不出人意料,因为第三方库也是程序员编写的,也同样会遇到上面提到的种种问题。然而从第三方库中寻找问题并不容易。为了帮助开发者选择第三方库,我们整理了常用第三方库和 SDK 中存在的问题列表,以帮助安卓开发者避免使用存在问题的库和 SDK。详细列表请看这篇文章。