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 am start -W com.dongnao.luanchapk/com.dongnao.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

.

源码分析

http://www.jianshu.com/p/6037f6fda285

 

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

 

源码分析

 

 

 

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

 

 

 

方法执行时间最长

 

 

 

 

 

 

 

==========================================总结重点内容如下=================================================================

 

 

1、App启动时间 优化策略 

                  Application中的onCreate()不要做耗时的处理,如果需要 可以使用懒加载 或者 子线程方式进行加载(注意是否影响使用,handler ui 等不能这么干),或者延时处理;

                反编译QQ的apk  发现 它的onCreate()里面什么都没做。

                  加载首页面的布局第一帧显示之前  布局优化。

                   判断方法耗时 用Debug.startTraceMethod(file.getabsolutepath());

2、App启动黑白屏问题

                  windowIsTranslucent 设为 true  or  windowDisablePreview设为 true

                   windowBackaround  添加背景图 

            建议用第一种 

 

 

3、画面卡顿问题

        App画面布局过度绘制问题  

                设置 gpu绘制开关 帮助查看背景多层嵌套 重复渲染的问题  4个颜色显示 background;

                自定义控件ondraw cavans画布只画映入人眼直观的画面,重叠的不绘制。

4、adb shell am start -W io.dcloud.streamapp/io.dcloud.appstream.StreamAppListActivity --es appid H549AB395   Android系统源码framwork中 有个

frameworks\base\cmds\am\src\com\android\commands\am\Am.java  am.java文件 里面记录了一些adb命令,命令中加入-w  有totaltime waittime 可以观测activity的启动时间。

5、adb shell dumpsys activity activities

 

6、手机launcher桌面apk  启动我们应用的过程  在Launcher.java中有startActivity方法  ,后续的流程较为复杂,和系统zygote进程 分配系统空间等,优化只能在下图中的最右边进行。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值