本着针对面试,不负责任的态度,写下《面试总结》系列。本系列记录面试过程中各个知识点,而不是入门系列,如果有不懂的自行学习。
内存泄露
- 什么是内存泄露,为什么会引发
- Android垃圾回收机制
频繁GC
耗电问题
OOM问题
原因
- UI线程做轻微耗时操作,导致UI线程卡顿
- 布局layout过于复杂,无法在16ms内完成渲染
- 同一时间段内执行动画过多,导致cpu或gpu负载过重
- 复杂的布局,频繁触发measure,layout,导致整个view从新渲染
- 内存频繁gc
- 冗余资源及逻辑导致加载缓慢
- 工作线程设置位background,导致后台线程抢占UI线程,阻塞渲染操作
- 排查静态变量
手段
- gpu过渡重绘,开发者选项打开显示重绘区域,定位到过去,解布局
- 打开严格模式,解决主线程耗时的操作,读写文件等
- traceView,检查可能是ui线程操作的耗时问题,view的measure、layout是不是耗时过多
- leakcanary
- forloop/ondraw
- 优化gson的序列化、反序列化,使用流配合gson序列化、提高性能20%
- viewstub、merge
- 加载优化
a. 分步加载
b. 异步加载
c. 延时加载 - 刷新优化
a. 缩小刷新区域
b. 减少刷新次数 - 动画优化、硬件加速
- 耗电优化、batteryhistorian
性能优化最佳实践
1.布局优化
优化细节
- 如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色
- 如果每个自控件的颜色不太一样,而且可以完全覆盖父控件,那么就不需要再父控
件上加背景颜色 - 尽量减少不必要的嵌套
- 能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout控
件相对比较复杂,测绘也想要耗时。
优化细节
- 使用include和merge增加复用,减少层级
- ViewStub 按需加载,更加轻便
优化细节
- 复杂界面可选择ConstraintLayout,可有效减少层级
2.绘制优化
优化细节
- onDraw 中不要创建新的局部对象
- onDraw 方法中不要做耗时的任务
3.内存优化
基本可以分为以下四大类: 1、集合类 泄漏 2、单例/静态变量造成的内存泄漏 3、匿名内部类/非静态内部类 4、资源 未关闭造成的内存泄漏
优化细节
- 集合类泄漏
- 单例/静态变量造成的内存泄漏
- 匿名内部类/非静态内部类
- 资源未关闭造成的内存泄漏
优化细节
- 解决各个情况下的内存泄漏,注意平时代码的规范。
4.启动优化
官方给建议是: 1、利用提前展示出来的 Window,快速展示出来一个界 面,给用户快速反馈的体验; 2、避免在启动时做密集沉重的初始化(Heavy app initialization); 3、避免 I/O 操作、反序列化、网络操作、布局嵌套等。
- 利用提前展示出来的 Window,快速展示出来一个界面
- 避免在启动时做密集沉重的初始化
- 避免 I/O 操作、反序列化、网络操作、布局嵌套等。
优化细节
- 利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;
- 避免在启动时做密集沉重的初始化(Heavy app initialization);
- 避免I/O操作、反序列化、网络操作、布局嵌套等。
5.包体积优化
assets 文件夹 存放一些配置文件、资源文件,assets 不会自动生成对应的 ID, 而是通过 AssetManager 类的接口获取。
res目录 res 是 resource 的缩写,这个目录存放资源文件,会自动生成对应的 ID 并映射到 .R 文件中,访问直接使用资源 ID。
META-INF 保存应用的签名信息,签名信息可以验证 APK 文件的完整性。 AndroidManifest.xml 这个文件用来描述 Android 应用的配置信息,一些组件的
注册信息、可使用权限等。
classes.dex Dalvik 字节码程序,让 Dalvik 虚拟机可执行,一般情况下,Android 应 用在打包时通过 Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节 码。
resources.arsc 记录着资源文件和资源 ID 之间的映射关系,用来根据资源 ID 寻找资源。
- lint工具,减小无用资源,同时build文件中开启资源压缩
- xml,drawable单色图像
- 重用资源
- 压缩png、jpg等图像
- 使用webp
- 使用矢量图
- 代码混淆、proguard工具
- 插件化
优化细节
- 代码混淆
- 插件化
- 资源优化
6.耗电优化
优化细节
- 使用JobScheduler调度任务
- 使用懒惰法则(减小、退出、合并)
7.ListView 和 Bitmap 优化
- 图片质量压缩
- 图片尺寸压缩
- libjpeg.so压缩
优化细节
- ListView 使用 ViewHolder,分段,分页加载
- 压缩Bitmap
8.响应速度优化
9.线程优化
10.未优化
编写高效代码有两个基本规则: 1、不要做你不需要做的工作 2、如果可以避免,请不要分配内存
- 避免创建不必要的对象
- 首选静态
- 常量使用static final
- 使用增强for
- 避免使用浮点类型
网友评论