简介
异常处理
ANR
原因
方案
OOM
原因
优化
其他优化
线程优化
Service使用优化
应用瘦身
总结

简介

常见的异常无非就是ANR和OOM,掌握如何避免这两种异常有助于提升应用性能。另外,应用瘦身虽然不是性能的优化,而是app的优化,所以也放到这篇文章一起分享。

异常处理

ANR
原因
简述一下哪些地方是主线程:

1.Activity的所有生命周期回调
2.Service默认执行在主线程
3.BroadCastReceiver的onReceiver回调
4.没有使用子线程的looper的handler的handlerMessage(),post(Runnable)方法
5.AsyncTask的回调,除了donInBackground方法,其他都是在主线程

ANR就是程序无响应异常(Application Not Responding)

在主线程中做了耗时操作,容易出现ANR

             一般的主线程对输入事件处理超过5S主线程在执行BroadCastReceiver的onReceiver()方法时,超过10S主线程在执行Service的各个生命周期函数时超过20S未处理完毕

1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.service忙导致超时无响应
8.其他线程持有锁,导致主线程等待超时
9.其它线程终止或崩溃导致主线程一直等待。

方案

1.避免在主线程执行耗时操作,所有耗时操作应新开一个子线程完成,然后再在主线程更新UI。
2.UI线程尽量只做跟UI相关的工作
3.耗时的工作(比如数据库操作,I/O,网络操作),采用单独的工作线程处理
4.使用Thread 或handlerThread时,可提高线程优先级,加快执行时间
5.使用AsyncTask 处理短时的操作,由于AsyncTask 是串行执行的,高频的操作会造成阻塞。如果操作很频繁的任务或耗时较长的任务交给HandlerThread,支持手动管理操作流。如果高度并行且量级较大的任务,可以交给ThreadPoolExecutor,可有自动的管理线程的创建销毁,根据任务负载平衡,调整线程优先级。

OOM

原因
OOM全称为“Out of memory”,即内存溢出异常.

1.内存溢出
当前占用的内存+申请的内存 > Dalvik虚拟机的最大内存限制
2.内存抖动
对象频繁的创建和回收,区别于内存溢出。
3.内存泄漏
内存由于各种原因未释放,无法被GC回收,导致的资源浪费。积累的多了会造成OOM

优化
1.【选择合适的图片尺寸进行加载】,需要缩略图时不加载大图,ListView在滑动时不进行加载
2.【及时释放Bitmap内存】Bitmap是通过BitmapFactory创建,并且具体是通JNI实现的,所以有一部分内存的在Java会自动被GC,但是在C里面的内存,只能通过调用recycle()来释放。
3.【图片压缩】加载图片之前先用inSampleSize(缩放比例)属性,计算出一个合适的缩放比例,避免不必要的大图加载。
4.【inBitmap属性】inBitmaps属性会提高安卓系统对Bitmap分配与释放的执行效率。通过这个属性Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap不会先申请内存,而是尝试使用上一张bitmap占用的内存区域。(及时有很多图片,也只会占用屏幕能展示的一张图片的内存大小)
5.【捕获异常】系统在读取Bitmap的时候内存容易出现OOM异常,所以在实例化bitmap的时候要捕获异常处理。
6.【ListView复用ConvertView,LRU缓存】ListView中大量重复的条目,要对ConvertView复用。如果加载图片,可以使用LRU机制缓存图片(最近最少使用)
7.【避免在onDraw()创建对象】如果在onDraw()频繁创建对象会导致内存突然上升,频繁GC,内存抖动,严重了会OOM
8.【慎重使用多进程】使用多进程会使得代码逻辑更加复杂,如果使用不当,它可能会导致显著增加内存。

其他优化

线程优化

尽量使用线程池,避免在程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了现场的创建和销毁所带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而导致阻塞现象发生。

Service使用优化

1.查看service是否存活以及降低优先级:
假如一个service工作完成,但是来不及关掉或者kill掉,用户又看不见,所以这个service将会一直在后台运行,势必耗电。所以我们可以降低某些不常用service进程的优先级,在系统内存吃紧的情况下, 进程优先级低的service容易被系统kill掉。除此之外,可以利用监听系统广播来判断service状态是否存活,死亡即可手动kill掉。

2.用IntentService代替Service开发:
普通服务一旦启动之后,就会一直处于运行状态,必须调用stopService()或者stopSelf()方法才能让服务停止下来。为了简单的创建一个异步的、会自动挺值得服务,Android专门提供了一个IntentService类。IntentService在运行完毕后自动停止,减少耗电量。

