• ThisTime:是指调用过程中最后一个Activity启动时间到这个Activity的 startActivityAndWait调用结束;
  • TotalTime:是指调用过程中第一个Activity的启动时间到最后一个Activity的 startActivityAndWait结束。
  • WaitTime:是startActivityAndWait这个方法的调用耗时;

reportFullyDrawn

在某些特殊场景,我们可能不单单启动页的绘制完成回调时间就足够了,我们需要连启动页的闪屏广告接口数据成功回调之后才算一个完整的时间,这时我们可以使用reportFullyDrawn

public class WelcomeActivity extends MvpActivity implements WelcomeMvp.View {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
// 请求数据
mvpPresenter.config();

}
@Override
public void finishRequest() {
// 数据回调
reportFullyDrawn();
}
}

PS:这个方式minSdkVersion需要API19+,所以要对SDK版本进行设置或判断。

####Traceview

Traceview是Android设备的一个非常好用的性能分析工具,它可以通过详细的界面,让我们跟踪程序的性能,并且能清晰地查看到每一个函数的耗时和调用次数。

####Systrace

Systrace非常直观地展示每个线程上面的API的调用顺序和耗时情况。

Traceview和Systrace都是DDMS面板的工具,但是现在AS3.0以上的版本不再建议使用了,所以这里就不详述,如果有兴趣的同学,可以看我上一篇文章《Android应用优化之流畅度实操》,里面有详细地说明这两个工具的用法。

####hugo

github.com/JakeWharton…

我们可以利用JakeWharton的hugo,通过注解的方式获取对应的类或者函数所消耗的时间。我们可以利用它对启动页Activity的生命周期来抠细节。

##启动优化实操

####用户体验优化

在冷启动优化的主要体验个人认为就是消除启动时的白屏/黑屏,因为白屏/黑屏对于用户使用的第一印象就是慢、卡顿。我们可以设置启动页的主题来达到目的。

windowDrawsSystemBarBackgrounds是对部分有系统操作栏的设置。接着是这个窗口背景色的布局;

启动页的广告展示完跳转到首页,然后我们设置回我们的通用样式,可以在清单文件,也可以在代码中设置;

<activity
···
android:theme="@style/AppBaseFrameTheme"/>

通过对启动页的主题设置后,就会将白屏/黑屏抹去,用户点击App的图标就展示启动图,让用户先产生启动很快的“错觉”。同时这里可以通过动画,让启动页与首页之间的过渡更加自然。

##Application启动优化

从上图一的分析总结中,我对优化点Application的生命周期进行了加粗提示,接着我们回来对这部分进行优化实操。

Application#attachBaseContext()

Application启动会经过attachBaseContext()–>onCreate();这时大家从attachBaseContext的生命周期联想到什么?没错就是MultiDex分包机制。想必大家都会发现,自从我们方法数超出了65535处理了分包之后

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

,启动白屏/黑屏的问题就出现了,分包机制是导致冷启动缓慢的重要原因,而现在部分应用采用插件化的方式来避免MultiDex带来的白屏问题,这虽然是一种方法,但是开发成本实在高,对于不少应用来说是不必要的。我们来聊一下MultiDex优化,首先MultiDex可分成运行时和编译时两个部分:

  • 编译期:将App中的class以某种策略拆分在多个dex中,为了减少第一个dex也就主dex中包含的class数;
  • 运行期: App启动时,虚拟机只加载主dex中的class。app启动以后,使用Multidex.install,通过反射机制修改ClassLoader中的dexElements来加载其他dex;

从网上的多篇实践分析中,他们主要采用的是异步方式。因为App起始会先加载主dex包,那么我们可以自主去处理分包的工作,我们将启动页和首页需要的库、组件等主要class分在主dex中,从而达到精分主dex包的大小,具体的操作写法,大家可以参考网上MultiDex启动优化文章,但是大家要注意在主dex的分包过程中,主dex经过我们一系列的优化操作减少了主dex的大小,因此也增大了NoClassDefFoundError的异常的可能,此时会导致我们的应用启动失败的风险,所以在优化后我们一定做好测试工作。

Application#onCreate()

经过attachBaseContext()后就到onCreate()生命周期,想必我们大部分的应用,会在这里对我们使用到的第三方库和组件进行初始化工作。由于版本不断迭代,第三方库的初始化都是直接写在onCreate()中,大量的初始化工作导致该生命周期过于沉重,我们应该对这些第三方库进行分类。下面是我整理我司App启动的工作分类:

看着上图,各种第三方工具初始化和业务逻辑初始化,影响启动时间。我们先对它们拆分成四部分。

  • 必须在onCreate()且是主进程中初始化
  • 可以延迟,但是需要在Application中初始化
  • 可以延迟到启动页的生命周期回调中初始化
  • 延迟到用的时候再初始化

