Android优化方向

本着针对面试,不负责任的态度,写下《面试总结》系列。本系列记录面试过程中各个知识点,而不是入门系列,如果有不懂的自行学习。

不负责任系列

内存泄露

  1. 什么是内存泄露,为什么会引发
  2. Android垃圾回收机制

频繁GC

耗电问题

OOM问题

原因

  1. UI线程做轻微耗时操作,导致UI线程卡顿
  2. 布局layout过于复杂,无法在16ms内完成渲染
  3. 同一时间段内执行动画过多,导致cpu或gpu负载过重
  4. 复杂的布局,频繁触发measure,layout,导致整个view从新渲染
  5. 内存频繁gc
  6. 冗余资源及逻辑导致加载缓慢
  7. 工作线程设置位background,导致后台线程抢占UI线程,阻塞渲染操作
  8. 排查静态变量

手段

  1. gpu过渡重绘,开发者选项打开显示重绘区域,定位到过去,解布局
  2. 打开严格模式,解决主线程耗时的操作,读写文件等
  3. traceView,检查可能是ui线程操作的耗时问题,view的measure、layout是不是耗时过多
  4. leakcanary
  5. forloop/ondraw
  6. 优化gson的序列化、反序列化,使用流配合gson序列化、提高性能20%
  7. viewstub、merge
  8. 加载优化
    a. 分步加载
    b. 异步加载
    c. 延时加载
  9. 刷新优化
    a. 缩小刷新区域
    b. 减少刷新次数
  10. 动画优化、硬件加速
  11. 耗电优化、batteryhistorian

性能优化最佳实践

1.布局优化
优化细节
  1. 如果父控件有颜色,也是自己需要的颜色,那么就不必在子控件加背景颜色
  2. 如果每个自控件的颜色不太一样,而且可以完全覆盖父控件,那么就不需要再父控
    件上加背景颜色
  3. 尽量减少不必要的嵌套
  4. 能用LinearLayout和FrameLayout,就不要用RelativeLayout,因为RelativeLayout控
    件相对比较复杂,测绘也想要耗时。
优化细节
  1. 使用include和merge增加复用,减少层级
  2. ViewStub 按需加载,更加轻便
优化细节
  1. 复杂界面可选择ConstraintLayout,可有效减少层级
2.绘制优化
优化细节
  1. onDraw 中不要创建新的局部对象
  2. onDraw 方法中不要做耗时的任务
3.内存优化

基本可以分为以下四大类: 1、集合类 泄漏 2、单例/静态变量造成的内存泄漏 3、匿名内部类/非静态内部类 4、资源 未关闭造成的内存泄漏

优化细节
  1. 集合类泄漏
  2. 单例/静态变量造成的内存泄漏
  3. 匿名内部类/非静态内部类
  4. 资源未关闭造成的内存泄漏
优化细节
  1. 解决各个情况下的内存泄漏,注意平时代码的规范。
4.启动优化

官方给建议是: 1、利用提前展示出来的 Window,快速展示出来一个界 面,给用户快速反馈的体验; 2、避免在启动时做密集沉重的初始化(Heavy app initialization); 3、避免 I/O 操作、反序列化、网络操作、布局嵌套等。

  1. 利用提前展示出来的 Window,快速展示出来一个界面
  2. 避免在启动时做密集沉重的初始化
  3. 避免 I/O 操作、反序列化、网络操作、布局嵌套等。
优化细节
  1. 利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;
  2. 避免在启动时做密集沉重的初始化(Heavy app initialization);
  3. 避免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 寻找资源。

  1. lint工具,减小无用资源,同时build文件中开启资源压缩
  2. xml,drawable单色图像
  3. 重用资源
  4. 压缩png、jpg等图像
  5. 使用webp
  6. 使用矢量图
  7. 代码混淆、proguard工具
  8. 插件化
优化细节
  1. 代码混淆
  2. 插件化
  3. 资源优化
6.耗电优化
优化细节
  1. 使用JobScheduler调度任务
  2. 使用懒惰法则(减小、退出、合并)
7.ListView 和 Bitmap 优化
  1. 图片质量压缩
  2. 图片尺寸压缩
  3. libjpeg.so压缩
优化细节
  1. ListView 使用 ViewHolder,分段,分页加载
  2. 压缩Bitmap
8.响应速度优化
9.线程优化
10.未优化

编写高效代码有两个基本规则: 1、不要做你不需要做的工作 2、如果可以避免,请不要分配内存

  1. 避免创建不必要的对象
  2. 首选静态
  3. 常量使用static final
  4. 使用增强for
  5. 避免使用浮点类型

你可能感兴趣的:(Android优化方向)