为了账号安全,请及时绑定邮箱和手机立即绑定

app启用那些事

标签:
Android
各种看帖子各种总结,好的文章我写了地址,可以去看看,作者写的
启动一个app  就好比找个妹子开房
世界上有两种
 有的直接强上,没有氛围,气氛弄得比较尴尬。随着这个妹子是准备好跟你开房的
 
有的呢  给妹子看星星,看月亮。然后一起愉快的开房。

这个去开房的路上,就可以看做我们要启动一个app。
有的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 的第一映像。


frameworks\base\cmds\am\src\com\android\commands\am\Am.java

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



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

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

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
.
源码分析
http://www.jianshu.com/p/6037f6fda285

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

源码分析



frameworks/base/core/java/android/app/Instrumentation.java



方法执行时间最长

原文链接:http://www.apkbus.com/blog-340477-76764.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消