性能优化<第二篇>:APP启动优化

2021-04-06  本文已影响0人  NoBugException
1、冷启动和热启动
(1)定义
     冷启动:在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用;
     热启动:在启动应用时,系统中已有该应用的进程;

(2)最直接的理解方式
     可以在自定义Application的onCreate方法打印一个日志,启动app,如果打印,就说明是冷启动,如果没有打印,就是热启动。
    
(3)Recent理解

打开模拟器

image.png

下面第三个按钮为Recent键,点击Recent,如果后台没有进程,那么显示为:

image.png

此时打开app就是冷启动。

反之,存在历史进程,如图:

image.png

此时,打开app,就是热启动。

(4)冷、热启动的本质区别

    冷启动:创建进程 --> 启动进程,并初始化 --> 创建JVM虚拟机 --> 初始化通信相关的Service --> 打开Application并将app信息加载到内存 --> 启动Windows窗口 --> 打开Activity并初始化
    热启动:打开Activity并初始化

    所以,本质上,冷启动的准备工作要比热启动多,所以,如果启动的Activity没有耗时操作的话,热启动几乎可以秒开;
2、冷启动优化
冷启动会导致app打开速度慢,相应的注意点如下:

1、不要在Application中做耗时操作;
2、启动时,子线程不要创建太多;
3、第一启动的Activity中不要做耗时操作;
3、黑白屏问题
1、检查自定义Application是否存在耗时操作,如果存在,需要将耗时操作移到Activity;

    假设,自定义Application中存在5秒耗时操作,显示器会停留在Window窗口5秒钟,5秒之后才开始显示Activity。

    Window的颜色由Android SDK决定或则由系统决定;
    一般情况,但不绝对:
        Android 8.0之前(不包括8.0):显示5秒黑屏
        Android 8.0之后(包括8.0)  :显示5秒白屏

2、黑白屏插入广告

    黑白屏和主题息息相关,在Application中设置主题,如下:

    <application
        ...
        android:theme="@style/AppTheme">

    主题的具体代码:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ....
        ....
        ....
    </style>

    直接看最终父主题,找到windowBackground属性:

    <style name="Theme.Light">
        ....
        <item name="windowBackground">@drawable/screen_background_selector_light</item>
        ....
    </style>

    查看颜色值:

    <drawable name="screen_background_light">#ffffffff</drawable>

    当然,有些父主题不一定能找到windowBackground,这时window的颜色完全有系统决定,不由SDK决定;
    有些时候,使用SDK主题,SDK主题存在对不同版本的系统做了适配,如图:
image.png
    所以,window窗口的主题可能是SDK决定,也有可能是系统决定。

    不管是由SDK决定还是系统决定,目前window窗口的颜色只有两种:黑屏和白屏

    一般而言,Android 8.0之前(不包括8.0)是黑屏,Android 8.0之后(包括8.0)是白屏,但这也不是绝对的。

    与其让Android SDK或者系统来控制window背景色,还不如让app自己来决定,代码如下:

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        ...
        <item name="android:windowBackground">@color/white</item>
    </style>

    以上代码将window的背景的设置为白色,虽然依然存在白屏问题,但总比黑屏要香。

    windowBackground 属性还可以配置一张图片,比如广告,将window的背景设置为广告,这种做法的优缺点如下:
    优点:
        (1)可以打广告
    缺点:
        (1)浪费内存,将图片设置为背景是非常消耗内存的,这张图片会永久占用内存;
        (2)无法适配,各种各样大小的屏幕大小导致图片容易变形,并且不支持沉浸式;

    总之,利用window的间隙打广告是不可取的,如果非要打广告,可以在欢迎页面上做。


3、将window背景设置为透明,解决黑白屏问题

    <!--将window背景设置为透明,但直接设置透明颜色不会生效,会导致显示黑屏-->
    <style name="AppTheme_Launcher1" parent="AppTheme">
        <item name="android:windowBackground">@color/translucent</item>
    </style>

    如果使用上述代码,将windowBackground设置为透明的颜色值,那么不仅不会生效,还会显示成黑屏。

    <!--等待Activity创建完成直接启动Activity-->
    <style name="AppTheme_Launcher2" parent="AppTheme">
        <item name="android:windowIsTranslucent">true</item>
    </style>

    将windowIsTranslucent属性设置为true,等待Activity创建完成直接启动Activity,冷启动打开app时,会发现时间稍微有点长;

    将window的背景设置为null,可以节省一些内存的开销,代码如下:

    <!--等待Activity创建完成直接启动Activity,将window背景设置为null-->
    <style name="AppTheme_Launcher3" parent="AppTheme">
        <item name="android:windowBackground">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

    这种方式会等待Application和Activity初始化完成才会启动Activity,等待的时间特别长,体验特别不好;

    最后一种方式是,关闭window预览,Application初始化完成,就可以启动Activity,从体验上比前者好:

    <!--关闭window的预览,并将window背景设置为null-->
    <style name="AppTheme_Launcher4" parent="AppTheme">
        <item name="android:windowBackground">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>


    最后,总结下黑白配问题相关知识点:
    (1)Application初始化耗时会导致黑白屏;
    (2)将windowIsTranslucent设置为true,需要等待Application和Activity初始化完成才会启动Activity;
    (3)将windowDisablePreview设置为true,关闭window预览之后,需要等待Application初始化完成,不需要等待Activity初始化完成;
    (4)如果Activity中的主线程存在耗时操作,并且Activity的根布局是透明的,这种情况容易导致黑白屏问题;

[完...]

上一篇 下一篇

猜你喜欢

热点阅读