一、性能优化
1. 布局优化
- 尽量使用include,merge,ViewStub标签
- 避免冗余嵌套以及过于复杂的布局,必要时可使用约束布局
- View的隐藏尽量使用GONE替代INVISIBLE
- 使用权重weight后将View的宽width和高height设置为0,减少运算
- 存在复杂嵌套布局时考虑自定义View替代,减少measure和layout次数
- 减少不必要的背景设置,避免过度绘制
2. 列表优化
- 使用RecyclerView替代传统的ListView和GridView
- 复用getView中的相关View,避免重复获取实例导致卡顿
- 列表滑动过程中不进行UI绘制,图片加载
3. 包体积优化
- 资源图片采用Webp格式
- 较大的资源图片可以使用AS自带能力压缩,也可以借助tingPng压缩
- 不同颜色的多个相同图标,只添加一个纯色图片资源,实际使用时用tint着色
- 打包时加入混淆
- 远程库依赖时尽量有限compileOnly
4. 卡顿掉帧优化
- 字符串拼接尽量使用StringBuffer和StringBuilder代替String
- onCreate中减少不必要元素的初始化以及耗时操作,加快Activity启动速度
- 避免在View的draw,measure,layout执行耗时以及耗内存操作,尤其draw方法中
- 严格遵守ANR规避原则,避免在UI线程中做耗时操作,譬如多次数据库操作,HTTP请求等
- 必要的耗时操作放到子线程执行,执行结束后抛到主线程更新UI,子线程使用线程池管理,减少线程创建,内存消耗
二、安全编码
- 敏感信息不可直接输出日志,如果必要,也需匿名化后输出
- 方法入参的对象使用前需要判空校验
- 数组、列表等集合操作时需要做好越界校验
- io流操作需要try catch,io流和数据库等操作后需要手动close
- 广播和监听等观察者需要反注册
- 开源组件需要扫描是否存在公开披露的漏洞
- 项目中引入的so库中的C代码需要扫描是否存在不安全函数
- 检查项目中是否存在dos攻击,比如sql注入等等
三、入库校验
- 可能为空的对象,使用前判空
- 无用代码,注释掉的代码需删除
- 未初始化的变量被使用
- 非静态内部类
- 超大类文件,代码行数阈值
- 超大资源文件,图片大小阈值
- 跨组件引用impl
- 类型强转前校验
- 方法和注释是否匹配
- 子类是否正确重写父类抽象方法和接口中的方法
网友评论