Android性能优化——启动优化
2024-01-09 12:13:27
一个App的启动流程的至关重要 ,这是用户启动App后对App的第一印象。
在一些小型项目上,如何去优化启动显得无足轻重,但是当一个项目达到足够的量,业务设计足够多时,若不注意app的启动优化,则会出现很多问题。例如一些三方插件的初始化,网络请求初始化,数据库,io操作,动画等等,这无疑都会增加初始化的工作量。
如果全都把一些事务放在App启动的时候,则会造成卡顿,黑白屏等现象,这样会带来极差的用户体验。
今天,来总结下自己平时会在项目中用到的App启动优化。
大致的优化方向可以从下图看到:
?1.冷启动&&热启动耗时
我们都知道,app分为冷启动和热启动;
- 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
- 热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。因为应用还在后台,因此该启动方式不会重建Application,只会重新绘制UI等相关流程。
所以我们可以使用一些工具和方法来查看,App冷启动期间,花费了多少时间,在哪些时候花费了过多的时间以进行优化。
方法一:
常规获取时间方法无非就是在方法执行前记录下时间,在方法执行完毕后记录时间,两者时间之差就是该方法执行的时间.
或者使用 adb 命令统计?adb shell am start -S -W 包名/启动类的全限定名
方法二:使用工具
1、通过Android SDK自带的Debug。
@Override
public void onCreate(final Bundle b) {
setTheme(R.style.BrowserTheme);
Intent intent = getIntent();
NLog.i(LOGTAG,"onCreate");
super.onCreate(b);
//开始记录,且该方法可以设置文件大小和路径
Debug.startMethodTracing("browser.trace");
Controller controller=createController();
mController = controller;
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
controller.handleThirdPartyIntent(intent);
//结束记录
Debug.stopMethodTracing();
}
如上可以在目录下可以生成如下文件:
/sdcard/Android/data/com.xxx.xx.browser/files/browser.trace
使用Android自带的Profile工具导出该文件:
可以看到以下效果
1处可以看出有多少线程。
2处可以看出具体方法的耗时。
3处有两个选项:
- wall clock time:代码在线程上执行的真正时间[有一部分是等待cpu轮询时间]
- thread time :cpu执行的时间
根据方法执行时间的具体情况,可以进行启动的优化,例如延迟加载,网络请求,IO操作可以新开一个线程去执行。
2.基本优化
- Theme优化:我们在点击App启动后,会有一个黑白屏,这是非常不友好的;
- 1).通过给应用设置一个透明主题,在应用启动完成之后,再给其赋予本该有的主题,通过对启动页的主题设置后,就会将白屏/黑屏抹去,用户点击App的图标就展示启动图,让用户先产生启动很快的“错觉”。
- 2).为了更顺滑无缝衔接我们的闪屏页,可以在启动 Activity 的 Theme中设置闪屏页图片,这样启动窗口的图片就会是闪屏页图片,而不是白屏。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/lunch</item> //闪屏页图片
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item><!--显示虚拟按键,并腾出空间-->
</style>
- UI优化:启动页的UI很多时候,会加载一些动画,进度条或者是广告,一方面我们可以从代码层面优化布局代码,优化动画的执行等等,另一方面,我们可以加载一个广告,进度条来给用户一个几秒的倒计时的假优化。
3.异步加载
- 采用线程加载一些资源,比如sdk初始化,配置信息拉取等相关资源。线程,线程池,IntentServices均可以,配合延迟效果更好。
- 在自定义Application的onCreate方法中尽量少做操作,能在后台进行初始化的都在后台初始化,能延迟初始化的就延迟初始化,建议在onCreate方法中启动IntentService做初始化操作。
?
文章来源:https://blog.csdn.net/LoveFHM/article/details/135469556
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!