Android 性能优化之启动速度优化,2021Android 最新大厂面试真题
· 1、在 Application 的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取 Callable 实现。
· 2、对于 sp 的初始化,因为 sp 的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
· 3、对于 MainActivity,由于在获取到第一帧前,需要对 contentView 进行测量布局绘制操作,尽量减少布局的层次,考虑 StubView 的延迟加载策略,当然在 onCreate、onStart、onResume 方法中避免做耗时操作。
遵循上面三种策略可明显提高 app 启动速度。
优化应用启动时的体验
对于应用的启动时间,只能是尽量的避免一些耗时的、非必要的操作在主线程中,这样相对可以缩减一部分启动的耗时,另外一方面在等待第一帧显示的时间里,可以加入一些配置以增加体验,比如加入 Activity 的 background,这个背景会在显示第一帧前提前显示在界面上。
1、先为主界面单独写一个主题 style,设置一张待显示的图片,这里我设置了一个颜色,然后在 manifest 中设置给 MainActivity:
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bule</item>
</style>
//...
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2、然后在 MainActivity 中加载布局前把 AppTheme 重新设置给 MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
这样在启动时会先显示 background,然后待界面绘制完成再显示主界面:
3.2Glide 及其他图片框架
Glide 是一个很好用的图片加载框架,除了常用的图片加载、缓存功能以外,Glide 支持对网络层进行定制,比如换成 OkHttp 来支持 HTTP 2.0。不过,如果在追求启动速度
《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
的情况下,在 Splash 页或主界面加载某一张图片时,往往是第一次使用 Glide,由于 Glide 没有初始化,会导致这次图片加载的时间比较长(不管本地还是网络),特别是在其他操作也在同时抢占 CPU 资源的时候,慢的特别明显!而后面再使用 Glide 加载图片时,还是比较快的
Glide 初始化耗时分析:Glide 的初始化会加载所有配置的 Module,然后初始化 RequestManager(包括网络层、工作线程等,比较耗时),最后还要应用一些解码的选项(Options)
解决方案:在 Application 的 onCreate 方法中,在工作线程调用一次 GlideApp.get(this)
override fun onCreate() { super.onCreate() // 使用 Anko 提供的异步工作协程,或者自行创建一个并发线程池
doAsync {
GlideApp.get(this) // 获取一个 Glide 对象,Glide 内部会进行初始化操作
}
}
3.3TraceView 的使用 - 数据采集与数据分析
TraceView 是什么,TraceView 是 Android 平台特有的数据采集和分析工具,主要用做热点分析,找出最需要优化的点。TraceView 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,通过 TraceView,可以得到两种数据。
· 单次执行最耗时的方法
· 执行次数最多的方法
要打开上面的面板,代码中一般有两种方式:
· 第一种方式:
首先选择跟踪范围,在想要根据的代码片段之间使用以下两句代码
Debug.startMethodTracing(“hello”);
Debug.stopMethodTracing();
生成的 traceview 文件会自动放在 SDCARD 上,没有 SDCARD 卡会出现异常,所以使用这种方式需要确保应用的 AndroidMainfest.xml 中的 SD 卡的读写权限是打开的,其中 hello 是 traceview 文件的名字,
然后用 adb 导出 traceview 文件。
adb pull sdcard/hello.trace C:\Users\lwf\Desktop
2. 然后启动 Android Device Monitor–>File–>openFile,打开 traceview 文件即可。
· 第二种方式:
1.同样是要先打开 Android Device Monitor
2.先选择应用进程,然后点击 Start Method Profiling(开启方法分析),按钮会变为 Stop Method Profiling(停止方法分析),开启方法分析后,对应用的目标页面进行测试操作,测试完毕后停止方法分析,界面会自动跳转到 DDMS 的 trace 分析界面。
两种方式的对比:第一种方式更精确到方法,起点和终点都是自己定,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。
关于应用启动加速,一般从以下几个方面来入手:
· 利用主题快速显示界面;
· 异步初始化组件;
· 梳理业务逻辑,延迟初始化组件、操作;
总结
其实要轻松掌握很简单,要点就两个:
找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
多练。 (视频优势是互动感强,容易集中注意力)
你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。
对于很多初中级 Android 工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题 PDF
还有?高级架构技术进阶脑图、Android 开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android 核心高级技术 PDF 文档,BAT 大厂面试真题解析】
这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试 Android 岗位的门槛,让更多的 Android 工程师理解 Android 系统,掌握 Android 系统。喜欢的话麻烦点击一个喜欢在关注一下~
评论