App启动优化

作者: arvinljw | 来源:发表于2020-04-27 12:35 被阅读0次

App的启动被分成了:

  • 冷启动:系统没有为该程序创建进程,程序从头开始启动;例如,安装后第一次启动,应用程序被系统完全终止之后再打开。
  • 热启动:此程序仍然留在内存中,只是被系统从后台带到前台,可避免重复对像初始化和避免重复加载和渲染;例如,使用home键退到桌面,再重新启动。
  • 暖启动:包含了冷启动和热启动的部分操作,消耗比热启动多一些,与热启动的区别在于,它启动时会调用onCreate方法,相当于是介于冷启动和热启动之间的情况;例如,使用back键退出应用并重新启动。

因为冷启动的流程,会先加载并启动app,启动后会马上显示一个空白窗口,然后再创建app进程,创建launchActivity,加载和绘制布局。

这个过程中我们能优化处理的部分就是:

  • 空白窗口
  • Application的onCreate方法
  • launchActivity的onCreate,onStart,onResume方法

注意:如果在Application和launchActivity的以上方法中有启动其他activity的,那么启动的这个activity的onCreate,onStart,onResume方法也需要优化

黑白屏优化

这个空白窗口在有些主题下是白色有些主题下是黑色,这样就出现了黑白屏的问题。

如果app启动的过程中,有耗时操作或者性能差一些的手机,这个黑白屏的显示时间就会让用户感知到,影响体验,而我们能对这个空白窗口的样式进行改变,变成我们启动页的样式或者大体和启动页的样式一致,这样我们就比较优雅的解决了黑白屏的问题。

还有对于直接使用将背景透明化的也不太合适,因为这样会使用户感觉点了app之后没有响应,这段时间也是和启动时是否耗时和手机性能有关,所以这样的处理并不优雅,也违背了google的设计。

知道原理之后其实就很简单:

  • 设置启动主题
<style name="LauncherTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/launcher_bg</item>
    <item name="android:windowFullscreen">true</item>
</style>
  • 配置LauncherActivity
<activity
    android:name=".LauncherActivity"
    android:theme="@style/LauncherTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • LauncherActivity布局背景也设置成launcher_bg
<RelativeLayout 
    ...
    android:background="@drawable/launcher_bg"
    >
</RelativeLayout>    

launcher_bg例如:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccent" />

    <item android:top="150dp">
        <bitmap
            android:gravity="top"
            android:src="@drawable/ic_launcher" />
    </item>
</layer-list>

这里有点讲究,设计最好启动页使用纯色的背景和简单的icon处理,这样方便代码设置颜色,避免直接使用一张很大的图,也影响性能。

  • LauncherActivity中启动MainActivity逻辑:
postDelayed(new Runnable() {
    @Override
    public void run() {
        startActivity(new Intent(LauncherActivity.this, MainActivity.class));
        LauncherActivity.this.finish();
    }
}, 2000);

例如这里的简单延时两秒启动过MainActivity。

代码优化

黑白屏结局之后,我们再来看看代码的优化,其实代码的优化,只需要知道在哪些点上去检测,然后尽量不要做耗时操作即可。

  • 优化的点:

    • Application的onCreate方法
    • 第一个启动的Activity的onCreate,onStart,onResume方法

对于这个优化,我们直接看有可能不那么直观,Android中也提供了分析工具,可以检测app启动时间,以onCreate方法为例:

@Override
public void onCreate() {
    super.onCreate();
    File file = new File(Environment.getExternalStorageState(), "app.trace");
    Debug.startMethodTracing(file.getAbsolutePath());
    //业务逻辑
    Debug.stopMethodTracing();
}

这里在app.trace文件中就保存下来了业务逻辑部分执行的时间,通过

adb pull /storage/emulated/0/app.trace

这个命令就能得到app.trace文件,然后放到Android Studio中就能看到,业务逻辑部分哪些方法执行了多少时间,我们就能针对优化了。

  • 优化的方式

    • 异步线程方式,前提:对异步要求不高
    • 懒加载的方式,用的时候再初始化

具体的方式还是需要根据具体业务处理。

UI渲染优化

代码优化部分处理完了之后,我们还有就是UI布局的优化,其中就涉及到过度绘制问题,因为gpu的绘制完全根据cpu的指令来的,所以只要我们UI布局有重复绘制的部分,gpu依然会重复绘制,而这部分就是可以优化的,这也是导致过度绘制的原因。

优化的点包括:

  • 布局的背景是否重复,或者是否合理(原则:尽量不在相同区域重复设置背景)
  • 是否可以减少UI布局的层级
  • 自定义View绘制是否包含覆盖
  • 使用merge标签排除相同ViewGroup容器
  • 使用ViewStub进行布局的懒加载,在需要显示的时候再使用inflater加载

相关文章

网友评论

    本文标题:App启动优化

    本文链接:https://www.haomeiwen.com/subject/hjjywhtx.html