Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 启动优化说明、黑白屏处理

Android 启动优化说明、黑白屏处理

作者头像
晨曦_LLW
发布于 2022-03-11 00:59:02
发布于 2022-03-11 00:59:02
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

Android 启动优化说明、黑白屏处理

前言

正文

  在Android App使用过程中,对于应用的优化是一个加分项,举个例子,打开你的App需要2秒,人家0.5秒,这就是很大的用户体验上的优化。当然了目前我没见过有启动的这么快的App,因为什么呢?因为App在启动的时候做的事情太多了,这是对于那些商业的App来说,自己的App可以这么高,提升使用,首先我们来想一下启动优化。

一、启动来历

  这个启动优化最开始并不是用在App上的,是在网页上的,在零几年的时候,那时候的电脑还是那种大而笨重的电脑。

就比如这种电脑,我小时候在网吧…不,在学校的电脑房讲过,一周就上一节课,电脑还啥也没有,字也不怎么会打,说起来还是挺怀念的,最开始打开网页的时候有一个8秒定律,就是说如果你的网页打开的时间超过了8秒,用户流失会达到70%,因此,优化是很有必要的,这是对于网页来说,那么对于App来说是多长时间呢?

  现在都是移动互联网时代了,很多人可以不用电脑,但是不能不用手机。那么在手机上安装的App,常规的应用打开的时间是分为几个档次的,时间:2s、2 ~ 5s、 5 ~ 8s、8s+。

二、启动说明

  启动对于安装来说,有两种,一种就是Android系统的启动,一种就是App应用的启动。

  Android系统启动就是手机启动,整个过程就是手机开机到进入手机桌面,里面的流程是这样的:

  1. 上电(开机)
  2. BootLoader (系统引导芯片唤起)
  3. Linux Kernel (init.rc)
  4. Init进程 (ID为1)
  5. Zygote进程
  6. ART,SystemServer等系统服务
  7. Binder(线程池)SSM(系统消息)、AMS(启动App)、PMS(包管理)等各种系统服务
  8. Launcher(手机系统桌面)

  下面就是App的启动,这也是文章中主要说明的。App的启动就分为三个:

  1. 冷启动
  2. 热启动
  3. 温启动

也许你对这几个说法会比较陌生,这里简单介绍一下:

1. 冷启动

  比如你开机之后第一次点击这个应用在手机桌面上的图标,打开这个App应用,或者说是你的App进程被杀死有一段时间之后,你又打开这个App,这是比较简单的说法。再简洁一点就是 首次启动,后台无应用进程

2. 热启动

  用户退出当前应用但是进程未被杀死(销毁)。就比如我现在在使用某一个App,然后我收到了一个微信消息,我点击消息去微信了,然后这个App从前台进入后台。但是应用依然在后台运行,进程未被杀死。此时你再进入这个App就叫作热启动。

3. 温启动

  温启动就介于冷启动和热启动之间,说一个不太恰当的例子,中国古代刑场杀头,按照电视剧的手法,在刀斧手举刀要杀还没杀的时候,来一句刀下留人,那么这个人就又活过来了。换到应用中来就是,我结束应用的进程之后,马上又打开这个应用。此时它的进程会在内存中进行销毁,但是销毁是需要时间的,不是说销毁就销毁的。此时你又启动App,那么它的操作环节要比冷启动少,多热启动要多,折中的操作就是温启动。就好像你冷水兑热水,水会变温一样的道理。

三个启动简单说明了一下,实际上的热启动和温启动都会走冷启动的部分流程,因此我们优化冷启动就可以了。

