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

前言

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

App启动,相信你们都是很是熟悉了,那为什么咱们须要对App启动作优化呢,这里就要先对咱们Android 从开机到启动咱们的App进入主页面这一流程作一个简单的阐述了.android

1、Android启动流程

咱们先来看一张流程图数据库

Android启动流程.png

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

流程以下:windows

Loader > Kernel > Native > Framework > Application

Android启动流程大体就是这样,咱们不须要去深刻,只须要大概知道是这么个流程就好了.性能优化

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

2、App启动时黑白屏问题

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

流程以下:异步

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

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

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

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

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

AppTheme.png

image.png

image.png

看到了吧,最初咱们可没有设置这么个东西,这是系统默认给咱们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格式,让其自适应拉伸.

3、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也能够用这种方式来进行优化.

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

4、伪优化

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

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

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

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

image.png

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

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

请赏个小红心!由于你的鼓励是我写做的最大动力!

更多精彩文章请关注
相关文章
相关标签/搜索