大家可以根据自身项目先列出自己项目的每一个初始化,然后进行分类。这里虽然我没有贴具体的操作代码,不是我认为new一个线程或者创建一个IntentService太简单了就不说了,而是这里需要注意的东西是整个冷启动优化最多的,因为自己也在这里踩过坑。 举一个GrowingIO的例子,当时项目用的是很旧版本的GIO,当时对GIO的初始化是放在子线程操作的,忽然发包前,运营部门提出升级GIO的SDK版本需求,升完之后编译运行觉得没什么事情就直接打包了,到线上之后运营反馈新版本没了圈选数据,经过检查发现新版本的GIO是不能在子线程初始化的。从这个教训中,我认为既然同学你都对冷启动优化感兴趣,所以一定不会差那几句复制粘贴的代码,这些都是要具体情况具体分析。我来总结一下重点

  • 启动慢,不是无脑开线程,然后塞代码就完事,需要对症下药;
  • 开线程也是一门学问,Thread、ThreadPoolExecutor、AsyncTask、IntentService,究竟选取哪个;
  • 假设你new好了Thread,但是有没考虑好内存泄漏问题,不要一边补坑一边挖坑;
  • 注意有些第三方SDK需要在主线程初始化的;
  • 如果是应用是多进程的,注意有些第三方SDK,需要你在跟同包名进程下进行初始化;
  • 其实有好多项目,经过多年的版本迭代都是没有整理过代码的,那些旧代码、无用代码都是需要归类整理的;

####启动页Activity的优化

  1. 布局优化 我们的启动页Activity包含有启动图控件、闪屏广告图控件、闪屏广告视频控件、首次安装介绍图控件。对于布局优化而言,除了启动图控件外,其他都不是App启动时都要初始化的控件,这时我们可以使用ViewStub。针对指定的业务场景,初始化指定的控件。
  2. 避免I/O操作 我们知道I/O操作不是实时的,例如数据库的读写、SharedPreferences#apply()。我们要注意这些操作有没阻塞主线程地执行,同时我们可以利用StrictMode严格模式,利用它可以检测我们在启动的时候有没正确进行磁盘读写操作。
  3. 注意图片bitmap的加载速度和编码格式 我们可以知道,启动页大部分的情况下都是图片的显示,那么我们在图片这方面怎么抠细节呢,那就是对各种第三方图片加载库的选用了Glide、Picasso、Fresco等,还有是PREFER_ARGB_8888、PREFER_RGB_565的选取问题,大家可以针对属于自己项目情况进行选取。
  4. 对矢量图VectorDrawable对象的使用 矢量图的核心是省时间、省空间。而对于某些用户,它的启动图可能不是一张图片,它十分简约,就一个logo,这个时候我们可以考虑一下矢量图的用法。
  5. 注意Activity中的启动生命周期的回调 我们在Application#onCreate()优化,将某些不是很必要的网络请求,搬到了欢迎页中,但是我们也不能直接将这个网络请求操作直接拷贝到启动页的onCreate()中,我们可以巧妙地利用Activity生命周期中的Activity#onWindowFocusChanged(boolean hasFocus) ,这个是所有控件初始化完的真正回调,我们可以将网络操作放在这里,当然我们还可以使用Service。

##冷启动优化总结

对于冷启动优化,需要我们一步步去分析,不像布局优化那般照搬套路,所以在官方文档中也多次出现bottleneck瓶颈这个词汇,说明了我们的冷启动优化之路不会一马平川,大家要善用Android Studio‘s CPU profiler(有机会我们详细分析一下该功能的使用),因为网上很多的总结是通过Traceview和Systrace,但是这两者在AS3.0版本的升级已经舍弃,侧面反映到我们要勤看官方文档,用自己的第一角度去思考Android的变化,而不是通过别人的翻译分析。最后大家互相勉励一下,在现在的Android市场竞争愈发激烈,如何在竞品对比中胜出,还需要我们一步步地把一个个的细节做好做完美。

本次分享就是这些了,觉得不错欢迎关注,后期持续分享Android技术干货和进阶资料等
看官方文档,用自己的第一角度去思考Android的变化,而不是通过别人的翻译分析。最后大家互相勉励一下,在现在的Android市场竞争愈发激烈,如何在竞品对比中胜出,还需要我们一步步地把一个个的细节做好做完美。

本次分享就是这些了,觉得不错欢迎关注,后期持续分享Android技术干货和进阶资料等

