一、查看启动速度
在启动应用的时候查看AndroidStudio的日志,过虑框中输入:Display就可以看到启动时间
如果是在比较老的机器上(4.4以下)使用命令行
//adb shell am start -W 包名/要启动的activity全类名
adb shell am start -W com.taiyao.tyle/com.taiyao.tyle.activity.SplashActivity
关于ThisTime/TotalTime/WaitTime的区别可以参考博客:http://androidperformance.com/2015/12/31/How-to-calculation-android-app-lunch-time.html
二、APP启动流程
应用启动执行顺序:开辟内存,启动系统服务执行ActivityThread线程创建Application-->执行Application的Oncreat方法-->执行MainActivity的oncreate方法-->加载layout_main.xml-->显示第一帧画面
三、启动黑白屏优化
-
1.将window背景的图片替换成自己设置的图片,虽然不能提升速度,但是可以提升一部分用户体验,不至于让用户看到启动时黑屏或者白屏。缺点:这样使用会使得其它界面都会出现这个背景
<style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="windowBackground">@drawable/bg</item> </style>
-
2.将window设置成透明的,用户也看不到黑白屏的出现,缺点:点击启动图标后会有短暂的延迟。
<style name="AppTheme" parent="Theme.AppCompat.Light"> <item name="android:windowIsTranslucent">true</item> </style>
-
3.单独给SplashActivity设置一个主题,启动完成后将主题还原
1> 定义样式
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bg</item>
</style>
2> 引入样式
<activity
android:name=".activity.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.Launcher"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
3> 在SplashActivity的onCreate方法中设置回原来的样式
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
}
四、使用Debug类查看代码耗时
//trace文件保存路径
File file = new File(Environment.getExternalStorageDirectory(), "appDebug");
//开始计时
Debug.startMethodTracing(file.getAbsolutePath());
...(此处省略N行代码)
//停止计时
Debug.stopMethodTracing();//与start方法成对出现
上述代码会将代码耗时保存在file路径下的appDebug.trace 文件里面,打开一个androidStudio窗口将文件拖进去就可以打开。
通过上述图表分析,找到最耗时的函数进行优化
五、优化手段
- 1.没有创建handler,没有操作UI,异步要求不是很高的情况可以开启子线程执行耗时代码
例:部分第三方的sdk初始化的代码中有创建Handler,这种情况下就不可以将其放入子线程
- 2.将耗时初始化代码变成懒加载形式,通过单例等手段,使用的时候再加载
- 3.延时加载或者在onResume的时候在加载等其它手段:总之我们优化的目的就是让application的onCreate和 activity的onCreate方法中不执行耗时代码或者将其挪动到其它地方去。
通过反编译腾讯QQ早期版本的APK发现其onCreate方法中是没有执行任何代码的,非常干净。
网友评论