布局优化:
1、减少布局层级(ConstraintLayout, include, merge, ViewStub,
Space占位不绘制);
2、减少过度绘制(例如:不必要或重复的背景);
3、复杂的布局;
4、不必要的布局绘制(少用些功能强大的组合控件,如SuperTextView)
数据结构与算法:
ArrayList、LinkedList
<u>LinkedHashMap</u>、<u>HashMap</u>
SparseArray与ArrayMap
线程优化:
1、不要直接new线程,使用线程池、asyncTask、rxjava、kotlin协程
内存泄漏:
1、非静态内部类(包括匿名内部类)默认就会持有外部类的引用,例如Handler、Thread、AsyncTask(使用静态内部类+虚引用);
2、及时关闭或释放资源,bitmap、cursor、io/file流;
3、未取消注册或回调(eventbus\ BroadcastReceiver\disposable) ;
4、单例(如果单例对象要引用context,请使用全局的上下文对象)
5、静态变量(生命周期与应用同步)引用activity等生命周期较短的对象;
6、属性动画造成内存泄露,及时cancel,不然一直在后台播放,因为动画引用控件,控件引用activity;
7、WebView造成内存泄露
网络优化:
1、减少网络请求次数,服务器端适当做请求合并(api) 2、大量数据的加载采用分页的方式 3、网络数据传输采用GZIP压缩 4、合理使用缓存,减少不必要网络请求 5、上传图片时,在必要的时候压缩图片
6、提前或延时操作,避免扎堆
APK减包:
1、建议把cruncherEnabled设为false,然后通过tinypng手工压缩PNG图片
2、使用webp图片格式
3、混淆
4、尽量使用一套资源
5、在build.gradle文件中启用shrinkResources
6、最小化第三方库中资源的使用
7、纯色图片使用shape
8、减少native库的大小,使用armeabiV7架构下so包就可以了
9、对比选择最优库,不要引入多个类似功能的库
代码优化:
1、尽量使用局部变量
2、如果知道集合长度,尽量初始化时设置集合容量
3、字符串拼接不要使用“+”,而是使用StringBuilder
4、逻辑优化,理清程序逻辑,减少不必要的操作
工具使用:
1、Lint:检测未使用到资源,不规范的代码
2、第三方工具,LeakCanary、bugly