4. 冷启动流程

  1. 用户点击桌面上的App图标,Launcer进程采用Binder IPC(Inter-Process Communication,进程间通信)方式向system_server发送startActivity请求。
  2. system_server进程接收到请求后,向Zygote进程发送创建App进程的请求。
  3. Zygote进程fork出新的子进程,即App进程。
  4. App进程通过Binder IPC方式向system_server发送attachApplication请求。
  5. system_server接收到相关请求后,做出一系列的准备工作,通过Binder IPC向App进程发送scheduleLaunchActivity的请求。
  6. App进程的binder线程(即ActivityThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息。
  7. 主线程在收到message后,通过反射的方式创建相关的Activity,并回调Activity的onCreate等方法。
  8. 至此,App便正式启动,开始进入Activity的生命周期,执行完onCreate/onStart/onResume,渲染完UI界面后便可以看到App的主界面。

5. 优化时间

  从上面的几点我们知道了启动优化的类型,内容,过程,那么我们优化的是什么?就是时间,在文章开头就提到了四个档次的时间,优化时间,就是缩短你的应用冷启动的时间,也通俗一点就是,从你点击桌面图标,到进入App的主页面需要多久。这个时间越快越好。

  那么首先我们应该获取启动时间,怎么去获取呢?通过CPU Profile,这个东西在哪里呢?

点击Edit Configurations…,在弹出的窗口中选择Profiling。

如上图所示这样设置一下,点击OK。这里我是创建了一个新项目,修改了一下MainActivity中的代码。

然后启动虚拟器。如果你想在运行的时候知道项目的方法执行花费了多少时间,可以点击下图中的这个类似仪表盘的图标。

点击之后同样会运行你的App,只不过在运行过程中会采集方法的使用时间。如下图所示:

此时右边的波形图,你观察是否稳定下来了,稳定后可以停止。

停止之后切换Top Down

刚才的方法是在onCreate中调用的,那么我们搜索一下,然后一直找下去。

找到了,这里我们发现abc()方法花费了300,054微秒,也就是300毫秒,这里我们就可以看到这个方法的耗时,知道哪个方法耗时就可以去针对方法做优化,同样你会看到onCreate,还会执行setContentView(),这里是加载xml去渲染页面,然后再是父类的onCreate()。

6. 优化方案

  针对于App的开发使用,有以下几个优化方案:

  1. 减少xml布局的嵌套,避免过度绘制,这里就不得不提到约束布局(PS:这个我本身也用的少)
  2. 尽量少在onCreate()方法中写初始化代码,可以在onWindowFocusChanged()中进行初始化。
  3. 懒加载,延迟加载,通俗一点就是避免在主线程中执行耗时操作,比如访问网络、数据读写、数据库操作等。
  4. 黑白屏,提升视觉效果,然后感觉很快的样子。

三、黑白屏处理

  在默认Android的App启动时会有一个预览页,这个预览页在Android低版本中是黑色的,高版本中是白色的,俗称黑白屏,比如这样,

你会看到有短暂的屏幕一片空白的情况。那么我们再来看看网易云音乐的启动。

可以看到没有白屏,实际上是利用了这个白屏的预览页,我们其实也可以仿照这个网易云的启动,怎么做呢。

1. 创建启动页

  首先我们创建一个启动页,新建SplashActivity,对应的布局是activity_splash.xml,在这个xml里面我们只放一个TextView控件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashActivity">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="网易云音乐"
        android:textColor="@color/white"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.96" />
androidx.constraintlayout.widget.ConstraintLayout>

然后随便搞一个白色的音乐图标,可以去我源码里面拿。

2. 样式

  因为是仿这个网易云的启动页,那么就需要一个红色的色值,在colors.xml中增加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<color name="red">#CE281Bcolor>

然后在themes.xml中增加一个主题样式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <style name="SplashTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        "colorPrimary">@color/red
        "colorPrimaryVariant">@color/red
        "statusBarBackground">@color/red
        "android:statusBarColor">@color/red
        "android:windowBackground">@drawable/splash_bg
    style>

然后在drawable下创建一个splash_bg.xml,里面的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <style name="SplashTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        "colorPrimary">@color/red
        "colorPrimaryVariant">@color/red
        "statusBarBackground">@color/red
        "android:statusBarColor">@color/red
        "android:windowBackground">@drawable/splash_bg
    style>

最后在AndroidManifest.xml中

设置SplashActivity中设置主题,然后设置启动页面。

下面运行一下:

看到这个效果如何,你会发现我没有动画效果,但是效果是这个文字后面显示出来的。为什么呢,还是要归结到这个预览页,这个预览页先出来,然后再是SplashActivity,所以文字后面显示,然后我们可以延时500毫秒再跳转到MainActivity中。

3. 运行效果

四、源码

GitHub地址:WhoCare CSDN地址:WhoCare.rar

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
App启动方式分三种:冷启动(cold start)、热启动(hot start)、温启动(warm start)
233333
2024/06/28
4390
Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
  Android应用冷启动时,又会短暂的黑屏或者白屏,然后才会进入主页面,黑屏是在Android版本低的时候才会出现,比如Android4.4、5.0。而现在的Android版本出现的就是白屏。这个虽然不应用功能的使用,但是对用户来说体验感并不好。那么怎么解决这个问题呢?我相信很多的博客都有这个方面的讲解,但是真正有良好体验的比较少,下面的这种也是参考了网易云音乐的启动方式。
晨曦_LLW
2020/10/26
1.1K0
Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
Android面试题之App的启动流程和启动速度优化
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
AntDream
2024/06/24
1620
Android面试题之App的启动流程和启动速度优化
你的 APP 为何启动那么慢?
可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化。在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的。因此本文重点谈论的是对冷启动相关的优化。
刘盼
2019/05/08
2K0
你的 APP 为何启动那么慢?
深入探讨Android启动优化策略
在当今激烈竞争的移动应用市场,应用的启动速度直接影响着用户的第一印象和满意度。作为主流的移动操作系统之一,Android的启动优化是开发者必须关注的关键领域。本文将详细介绍一些强大有效的Android启动优化策略,帮助你优化应用的启动过程,为用户创造更出色的体验。
Rouse
2023/08/31
3500
深入探讨Android启动优化策略
启动优化
启动优化、布局优化、内存优化、卡顿优化、网络优化、数据库优化、内存泄漏优化、包体积优化等等。
码上积木
2020/12/25
9740
优化App冷启动,实现启动页错觉秒开
APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这可能会让用户会以为没有点到APP而再次点击,极大的降低了用户体验,Android需要及时做出反馈去避免这段时间的尴尬。于是系统会根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。这个黑(白)屏就称为Preview Window,即预览窗口。
木溪bo
2018/12/27
2K0
❤️Android 性能优化之启动优化❤️
用户希望应用能够快速打开。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。轻则鄙视你,重则直接卸载你的应用。
Android 帅次
2021/11/12
9870
❤️Android 性能优化之启动优化❤️
启动优化
Dex文件用的到的类和安装包APK里面各种资源文件一般都比较小,但是读取非常频繁。
ruochen
2021/11/21
3.7K0
冷启动与热启动,AsyncTask,HandlerThread,IntentService,Service 保活,IntentService
app冷启动: 当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这个启动方式就叫做冷启动(后台不存在该应用进程)。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。
zhangjiqun
2024/12/16
1290
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
  在上一篇文章中完成了对记事本的功能增强,本篇文章中就着重来说一下UI方面的内容。先看看本篇文章的效果图
晨曦_LLW
2022/03/15
1.2K0
Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)
Android 性能分析学习(启动速度优化)
启动速度是用户体验app的第一感官,所以如果APP卡顿的话,给用户的体验会非常的糟糕。 本文主要针对这点进行的分析学习以及记录。
艳龙
2021/12/16
9360
Android 性能分析学习(启动速度优化)
深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了
启动是指用户从点击 icon 到看到页面首帧的整个过程,启动优化的目标就是减少这一过程的耗时。启动性能是 APP 使用体验的门面,启动过程耗时较长很可能导致用户使用 APP 的兴趣骤减。提高启动速度是每一个 APP 在体验优化方向上必须要做的关键技术突破。
Rouse
2024/05/09
2.1K0
深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了
解决 APP启动白屏黑屏问题
闪屏页,我们手机上的每个 APP 几乎都有自己的闪屏页,就是在真正进入程序前,会有一个页面停顿几秒钟。其实我们完全可以充分利用好这几秒钟做很多的程序初始化了启动。
开发者
2019/12/26
3K0
Android 的应用冷优化
用户进程已经创建,如果响应了低内存事件,例如在 onTrimMemory 中清除资源,则需要重新初始化
用户9253515
2022/01/20
3680
你必须要掌握的Android冷启动优化
事件发生在发包上线的前两天,在某某云进行移动测试时,提示冷启动速度低于平均值的问题,之前自己也曾尝试过优化,但是发现效果并不是很明显,作为一个有追求的开发者,趁着有点空闲时间,要好好研究一下冷启动优化问题。
用户1269200
2018/12/07
1.8K0
浅谈App的启动优化
由于冷启动相对于其他启动方式多了进程的创建(Zygote进程fork创建进程)以及应用的资源加载和初始化(Application的创建及初始化),所以相对来说会比较耗时,所以我们一般说的App启动优化一般指的都是App的冷启动优化。
xuexiangjys
2023/03/09
1K0
浅谈App的启动优化
Android启动页黑屏及最优解决方案
相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。那么这个黑屏或者白屏到底是怎么一回事呢?它的最好的解决方案应该是怎样的呢?今天我们认真的讨论一下这个小问题。
用户1269200
2018/08/14
1.8K0
Android启动页黑屏及最优解决方案
android系统开机画面_Android开机画面
Android Splash Screen is the first screen visible to the user when the application’s launched. Splash screen is one of the most vital screens in the application since it’s the user’s first experience with the application.
全栈程序员站长
2022/08/27
1.1K0
Android性能优化系列之App启动优化
应用的启动速度缓慢是我们在开发过程中经常会遇到的问题,比如启动缓慢导致的黑屏,白屏问题,本篇博客就将介绍App启动优化的相关知识。
老马的编程之旅
2022/06/22
7460
Android性能优化系列之App启动优化
相关推荐
Android性能优化(一)—— 启动优化,冷启动,热启动,温启动
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验