应用瘦身

1.只是用一套资源,例如只使用720P的一套资源
2.在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小
3.在gradle使用shrinkResources去除无用资源,并配合Android Studio自带的 “Remove Unused Resources”小插件。
4.使用svg矢量图替代png图标,占用资源更少
5.删除无用的语言包,在gradle中配置 resConfigs “zh”
6.使用图片压缩网站压缩png Tinypng的官方网站:http://tinypng.com/
7…so库文件能删除不必要的就尽量少保留.so库文件
8.使用7zip压缩打包工具,建议开启7zip,注意白名单的配置,否则会导致有些资源找不到
9.清理三方库和冗余代码
10.支持插件化,酌情选择

总结

至此内存优化也讲了大概,要了解更多的可以
点击链接加入我们,https://jq.qq.com/?_wv=1027&k=LPGXcvsc
我是柯南,有问题欢迎随时问我。

安卓性能优化(3)异常处理应用瘦身相关推荐

  1. Android 性能优化 (一)APK高效瘦身

    Android 性能优化 (一)APK高效瘦身 http://blog.csdn.net/whb20081815/article/details/70140063 Android 性能优化 (二)数据 ...

  2. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  3. Android性能优化(5):APK瘦身优化

    文章目录 1. APK文件结构 2. APK瘦身优化 2.1 优化dex文件大小 2.1.1 Proguard 2.1.2 AndResGuard 2.2 优化资源文件大小 2.2.1 Android ...

  4. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn

    vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332  收藏 展开 vue性 ...

  5. 安卓性能优化之启动优化

    安卓性能优化之启动优化 两个定律 2-5-8原则 八秒定律 启动方式 冷启动 热启动 温启动 启动耗时统计 系统日志 adb命令 启动耗时分析 CPU Profile 工具介绍 使用方式 数据分析 C ...

  6. 安卓app启动速度优化,Android-APP-终极瘦身指南

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装:虽然说APK瘦身对于Android对应用可分配内存的限制影响不大,但是还是有一些影响的. 最近几周 ...

  7. Android优化系列之apk瘦身

    概述 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好 ...

  8. 安卓性能优化(响应优化)

    姊妹篇:性能优化(内存优化) 安卓app响应速度或使用流畅度是衡量性能的一个指标.如果一个应用用户启动应用时缓慢.使用时卡顿.甚至出现ANR那是很糟糕的体验. 通常,当应用无法响应用户输入时,系统即会 ...

  9. 安卓性能优化——提高编码性能的技巧

    引用了大量API文档的内容,没有对超链接进行删改,有需要的朋友可以直接点超链接访问API文档. 上一篇关于主要内存的性能优化,这一篇主要关于编码. Performance tips This docu ...

最新文章

  1. 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
  2. python中非怎么表示_Python中非英语文本的标记化
  3. Linux 搭建SVN 服务器
  4. P4887 第十四分块(前体) 莫队
  5. 布道微服务_09如何实现一个注册中心
  6. 12省联考2019口胡
  7. python数据科学指南是什么_《Python数据科学指南》——导读
  8. iscsi:IO操作流程(四)
  9. 【酷熊科技】工作积累 ----------- 内存优化之GC.MarkDependencies
  10. 通过web的方式动态查看tomcat的catalina.out的日志(web.py)
  11. mysql C where语句_MYSQL WHERE语句优化
  12. 见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频
  13. 经纬度坐标和投影坐标的转换
  14. 什么是DNS污染?DNS污染怎么办怎么解决?
  15. linux mono安装,Linux下Nginx + mono安装与配置
  16. 咖啡技能培训 | 成为咖啡师需要注意哪些方面?
  17. apache服务器(修改主页文件、两个不同ip访问不同站点、统一ip不同端口访问不同站点)
  18. 实验一:inode耗尽导致磁盘故障
  19. OOA/OOD/OOP(了解)
  20. 关于Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification 论文理解

热门文章

  1. contes 打开端口
  2. Win10 搭建truffle框架
  3. pdf如何添加水印?
  4. 离线语音唤醒 SnowBoy +树莓派语音交互实现语音机器人
  5. 十六届全向组算法开源(二)
  6. 场景检测:面片、光影和物理属性
  7. 证监会计算机职位难考吗,2021年国家公务员考试笔试证监会计算机岗命题趋势分析...
  8. 【算法千题案例】每日一练LeetCode打卡——105.仅仅反转字母
  9. Python抓取知乎几千张小MM图片是什么体验
  10. 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和