1、背景
我们继上一篇介绍如何计算启动时间以及工具的使用后,我们现在结合输入法项目通过TraceView来讲解优化过程。
2、分析
- Multidex的使用
通过使用TraceView分析trace文件,发现Multidex调用的方法比较耗时。
MultiDex工作在主线程,而Dex的提取与DexOpt的过程都是耗时的操作,所以ANR的问题是必然存在;
拆分出来的Dex越多,对应ANR的几率也就越高。所以Multidex不光会拖慢启动速度,而且严重的时候会导致应用ANR。
值得一提的是Android 5.0 以及更高版本使用ART,所以不存在由于分包的原因导致首次启动比较慢的问题,
ART 在应用安装时执行预编译,扫描 classesN.dex 文件,并将它们编译成单个 .oat 文件,供 Android 设备执行。
如果您的 minSdkVersion 为 21 或更高值,则不需要添加分包支持库。
对于Android 5.0以下的设备由于分包导致的启动比较慢的问题,只能通过减小包体减少方法数,从而使得在apk中的dex文件不需要进行分包来解决问题。 - 数据库初始化
通过分析trace文件,以下初始化方法调用耗时较大:
1.GoKeyboardDataProviderEmoji.onCreate()
2.AdSdkApi.initSDK()
其实它们有个共性,就是都使用到了数据库。 在GoKeyboardDataProviderEmoji.onCreate()和AdSdk.init()都会创建一个DatabaseHelper对象,在DatabaseHelper 的构造函数中都会调用getWritableDatabase(),我们看下getWritableDatabase()这个方法的注释:
/**
*Create and/or open a database that will be used for reading and writing.
* The first time this is called,