性能优化提纲:
1.响应快速
处理方向:布局优化;主线程去掉耗时操作;
2.程序稳定
处理方向:尽可能解决掉Crash和ANR;减少内存使用,处理内存泄漏问题;
3.安装包小
处理方向:去除重复代码;去除无用代码;去除无用资源;图片资源最大化压缩;使用代码混淆;
ANR发生的原因总结和解决办法
1.在主线程中,进行了触屏点击滑动等操作,在5秒之内对该事件没有响应,就会导致ANR(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕
3.service是20秒
根本原因是在主线程进行了耗时操作,比如:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.在主线程中调用thread的join()方法、sleep()方法、wait()方法
5.其他线程持有锁,导致主线程等待超时
6.子线程终止或崩溃导致主线程一直等待
解决的主要办法就是开启子线程去处理这些耗时操作。修改主线程去等待子线程的锁。
使用检查代码问题工具:
工具栏 -> Analyze -> Inspect Code,会对选择的范围进行代码、xml进行问题检查,扫描整个项目,分析以下潜在的问题,分类指出问题描述、问题位置,并提供合理的修改建议。检查结果如下:
然后分别展开,优先解决项目中的Error。
提示问题包括:
1)性能 布局性能(以前是 layoutopt工具,可以解决无用布局、嵌套太多、布局太多、overdraw) 其他性能
2)未使用到资源、资源缺少(不同资源的适配)
3)有更高性能的资源替换 ---- eg:SparseBooleanArray SparseIntArray
4)国际化问题(硬编码)
5)图标的问题(重复的图标,错误的大小)
6)可用性问题(如不指定的文本字段的输入型)
7)manifest文件的错误 -- 未注册activity service等等
8)内存泄露 --- 如:handle的不当使用 。
9)占内存的资源及时回收 --- 如:TypedArray未回收资源等
10.View类型错误
App瘦身的方式:
1、图片最大化压缩
2、使用Android Lint检查无用资源,并删除掉
3、在gradle中设置shrinkResource = true,去除无用资源
4、使用代码混淆,能使代码压缩70%
5、使用HTML5进行界面开发
怎么去除无用代码和资源?
1.去除无用资源:在gradle中设置shrinkResources true。
2.去除无用代码
使用Android自带工具Lint清理。
Ctrl+Shift+Alt+I 弹出一个框,输入UnusedResources,弹出下图。点击Remove all unused Resources可清楚所有无用资源。
加载大图怎么优化,防止OOM
对Bitmap进行压缩,即二次采样
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
性能优化秘诀:
性能对于App来说就像汽车的发动机一样,对产品质量起着决定性作用。以下是开发Android过程中对性能优化的总结:
少用static,生命周期太长
根据当前分辨率压缩bitmap,bitmap用完recycle,使用LRU cache缓存bitmap
注意context的使用,尽量用application代替activity的context
记住不用要资源关闭(BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap)
耗时操作、算法开启线程。
系统不足时主动释放资源
leaknanery泄露工具,检测内存泄露
不创建多的string对象而使用Stringbuffer
复杂算法尽量用C完成
减少不必要的全局变量
尽量避免static成员变量引用资源耗费过多的实例,比如Context。
Android提供了很健全的消息传递机制(Intent)和任务模型(Handler),可以通过传递或事件的方式,防止一些不必要的全局变量。
可使用Java四种强软弱虚引用方式减少内存消耗
避免使用枚举,会牺牲速度,尽量用常量代替
避免滥用Bitmap导致的内存浪费
时刻谨记避免创建不必要的对象,特别尽量少地在循环中创建对象。
尽量减少布局层级
加载大图片记得要裁图,减小图片尺寸,节省流量
内存是在不够的,可申请大内存 ,在
标签中,把largeHeap设置为true,提高最大内存上限
OutOfMemory内存溢出
Android系统为每个应用程序都设置了一个内存上限,超过之后就会报出OOM,导致程序崩溃。不断地内存泄漏就会导致内存溢出。
1)使用更加轻量的数据结构,考虑使用ArrayMap/SparseArray
2.减小Bitmap对象的内存占用,加载图片前,选择合适的尺寸加载,根据需要裁剪尺寸。
3.尽肯能减少对象的创建,循环里面尽可能少创建对象。
4.避免对象的内存泄露