app启动原理详解

当用户点击桌面icon的时候,系统准备好了,给App分配进程空间,就好像去酒店开房,但是你又不能直接进入房间,你得坐电梯去房间,那么你坐电梯的这个时间,实际上就是系统的准备时间,那么系统的这个准备时间一般来说不会太长,
但假如的开的是一个情趣套房呢,系统就得花不少时间来打理,所以系统给所有用户都准备了一个过渡界面,这个界面,就是启动时的黑屏白屏,也就是你坐电梯里面看的小广告,这个广告里面有星星 有月亮,你就到房间门口了,但是这不能在门口解决,还要开门,对吧。开门之后
你想干嘛都可以了,这个想干嘛的速度。就完全取决于你开门的速度了,你门开得快,自然那啥快,所以这里是开发者可以优化的地方,有些开发者掏个钥匙要好几秒,有的只要几百毫秒,完全影响了后面那啥的效率。
App 启动时间是什么 ,从哪里开始 (我们要知道启动时间是怎么算出来的)
https://segmentfault.com/a/1190000007406875#articleHeader20

启动定义
当手指点击app图标 到加载第一个页面为止

trace文件分析
http://www.ituring.com.cn/article/273967

启动类型
http://www.jianshu.com/p/c967653a9468

工欲善其事,必先利其器。想要优化 App 的启动速度,必须有准确衡量启动时间的方法,否则优化完之后效果怎样,自己都不知道,说出去别人也不信服不是。在做 App 启动时间统计之前,当然必须弄明白有哪些启动类型,每种启动类型的特点。
通常来说,在安卓中应用的启动方式分为以下几种:

1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化 Application 类,再创建和初始化 MainActivity 类,最后显示在界面上。

2.热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走 Application 这步了,而是直接走 MainActivity,所以热启动的过程不必创建和初始化 Application,因为一个应用从新进程的创建到进程的销毁,Application 只会初始化一次。

3 首次启动:首次启动严格来说也是冷启动,之所以把首次启动单独列出来,一般来说,首次启动时间会比非首次启动要久,首次启动会做一些系统初始化工作,如缓存目录的生产,数据库的建立,SharedPreference的初始化,如果存在多 dex 和插件的情况下,首次启动会有一些特殊需要处理的逻辑,而且对启动速度有很大的影响,所以首次启动的速度非常重要,毕竟影响用户对 App 的第一映像。

时间定义

这个信息在activity 窗口完成所有的启动事件之后,第一次绘制的时候输出。这个时间包括了从启动进程到第一次布局与绘制的所有时间。这基本上是你需要知道的主要时间。它不包含用户点击app图标然后系统开始准备启动activity的时间,因为作为一个开发者你无法影响这个时间,所以没有必要去测量它。

在log日志中 查看叫 Displayed 日志 过滤一定要是 NoFilters

am 命令代码在源码中的位置
frameworks\base\cmds\am\src\com\android\commands\am\Am.java

http://www.jianshu.com/p/1d2e55f1d393

adb shell am start -W com.demo.luanchapk/com.demo.luanchapk.MainActivity

adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity

adb shell dumpsys activity activities
4.4以后的手机会查看得到
http://blog.csdn.net/u013278099/article/details/50052557

此法获取的启动时间非常精准,可精确到毫秒。
● ThisTime: 最后一个启动的Activity的启动耗时
● TotalTime: 自己的所有Activity的启动耗时
● WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)

D:\Android\android-6.0.0_r1\frameworks\base\core\java\android\app\ActivityThread.java
D:\Android\android-6.0.0_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java

D:\Android\android-6.0.0_r1\frameworks\base\core\java\android\app\Instrumentation.java

java -jar apktool d
冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局

第一种等待

第二种

冷启动时间优化

知道了Android冷启动时间的原理之后,就可以通过一些小技巧来对冷启动时间进行优化,从而让你app加载变得”快“一些(视觉体验上的快)。我们可制作一个启动Activity的背景样式的.9图片

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1223/3796.html
Application是程序的主入口,特别是很多第三方SDK都会需要在Application的onCreate里面做很多初始化操作,不得不说,各种第三方SDK,都特别喜欢这个『兵家必争之地』,再加上自己的一些库的初始化,会让整个Application不堪重负。
优化的方法,无非是通过以下几个方面:
● 延迟初始化
● 后台任务
● 界面预加载
减少应用启动时的耗时

1、在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
2、对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
3、对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。

白屏产生原因

http://blog.csdn.net/fancylovejava/article/details/39643449
.

手机启动.png

在Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来

app启动源码分析

http://www.jianshu.com/p/6037f6fda285
frameworks/base/core/java/android/app/Instrumentation.java

经过分析之后,app的启动优化主要集中在三个地方
1.application.onCreate();
2.MainActivity.onCreate();
3.第一帧画面的xml文件中

监测代码中哪些方法耗时比较长的方式

File file = new File(Environment.getExternalStorageDirectory(),"filename");
log.i(TAG,"onCreate"+file.getAbsolutePath());
Debug.startMethodThracing(file.getAbsolutePath());
....
....
Debug.stopMethodTracing();

//然后到处trace文件  导入androidstudio中 ,查看哪些方法最耗时,然后进行优化
//找到最耗时的方法
  • 利用异步线程进行优化
    1.单例对象
    2.没有创建handle
    3.没有操作UI
    4.异步要求不是很高,单例没有在主线程调用,如果调用要进行融错判断。

  • 利用懒加载
    在使用之前进行判断是否已经加载,如果没有加载 ,进行加载,将它写成单例类

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

推荐阅读更多精彩内容

  • 看着娃熟睡的脸庞,想到她前两天刚过完两周岁的生日,不由觉得时间的流逝让人不可察觉,恍惚才是刚出生没几天的小娃娃,只...
    萧潇_xiaoxiao阅读 196评论 0 0
  • 对几岁学钢琴上专业和业余的从教者一直有个既定印象:4岁以上再开始。然而钢琴真的只能四岁以后学吗? 当然不...
    琢磨林阅读 361评论 0 0
  • 森林里住着一群小动物,他们靠狩猎为生,也许在别人眼中属于未进化的野蛮物种,但是森林里人人如此,所以他们自身并未有此...
    耐水余阅读 338评论 0 0
  • 选择你 连未来都幻想过 可我知道世事难料 但如果不是你 还不如一人过
    哀慕熙荣阅读 161评论 0 1