Android性能优化——启动优化

发布时间:2024年01月09日

一个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.异步加载
  1. 采用线程加载一些资源,比如sdk初始化,配置信息拉取等相关资源。线程,线程池,IntentServices均可以,配合延迟效果更好。
  2. 在自定义Application的onCreate方法中尽量少做操作,能在后台进行初始化的都在后台初始化,能延迟初始化的就延迟初始化,建议在onCreate方法中启动IntentService做初始化操作。

?

文章来源:https://blog.csdn.net/LoveFHM/article/details/135469556
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。