Android冷启动优化解析,997页字节跳动Android面试真题解析火爆全网相关推荐

  1. 997页字节跳动Java面试真题解析火爆全网,系列教学

    前言 最近刷到了一句耐人寻味的话,"解决雪崩问题的最好办法是不发生雪崩". 不论是在硅谷互联网公司里还是在国内的互联网平台上,曾多次遇到过海量规模的交易瞬间吞噬平台的悲惨故事. 核 ...

  2. Android刘海屏、水滴屏全面屏适配详解,997页字节跳动Android面试真题解析火爆全网

    适配方式 适配方式有两种: 将targetSdkVersion版本设置到API 24及以上: 这个操作将会为<application> 标签隐式添加一个属性,android:resizea ...

  3. 997页字节跳动Android面试真题解析火爆全网,分享两道阿里P7究极难度算法题

    开头 经常有网友在知乎问答提两个问题:"现在学习移动开发还有前景吗?""开发还有什么可以研究的?".网友回复:"现在还学移动开发,如同49年加入国军. ...

  4. android广告页白屏_年度整理!2056页《大厂安卓岗面试真题解析合集》火爆全网...

    前言 2020年还有最后一个月就结束了,时间一眨眼就过去了.今年面试有没有被面试官虐呢,明年跳槽想跳去哪个大厂呢,这是个问题.说实话,今年我面试也被虐了,为了明年能找到一份心怡的工作,特地的从朋友那里 ...

  5. android手机模拟器!手持4个大厂offer的我,面试真题解析

    前言 说起IT行业,大多数人脑海里反应出的第一个标签一定是"高薪",而说起程序员,大家更多想到的可能是: 秃顶.木讷.格子衫: 加班多.能赚钱.不花钱: 没对象-- 这难道就是传说 ...

  6. 史上最全Android面试真题+解析,全网阅读量7w+

    前言 对于程序员而言,无论是想加快个人技能成长速度,或是想要升职涨薪,都需要不断进阶,进入到规模与业务较大,并且有成熟的技术成长体系的公司当中去. 因此,跳槽逐渐成为了这个行业里一个常见的词汇. 而想 ...

  7. 安卓实例开发录音应用!Android架构组件Room功能详解,面试真题解析

    越来越多的人在提"移动端的下半场"."Android 开发的焦虑"之类的,也有人在喊"技术天天在变,学也学不完","昨天 Kotl ...

  8. 安卓手机游戏开发培训!万字长文轻松彻底入门Flutter,面试真题解析

    在GitHub找到大神整理的一份学习Android非常好的资料,分享给大家. 题库非常全面包括: Android基础知识: 基本涵盖Android所有知识体系,四大组件,Fragment,WebVie ...

  9. 温故而知新!这篇文章可以满足你80%日常工作!面试真题解析

    前言 程序员这个行业,日新月异,技术体系更新速度快,新技术新框架层出不穷,所有的技术都像是一个无底洞,当你学得越多就会发现不懂的越多,不懂的越多,需要学习的就更多. 因此,一旦选择了这个行业,就意味着 ...

最新文章

  1. String转XML
  2. Linux系统日志介绍分析
  3. 串口服务器接入232显示乱码,串口服务器出现乱码时如何处理,解决方案
  4. ubuntu18.04升级cmake
  5. 用DELPHI中Canvas特性开发图形软件
  6. HTML - 布局div
  7. Enterprise Library 5.0 中的Validators
  8. Httpx:针对HTTP的安全研究工具
  9. linux 搜狗输入法使用技巧,在Deepin 20系统中使用官方搜狗输入法的技巧
  10. 计算机术语一种单向密码体制,密码体制有哪五部分
  11. What kind of new area will CFun and creation form?
  12. 关于java中的魔幻数字47你知道么
  13. 用Elasticsearch构建电商搜索平台(有赞)
  14. vue视频播放插件vue-video-player
  15. 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性...
  16. Android 静音检测
  17. 程序开发中的细节一:重视空格的缺失(The JSP specification requires that an attribute name is preceded by whitespace)
  18. 融慧金科CEO王劲:为何人工智能远未触达风控的本质?...
  19. 关于touch事件的使用 (touchStart touchMove touchEnd(不触发 android 4.0以上)) 滑动的使用
  20. Android系统手机的ROOT的那些事儿~ 附主流手机的ROOT图文教程和工具下载

热门文章

  1. Win 10 自带的计划任务用法
  2. Cocos2d-x Touch事件处理
  3. 女生学ui还是python_UI设计适合女生学吗?
  4. java计算机毕业设计酒店管理系统源码+数据库+lw文档+系统
  5. 老年人学计算机方法,图解中老年人学电脑
  6. 基于51单片机的心率脉搏计测量报警全套设计
  7. ArcGIS小知识(十三)——出图精度:DPI和比例尺以及分辨率
  8. C++中的queue类、QT中的QQueue类
  9. 中文分词中的新词发现地点切分等问题
  10. 计算机毕设 SSM Vue的中药店商城系统(含源码+论文)