Android应用快速启动--谷歌官方指南<1>

官方链接

一个留得住用户的APP体验感一定要好,应用的启动越快,用户体验自然就好,用户体验差,等了半天都没出来,第一影响就不好,所以我们需要对应用启动以及黑白屏进行处理,快速启动,给用户一个好的体验。最近因为项目需要开始看这个问题,学习一下如何能尽快的启动应用。所以就找来了官方的文档看看,自己翻译和选择性总结了一下。所以本篇文章和官网不是完全相同。如果有哪里不对的,欢迎留言改正。虽然我很多次都希望自己是一个可以把英文一眼就看穿的人,但是能力还有限,所以可能哪里不对。大家多提出来。谢谢!!好吧废话这么多了。开始吧!

首先,应用启动分为三个状态:1.冷启动 2.热启动 3.温启动。其中冷启动是包括了启动APP,创建APP进程,显示startWindow界面的。而热启动和温启动是界面从不可见到可见的过程。我们着重于优化冷启动,当然热启动和温启动也可以优化。

对了,本片文章是Android应用快速启动的系列文章的第一篇,也是基础知识。接下来我会对本文中提到的一些知识,以及工具的使用总结跟大家分享。敬请期待吧. 写系列文章有利于对一个知识点的持续跟踪,对我是一种自律和督促。你也可以试试!看看我能不能坚持下去,如果我可以你也可以!鸡汤一波,加油!

冷启动

只有应用启动了,系统才会创建应用进程。冷启动发生在应用第一次启动或者被系统杀死之后启动的时候。

冷启动的过程:

  • 系统层面
  1. 加载app
  2. app加载成功之后,显示一个空白的启动窗口(就是我们平时启动应用看到的黑白屏)。
  3. 创建应用进程

系统加载完之后就轮到应用了。

  • 应用层面
  1. 创建APP对象
  2. 加载主线程
  3. 创建主Activity
  4. 加载View
  5. 布局
  6. 绘制视图

一旦App线程完成了绘制,系统就会用主Activity替换到空白的启动窗口。至此,用户可以开始交互了。

从官网上搞了一张图来说明一下启动过程。look

cold-launch.png

在创建APP和创建Activity时容易引发性能问题。

APP Creation

主要工作是创建APP对象,主线程以及主Activity

Activity Creation

1.初始化数据

  1. 调用构造函数
  2. 调用oncreate
    onCreate函数的工作多少和启动时间息息相关。 因为它加载布局,初始化activity运行的对象。

启动性能分析

  • 初始显示的时间

    logcat获取时间

    从Android4.4(API 19)开始,logcat会打印一条关于acitivty显示时间的信息--Displayed.这个时间包括了启动Activity到Layout显示的过程。包含了一下事件:

    1. 启动APP进程
    2. 初始化APP对象
    3. 创建初始化activity
    4. 加载view
    5. 首次绘制应用

打印的样子呢就长的跟这个差不多啦!

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

注意这个是系统打印的哦,所以不要再logcat里面通过应用包名来过滤,否则你看不到的呢。
** PS:
Logcat输出中的“显示”度量不一定会捕获所有资源加载和显示之前的时间量:它会遗漏布局文件中未引用的资源或应用程序作为对象初始化的一部分创建的资源。 它排除了这些资源,因为加载它们是一个内嵌的过程,并且不会阻止应用程序的初始显示。所以懒加载数据的时间是不会计算到这里面的。切记!!!!**

ADB 命令获取时间

adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN

abd管理界面或者串口输入如上命令,就可以获取到启动某个Activity花费的时间。
最简单的语句就是:

adb shell am start -S -W xxxActivity的完整路径 

-c,-a使用来指定category和action的可选项。

结果类似:

Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete

ThisTime:最后一个启动的Activity的启动耗时
TotalTime:自己的所有Activity的启动耗时
WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)

  • 总的显示时间 (Fulltime)
    通过调用reportFullyDrawn()方法可以获取到从应用启动到资源加载完成的全部时间。即包括了懒加载的时间,不过依然记住懒加载是不会影响应用启动的。

