| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android性能优化之疑难杂症解决方案U-APM的性能监控分析 -> 正文阅读 |
|
[移动开发]Android性能优化之疑难杂症解决方案U-APM的性能监控分析 |
关于Android发展至今,在各项功能十分成熟的情况下,我们越来越重视App的性能优化,以及用户体验,这关乎一个线上应用的DAU持续增长的基础,以及用户口碑的问题,今天刘某人带大家来一起分析一下崩溃/卡顿/ANR/OOM/启动慢等问题是如何解决的,以及使用友盟性能监控平台U-APM的便捷。 一.启动慢/白屏/黑屏优化我们在应用开发的时候,常常会提前初始化一些数据和功能,来保证用户使用的过程中,不会产生额外的停留,等待时间,那么当一个项目十分庞大的时候,初始化的数据也非常的多,另外由于设备的性能,渲染的机制等各种原因,时常会出现启动慢导致白屏,黑屏等情况,基于此情况,我们来看下如何解决。 1.修改主题/背景图我们先来看下Activity的结构 修改主题只需要将启动页的主题修改为透明或者图片,这样在ContentView加载出来之前,我们会透过启动的Activity看到桌面,就不会有黑/白屏的现象。再把标题栏去掉,把Activity设置成全屏的,效果挺不错,缺点是如果启动的是一个有复杂耗时操作的Activity,那么会有一种延迟的感觉。 将主题背景设置成一张图片,把标题栏去掉,把Activity设置成全屏的,这这样在ContentView加载出来之前,我们就能看到一张默认背景图,但是图片的屏幕适配问题就需要考虑了,主题里的背景图片会自动拉伸,可能会导致失真或者比例失调的问题,解决办法是使用一张.9的图片。 代码如下
2.初始化时机我们常见的初始化,无外乎在Application的onCreate或者启动页的onCreate创建回调中进行初始化,但是了解生命周期你可以发现,实际上onCreate还在进行渲染的操作,所以我们可以把初始化的动作放在onResume中,但是onResume是多次回调的,所以我们还需要进行初始化的判断。 代码如下
3.子线程初始化如果非强制必要在主线程使用,或者非强制要快速初始化,快速调用的函数,我们可以通过在子线程初始化的方式来优化大量函数初始化的情况 代码如下
4.ConstraintLayout约束布局已经成为Android Studio官方模板中默认的父布局了,可见其地位,ConstraintLayout 具体使用方式可以参考Google文档: 二.崩溃/ANR/OOM1.崩溃崩溃的问题是运行时所产生的,并且会抛出Exception,最常见的就是空指针,数组越界等异常了,如果是调试过程中出现崩溃,我相信稍微有一些基础的同学都知道如何去解决问题,在logcat中搜索AndroidRuntime即可,解决起来根据错误提示修复即可,如果非调试状态,而是在线上,那我们就需要日志的采集了,崩溃日志采集一般本地化做的话,徒增了很多的工作量,我比较推荐友盟的移动统计U-App来采集日志,使用方法见下文 2.ANRANR的表现在老的Android版本上会弹出一个提示框(应用已停止),但是现在主流的版本一般都是直接闪退了,ANR的处理方式比较复杂,需要根据堆栈的溢出信息来逐步分析,表现如图 负责更新界面的应用主线程无法处理用户输入事件或绘制操作,这样会引起用户的不满,所以系统会根据当前的场景等待,等待超时则停止响应,一般以下几种情况会导致ANR。
Android 提供了一些方式来帮助我们分析出问题,详情可以查看下官方的文档 当然,关于线上的App出现问题,我们就需要借助友盟的U-App来采集日志,才方便我们分析问题,使用方法见下文。 3.OOMOOM内存溢出,出现的情况大多数是在引用图片上出的问题,全称“Out Of Memory”,最常见的OOM情况有以下三种:
我们通常使用heapdump来分析内存的波形查找问题,当然,我们也可以先采集日志,见下文 三.U-APM1.集成我们可以使用友盟的APM先把日志采集了,便于我们解决问题,U-APM是在原U-App 稳定性分析基础上全新升级的独立产品,所以已计入的同学直接升级即可:https://at.umtrack.com/LrKb0f 按照文档描述我们来接入,接入的流程步骤如图 1.我们首先在project的build.gradle中添加友盟的仓库,如图示代码 2.在app/build.gradle中添加依赖 3.添加权限 4.初始化,需要先调用预初始化,再调用初始化 好的,一切准备就绪,我们就可以来模拟下错误的采集了,但是要注意,APP_KEY是需要自己去申请的,而APP_CHANNEL对应的是渠道标记,如果没有多渠道,可以无视,如果有多渠道的打包和统计,那么传入对应渠道名即可。 2.使用来到友盟APM管理平台 可以看到我创建的DEMO显示已集成APM,我来模拟一条空指针的错误 可以看到,实时显示,并且抓到的日志是比较精准的,我们来看下详情 这样就大功告成了,再有崩溃,ANR,OOM都能捕捉到了,而且可以基于友盟的基础能力,我们可以实时统计日活,事件上报等功能,还是蛮不错的。 当然,采集到日志,包括检测到异常,我们拿到日志,都是要自己分析的,这个分析的过程,还是需要个人的经验,以及细心和耐心,解决Bug的道路是枯燥且乏味的,静下心来,才能体验代码之美。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:50:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |