作为一名开发者,在开发移动应用过程中我也遇到过很多问题,尤其是一些应用性能问题,例如:ANR(程序无响应)、NullPointerException(空指针异常)、RunningTimeException(运行时异常)、ArrayIndexOutOfBoundsException(数组索引越界异常)、IllegalArgumentException(非法参数)、NumberFormatException(数字格式异常)等等。今天借着这篇文章来说一下性能优化分析的相关知识点!
一、一些开发中常见的性能问题
简单来说一说在日常开发中可能会遇到的问题和解决方法,如下:
① ANR
ANR(全称:Application Not Responding)程序无响应,要解决问题首先要知道问题出现有哪些可能性,然后在结合你当前应用的实际情况去排查,最终找到解决方法。这是我的思路,那么造成ANR的原因有哪些呢?
可能性一:主线程阻塞,在主线程中进行耗时操作过多(数据库读写、文件读写、网络请求、大数据计算等)。
可能性二:内存泄漏,列如App的启动页是一个高清的图片,在有的手机上可以正常运行,有的手机机会闪退。
可能性三:过度绘制,这个说法就是上面两种可能的相结合,首先你在主线程中绘制UI,其次绘制的图比较大或者重复绘制都会有ANR可能。
解决方法:第一个可能性,主线程阻塞,由于执行了大量的耗时操作造成的,那么这个时候就要使用子线程去进行耗时操作的处理。例如网络请求、数据库读写、文件读写都应该开一个子线程去执行,而不应该在主线程中处理,对于Activity来说UI线程就是主线程,UI线程要负责页面UI的绘制,这里又会引发另一个问题,那就是当你的view由主线程绘制时,在子线程中进行改变时会报错,所以子线程可不可以刷新view呢?是可以的,只不过有一个前提,那就是你的子线程创建了这个view,此时这个子线程就是这个view的UI线程。
第二个可能性,而对于内存泄漏来说,常规情况下是资源处理不当造成的。就是资源合理使用,不用就要回收。
从这个图能看出什么内容呢?
第三个可能性,首先这是一个运行时异常,其次和图片的绘制有关系,那么这么一结合就是过度绘制的问题。经过排查最终定位到是图片的问题,最终的解决办法就是针对于高清图的文件修改到大分辨率文件夹下,这属于一个比较低级的错误,我之前放置的都是常规的文件夹,吃一堑长一智。
② NullPointerException
NullPointerException(空指针异常),我相信用Java写Android的朋友肯定遇到过找个问题,那就是null,常说的空对象。这个问题一般来说在开发的时候做得好可以避免90%的出现概率。最大的出现情况就是赋值的时候,只要出现这个,那么对应的就是你的程序闪退了。
解决方法:通过第三方SDK,例如友盟,你对接SDK之后,发布之后,报错时,平台上会有报错的信息与日志,这样开发者就可以快速定位问题,然后解决问题了,然后对App做一个更新,这就完美化解了。
其实在实际的App开发中,大部分的问题都能在开发和测试阶段发现并且解决,但是巧的就是在上线之后到了用户手里,就出现了之前没有发现到的问题,这个时候开发和测试就要互相甩锅了,扯皮是常事。扯完之后还是要想办法解决才行,因此对于现在的线上项目来说,上线之前对接一款性能检测,错误收集的SDK是很有必要的,下面我将介绍友盟的接入。
二、友盟接入
1、点击友盟进入官网,然后注册和登录。
2、创建平台应用(进入路径最好是apm的),在友盟上创建应用,获取AppKey。
3、注册应用。此时AppKey已经生成了,然后选择需要开通的产品,这里选择应用性能监控U-APM。
4、确认开通。
复制这个App Key到自己的项目中,一会儿会用到。打开项目的build.gradle,添加maven库(这里拿自己做过的一个项目来举例)。两处地方,同一句代码:
groovy
maven { url 'https://repo1.maven.org/maven2/' }
然后打开app模块的build.gradle,在dependencies中添加如下代码:
groovy
// 友盟基础组件库(所有友盟业务SDK都依赖基础组件库)
implementation "com.umeng.umsdk:common:9.4.2" //(必选)
implementation "com.umeng.umsdk:asms:1.4.1" // asms包依赖(必选)
implementation "com.umeng.umsdk:apm:1.4.2" // U-APM包依赖(必选)
然后Sync Now,同步一下项目。
由于友盟的SDK需要获取手机的设备信息和网络状态,因此需要在AndroidManifest.xml中配置相应的权限
xml
其中READ_PHONE_STATE需要动态申请。
完成所有对接工作之后,就通过友盟获取全面日志分析,排查错误所在,帮助开发人员针对优化!
这篇文章通过介绍、友盟的接入、使用和日志分析了解到友盟U-APM功能的强大,这一工具对于线上项目来说是一个很好的帮手,能够快速定位到错误信息,帮助开发者进行针对性优化。友盟+还有更多优质的功能需要开发者去发掘~