log如下:

system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms  

上面介绍了应用启动的基本知识,下面我们俩看看如何定位应用启动的元凶。

利用AndroidStudio的"Method Tracer tool" 和"Tracer结合Systracer Tool".关于Method Tracer tool的使用可以查看官方的文档MethodTracer.

一般用的比较多的是 Trace和Systrace,因为不一定可以正常使用"Method Tracer TOOL".

常见的问题

谷歌官方列举了经常会影响APP启动性能的常见问题。

Application初始化负载

Applcation oncreate 有很多耗时的操作。比如数据库访问,IO操作之类的。

所以不要在这些方法里面做耗时的操作,解决方案下面将讲解。

  • 问题解决

    对于数据的加载,如果不是里面需要的数据,可以改成懒加载方式。对于静态的对象,可以转换成单例对象,这样只会在第一次初始化该对象。官方建议可以使用Dagger来实现依赖注入。这样只会在第一次的时候注入.

Activity初始化负载

Activity创建的时候常常做了很多开销很大的工作。对于这种情况,有很多可以优化的地方。

  1. 加载大而复杂的布局
  2. 网络操作和磁盘操作堵塞布局绘制
  3. 解码加载bitmap
  4. 栅格化VectorDrawable对象
  5. 初始化activity的其他一些子对象
  • 问题解决

    通过tracer定位问题,然后解决。

    1. 如果你的布局过于复杂就会加大启动activity的时间,所以尽量优化你的布局
    • 除掉冗余和嵌套的布局,可以通过lint来检测代码,lint会对布局进行检测。
    • 不要加载在启动Activity时,不需要可见的布局,利用ViewStub,通过这个可以在适当的时间加载布局。
    1. 在主线程加载所有的资源也会拖慢加载的速度。
    • 在非主线程加载数据,懒加载。当然在不影响你的需求的情况下,把能异步加载的异步加载。
    • 先显示布局,对于图片等的加载可以延迟加载
    1. Activity oncreate,onResume,onstart耗时过多,如果还有上一个Activity,上一个Activity的onPaues也能有太多耗时因为这也会影响APP启动的性能。所以呢不要在这里没进行不必要的耗时操作。

不根治但是实用的解决办法

通过设置theme来避免黑白屏,类似于展示一个闪屏。等Activity加载好之后就会显示Activity。
具体做法:

  • 定义一个Drawable文件,然后在AndroidMainfest.xml文件里面将主题设置给对应的Actvity,最后在该Activity的oncreate方法的setContentView之前将主题设置回来。
    代码如下:
drawable示例:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
  <!-- The background color, preferably the same as your normal theme -->
  <item android:drawable="@android:color/white"/>
  <!-- Your product logo - 144dp color version of your app icon -->
  <item>
    <bitmap
      android:src="@drawable/product_logo_144dp"
      android:gravity="center"/>
  </item>
</layer-list>  

Mainfest file:
<activity ...
android:theme="@style/AppTheme.Launcher" />

Activity onCreate示例:

public class MyMainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.Theme_MyApp);
    super.onCreate(savedInstanceState);
    // ...
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,472评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 请保持淡定,分析代码,记住:性能很重要。 启动时间优化 毫无疑问,应用的启动速度越快越好。 本文可以帮助你优化应用...
    Mupceet阅读 11,367评论 5 19
  • 小Z朋友在电信行业上班,有天给我们讲了件奇葩的事。怎么奇葩呢,用户朋友通过第三方平台给用户交了几十元话费,这用户的...
    蜜甜水淡阅读 177评论 0 0
  • 我不知道那样疯狂放手一搏,效果到底会怎样……但我知道如果不那么做,将来自己一定会后悔。成功需要努力,也需要运气……...
    盆栽多肉Swag阅读 610评论 0 0