Android-性能优化系列二-App启动优化

32次阅读

共计 2481 个字符,预计需要花费 7 分钟才能阅读完成。

前言

本篇文章主要针对 Android 性能优化 中 App 的启动优化

App 启动, 相信大家都是非常熟悉了, 那为何我们需要对 App 启动做优化呢, 这里就要先对我们 Android 从开机到启动我们的 App 进入主页面这一流程做一个简单的阐述了.

一、Android 启动流程

我们先来看一张流程图

首先呢, 我们 Android 手机开机时是先加载一个 Boot 程序, 有点类似 Windows 开机时的开机引导程序, 然后通过 Boot 程序加载 Lux 内核, 随后是调用 Native 的 init() 方法做一些初始化加载操作 ( 加载一些系统需要的驱动程序), 然后就进入我们的 java Framework 层, 也就是创建我们的 java 虚拟机, 然后通过 java 虚拟机创建我们的系统程序, 最后才是调用我们 App 的 application 启动我们的 App.

流程如下:

Loader > Kernel > Native > Framework > Application

Android 启动流程大致就是这样, 我们不需要去深入, 只需要大概知道是这么个流程就行了.

所以说, 其实我们手机的操作系统就是一个 App, 开机启动时先加载各种驱动程序 (类似 App 初始化各种第三方 SDK), 然后加载系统标识(黑白屏问题),然后启动开机欢迎动画 (App 欢迎页动画), 最后进入到桌面 (App 主页面).

二、App 启动时黑白屏问题

基于以上的启动流程,那么 App 启动优化的第一步就是从系统标识入手,我们手机开机时一般最先出现的是手机厂商的 logo 标识,而 App 启动时会先调用一个预显示窗口,这个窗口的样式一般是黑色或者白色,所以也就出现了 App 启动时出现短暂的黑白屏问题,

流程如下:

Application > onCreate > MainActivity > onCreate > windows > setContentView> layout

在我们点击桌面 App 启动图标时,系统首先会给我们 App 分配一个进程,然后在调用我们的 application 入口,最后调用我们的 mainActivity 的 setContentView 方法加载布局文件,最后我们就能看到我们的主界面了。

然后在 application 到 MainActivity 之间,还会有一个预显示窗口,就是出现的黑白屏。

那我们怎么优化去除这个惹人厌的黑白屏呢?

我们先看一下这个黑白屏从哪蹦出来的。

看到了吧,最初我们可没有设置这么个东西,这是系统默认给我们 App 设置的,而且是白色的。

知道源头了,那就开始处理吧

1. 可以将背景设置为透明

  <item name="android:windowBackground">@null</item>

So easy , 就是这么简单, 你在运行下 App, 果然黑白屏没有了,But 是不是有哪不对劲了.
对的, 被你发现了, 虽然黑白屏没了, 但是我们的 App 似乎是变迟钝了

你在仔细观察一下, 点击 App 启动图标后,App 似乎是顿了一下, 然后加载了我们的欢迎页面, 有点像 ANR, 只不过很短暂 , 但是用户还是能够发现的, 所以用户体验只是比起黑白屏好了那么一点点而已.

那就, 继续优化呗

2. 给背景设置一张图片或者 xml 布局文件

 <item name="android:windowBackground">@layout/activity_main</item>
    
   或者

  <item name="android:windowBackground">@drawable/splash_bg</item>

So easy, 又是这么简单. 对的, 就是这么简单, 这也是目前最认同的方案, 稍微有点规模的公司都是采用这种方案来优化的.

But, 这里需要注意的是, 放一张图片的话, 需要注意图片的大小, 如果有虚拟导航键的话可能会出线底部闪烁问题, 解决办法就是压缩图片大小, 将图片转化成.9.png 格式, 让其自适应拉伸.

三、onCreate() 优化

一般我们都会重写自己的 Application, 然后在 onCreate() 方法内做一些初始化操作,
一般都是一些第三方 SDK 配置.

public class App extends Application {

    @Override
    public void onCreate() {super.onCreate();
        
        //...... 初始化第三方 SDK
        
        
    }
}

在这里我们可以将一些较大的第三方库放在异步线程中进行初始化


 @Override
    public void onCreate() {super.onCreate();

        // 懒加载
        new Thread(){
            @Override
            public void run() {super.run();
                // 初始化数据库
                // 初始化数据库 网络等操作
                //...... 初始化第三方 SDK
            }
        }.start();}

需要注意的是, 如果涉及到 UI 操作的话, 就不要放在异步线程中去执行, 否则可能出 Null
那我们怎么判断哪些初始化能够放在异步线程中呢, 这个就需要你自己去分辨了, 实在不知道就直接丢异步里, 报错了就再丢出来就行了.

不止是 Application 中, 我们的 activity 也可以用这种方式来进行优化.

以上这种优化也称为真优化, 对代码层的优化我们叫做真优化, 而不对代码层直接操作的我们称为伪优化, 一般我们的优化方案都是两种混合使用.

四、伪优化

在我们做完上述的优化后, 成功进入到主界面后, 还没完.

你可能会发现进入主界面也会出现部分显示加载问题, 具体就需要看你布局层级的复杂度和界面业务的需求了. 如果是复杂页面, 可以先看看布局文件层级是否还可以进行优化, 然后在看是否时请求网络数据太大, 例如加载了大图等. 这时就可以进去一定的伪优化了.

例如和产品协商在进入页面时加载一个 dialog 进行缓冲一下, 很多 App 也是进去这样的优化,

看看我们的简书 App 就是这样, 我基本每次进去都会弹一个 dialog

至此,App 启动优化方案就介绍完了. 当然还有更多优化方案, 具体的就要根据业务需求而定了

欢迎关注作者 darryrzhong, 更多干货等你来拿哟.

请赏个小红心!因为你的鼓励是我写作的最大动力!

更多精彩文章请关注

  • 个人博客:darryrzhong
  • 掘金
  • 简书
  • SegmentFault
  • 慕课网手记

正文完
 0