一、前言
随着项目不断的快速迭代,往往会造成App启动卡慢现象,因为可能在App主进程启动阶段或者在主界面启动阶段放了很多初始化其他业务的逻辑,而这些业务落地可能一开始并不需要用到。
一个应用App的启动速度能够影响用户的首次体验, App启动卡慢会影响一个App的卸载率和使用率。启动速度快会给人一种轻快的感觉,减少用户等待时间。 启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。![](https://img.haomeiwen.com/i28055132/40e20fdfbac4239c.jpeg)
二、启动优化方式
应用程序启动有主要分为三种状态,每种状态都会影响应用程序对用户可见所需的时间:冷启动,热启动、温启动。
- 冷启动:app没有启动过或者进程被杀死,系统不存在该app进程,此时启动为冷启动。冷启动流程就是app启动流程全过程,包括创建app进程、加载资源、启动MainThread、初始化SplashActivity并加载布局等。
- 热启动:app暂时退到了后台,热启动将它从后台重新带到前台,展示给客户。
- 温启动:用户点击了back键退出app,又重新启动,不过Application仍在内存中存在,对应的进程并没有被杀掉,不包含Application创建过程。热启动时间指在Application仍然存在的情况下,从用户点击桌面图标,到首页内容全部展示出来。
注:冷启动、热启动、温启动这些状态并不是官方的定义,而是我们基于用户的角度考虑的定义,有的将热启动和温启动统称为热启动。
三、启动优化
1、冷启动
![](https://img.haomeiwen.com/i28055132/831b81f0198e3487.png)
1.冷启动流程
冷启动指的是应用程序从进程在系统不存在,到系统创建应用运行进程空间的过程。冷启动通常会发生在一下两种情况:
- 设备启动以来首次启动应用程序
- 系统杀死应用程序之后再次启动应用程序
在冷启动的最开始,系统需要负责做三件事:
- 加载以及启动app
- app启动之后立刻显示一个空白的预览窗口
- 创建app进程
一旦系统完成创建app进程后,app进程将要接着负责完成下面的工作:
- 创建Application对象
- 创建并且启动主线程ActivityThread3)
- 创建启动第一个Activity
- Inflating views
- 布局屏幕
- 执行第一次绘制
一旦app进程完完成了第一次绘制工作,系统进程就会用main activity替换前面显示的预览窗口,这个时候,用户就可以正式开始与app进行交互了。
从冷启动的流程看,我们无法干预app进程创建等系统操作,我们能够干预的有:
- 预览窗口
- Application生命周期回调
- Activity生命周期回调
2.冷启动优化
![](https://img.haomeiwen.com/i28055132/41ccf884ab20493a.gif)
1、白屏问题 :
android studio升级 2.0之后 加上Instant Run,Instant Run为了能够让我们快速部署代码,背后其实是有一套非常复杂的逻辑的,比如要在APK中建立服务器与Android Studio进行通信,以及代码差异比对和替换等,在研发过程中可能出现白屏问题,
一般release版的程序是不会出现这种现象的;
如果接下来还会出现白屏问题,可以查看style文件
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>
加入了两个属性,windowIsTranslucent和windowNoTitle,将这两个属性都设置成true,就可以让程序在初始化的时候窗口是透明的,初始化结束后程序主界面才会显示出来,从而也就完全看不到白屏界面了
2、启动时间的优化
先测量activity的启动时间-------Activity的reportFullyDrawn()方法
你就需要调用Activity的reportFullyDrawn()。它将在log里报告从apk初始化(和前面Displayed的时间是一样的)到reportFullyDrawn() 方法被调用用了多长时间。
reportFullyDrawn()方法显示的log也是类似这样:
ActivityManager: Displayed com.Android.myexample/.StartupTiming: +768ms
在4.4上调用reportFullyDrawn()方法会崩溃(但是log还是能正常打印),提示需要UPDATE_DEVICE_STATS权限 ,但是这个权限只有系统app才能授权。解决的办法是这样调
try{
reportFullyDrawn();
}catch(SecurityException e){
}
还有一种测量启动时间的方法也值得一提,那就是screenrecord命令
首先启动带—bugreport选项(它可以在frames 中添加时间戳-应该是L中的特性)的screenrecord 命令:
$ adb shell screenrecord --bugreport /sdcard/launch.mp4
然后点击app的图标,等待app显示,ctrl-C screenrecord, 使用adb pull命令把文件导出到电脑。
$ adb pull /sdcard/launch.mp4
现在你可以打开录制视频看看发生了什么。你需要一个能逐帧查看的视频播放器(mac上的Quicktime 就可以,不清楚其它os上什么播放器这个功能最好使)。现在逐帧播放,注意视频的上方有一个frame 时间戳。
一直往前直到你发现app图标高亮了为止。这个时候系统已经处理了图标上的点击事件,开始启动app了,记录下这一帧的时间。继续播放帧直到你看到了app整个UI的第一帧为止。根据不同情况(是否有启动窗口,是否有启动画面等等),
事件和窗口发生的实际顺序可能会有不同。对于一个简单的app来说,你会首先见到启动窗口,然后渐变出app真实的UI。在你看到UI上的任何内容之后,你应该记录下第一帧,这时app完成了布局和绘制,准备开始显示出来了。同时也记录下这一帧所发生的时间。
现在把这两个时间相减 ((UI displayed) - (icon tapped)); 得到app从点击到绘制就绪的所有时间。虽然这个时间包含了进程启动之前的时间,但是至少它可以用于跟其他app比较。
2、Android冷启动时间优化
冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局
2、冷启动时间优化
知道了Android冷启动时间的原理之后,就可以通过一些小技巧来对冷启动时间进行优化,从而让你app加载变得”快“一些(视觉体验上的快)。我们可制作一个启动Activity的背景样式的.9图片,然后把这个.9图片做为windowBackground。
图片制作好之后,我们就可以用它做为app冷启动阶段的预览元素,如下设置:
①为启动的Activity自定义一个Theme
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item>
</style>
②将新的Theme应用到设置到AndroidManifest.xml
中
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
③由于给MainActivity设置了一个新的Theme,这样做会覆盖原来的Theme,所以在MainActivity中需要设置回原来的Theme
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Make sure this line comes before calling super.onCreate().
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
}
}
2、热启动与冷启动区别
冷启动:冷启动其实就是电脑启动的一种方式,当电脑切断电源,在关机状态下按下POWER启动计算机。
热启动:在计算机已经开启的状态下,通过菜单,任务管理器,快捷键或键盘重新引导操作。
在APP中:
- 当用户启动应用程序时,后台没有该应用程序的进程,这时系统会重新给应用程序分配一个进程,这种方法就叫冷启动。
- 当用户启动应用程序时,后台已经有了该程序的进程(通过,退出,home键退出让应用程序在后台继续执行)当再次点开APP马上能够恢复到上次使用的状态,不需要再回到手机的首页打开应用程序,这个方式就叫热启动。
共同点:
无论是冷启动还是热启动,都要重新上电,检测硬件,将RAM区清零,即所有变量都初始化为0。
3、其他优化方案
-
从启动流程分析
减少两处onCreate()中的初始化操作,将部分初始化移动到IntentService中进行
-
从用户体验分析
将app首页的按返回键响应修改为响应Home键。让用户以为app确实退出了,但是实际上是点了Home键。如此一来,下次点击app图标的时候,直接唤起,不需要进行初始化操作,主要可以避免再次走闪屏页。
-
首界面加载
利用Google官方文档推荐的方式,我们将启动页界面的主题设置为SplashTheme。此界面是冷启动后首先加载的界面
四、性能优化进阶
性能的优化是一个老生常谈的点,也是一个比较重要的点。 作为一个 Android 程序员,性能优化是无法避开的事情,并且性能优化也是 Android 中最有挑战的工作之一,更是每个工程师都需要掌握的核心技能。
那我们需要学习那些性能优化,才能成为性能优化高手呢?如下示例:
-
布局优化
-
网络优化
-
安装包优化
-
内存优化
-
卡顿优化
-
启动优化
……
随着 Android 开发越来越规范,以及用户对产品的要求也越来越高。项目的质量要求到了近乎苛刻的地步,内存优化、UI 卡顿优化、App 崩溃监控等性能调优也逐渐成了必备的技能。然而,还是有很多小伙伴在入门性能优化或者说学习性能优化上总是缺乏系统地、方法级别的指引,导致自己缺乏思路!
博主在这整理收集的关于Android性能优化的知识脑图总结和学习手册文档!在这套《Android性能调优实战宝典》中,汇总了 android 性能优化的经典案例,结合大量代码示例,尽力为你还原真实的业务场景。
分为8个模块,共 40+W字,将从理论分析、工具支持、案例与面试等方面,以及实战四大方面展开系统讲解:
第一章:Android性能优化概述
![](https://img.haomeiwen.com/i28055132/6dd1ba300f422cfc.png)
第二章:卡顿优化
![](https://img.haomeiwen.com/i28055132/e86f8af986a3e69f.png)
第三章:启动速度优化
![](https://img.haomeiwen.com/i28055132/8af9c90e7eafd914.png)
第四章:内存优化
![](https://img.haomeiwen.com/i28055132/d0dc6b707da4ae91.png)
第五章:UI优化
![](https://img.haomeiwen.com/i28055132/729aca4aa29bdd72.png)
第六章:线程优化
![](https://img.haomeiwen.com/i28055132/a5aa633aba38d2fb.png)
第七章:电量优化
![](https://img.haomeiwen.com/i28055132/ff805db918a63d0c.png)
第八章:稳定性优化
![](https://img.haomeiwen.com/i28055132/b6e2a6d962ec8581.png)
Android性能优化进阶》》》获~
五、文末
Android应用性能优化是每个客户端开发人员都需要重视的问题。在Android硬件设备性能不那么好的时候,软件的性能优化是很迫切的事情。但是随着硬件设备的不断升级强大,应用性能优化在大部分项目中很少受到重视。
网友评论