Android性能优化,你要的,这都有

性能优化提纲:

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进行问题检查,扫描整个项目,分析以下潜在的问题,分类指出问题描述、问题位置,并提供合理的修改建议。检查结果如下:

image.png

然后分别展开,优先解决项目中的Error。


image.png

提示问题包括:

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可清楚所有无用资源。

image.png
加载大图怎么优化,防止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

  • 减少不必要的全局变量

  • 尽量避免static成员变量引用资源耗费过多的实例,比如Context。

  • Android提供了很健全的消息传递机制(Intent)和任务模型(Handler),可以通过传递或事件的方式,防止一些不必要的全局变量。

  • 可使用Java四种强软弱虚引用方式减少内存消耗

  • 避免使用枚举,会牺牲速度,尽量用常量代替

  • 避免滥用Bitmap导致的内存浪费

  • 时刻谨记避免创建不必要的对象,特别尽量少地在循环中创建对象。

  • 尽量减少布局层级

  • 加载大图片记得要裁图,减小图片尺寸,节省流量

  • 内存实在不够的,可申请大内存 ,在<application>标签中,把largeHeap设置为true,提高最大内存上限

OutOfMemory内存溢出

Android系统为每个应用程序都设置了一个内存上限,超过之后就会报出OOM,导致程序崩溃。不断地内存泄漏就会导致内存溢出。

1)使用更加轻量的数据结构,考虑使用ArrayMap/SparseArray
2.减小Bitmap对象的内存占用,加载图片前,选择合适的尺寸加载,根据需要裁剪尺寸。
3.尽肯能减少对象的创建,循环里面尽可能少创建对象。
4.避免对象的内存泄露

推荐阅读更多精彩内容