性能优化分析—移动应用篇

  作为一名开发者,在开发移动应用过程中我也遇到过很多问题,尤其是一些应用性能问题,例如: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功能的强大,这一工具对于线上项目来说是一个很好的帮手,能够快速定位到错误信息,帮助开发者进行针对性优化。友盟+还有更多优质的功能需要开发者去发掘~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值