简介: 导致 App 性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线、系统函数、编程范式、数据结构等导致的。即便是较有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位和捕获这些错误。

项目遇到的崩溃/卡顿/ANR/OOM/启动慢

1.1项目背景

1.2所遇到的挑战

1.3解决问题的步骤

1.4项目总结

2. 产品体验内容:集成/接入/使用

2.1集成/接入/ 友盟+ 应用性能监控平台 U-APM

2.2集成/接入/使用体验总结与分享

2.3对产品提出的建议/意见

1.项目遇到的奔溃/卡顿/ANR/OOM/启动慢

1.1项目背景

项目背景主要是公司开发项目,老板提起需求,产品经理规划需求以及文档,开发人员根据需求来规划开发,项目开发人员(两个前端开发,三个Java开发,两个测试,一个产品,一个ui);项目组织架构:

(小程序/H5):uniapp架构+U-APM监听统计+canvas绘制海报B端管理系统: Vue+Axios+Elementui+ueditor135编辑器+

项目名叫:值得买商城,主要是一个一体化的的B2C平台,包含内部商城管理系统(客服/运营可以在系统发布活动以及商品,管理商品、订单、会员,并且处理用户的询问以及投诉),C端小程序APP端(H5、APP端直接给用户提供一个便捷简介,实惠多优惠多的一个线上购物平台,通过活动优惠以及地推方式分享产生裂变,通过友盟统计抓取不同用户的喜好,定时更新推流以及发放优惠),项目类似京东商城、天猫商城,可以在商城浏览商品、下订单,会员用户以及星级用户可以参加各种活动。

电商模式:

1.1:B2B:商家到商家。比如阿里巴巴,慧聪网、铭万网。

1.2:B2C:商家到用户。比如京东。

1.3:C2C:用户到用户。比如淘宝。

1.4:B2B2C:商家到商家到用户。比如天猫。

1.5:O2O:线上到线下。比如百度外卖、美团、饿了么。

1.2所遇到的挑战/问题

1.项目上线例如代码异常或者控制台异常监听不到不太好排查

2.服务端队列接口其中一个挂掉项目直接奔溃

3.类似登录按钮点击请求频繁点击请求多次

4.页面组件不统一导致需求更改多处地方变动

5.切换环境或者项目距配置导致异常axios拦截失败

1.3解决问题的步骤

1. 最初项目开发中引入的fundebug第三方插件监听代码异常,但是部分拦截异常捕获不到{H5以及小程序使用的是fundebug,APP使用友盟的U-APM去接入捕获异常}

首先查看第三方捕获的异常区偏差问题,通过开发者工具调试debugger排查异常出现的位置,查看是代码逻辑问题还是其他异常,依次去排查解决

1.4项目总结

遇到问题,不要心急也不需要慌,既然问题出现了,按照问题出现的时间、方式、情况进行排查,找到问题之后,去一步步尝试解决就好,首先要把思路屡清楚,实战中总是会遇到怪怪的问题,用心去做就OK了,部分想系统的表格、表单,网站中的列表,标题栏等等模块项目中尽量去封装集成为组件库统一管理,减少工作量以及代码冗余。

2.产品体验内容:集成/接入/使用

这里来说一下友盟的U-APM集成接入以及使用方式,在这里首先先说明一下我个人在开发中为什么会选择友盟的这款产品api在项目中使用,在解决问题的步骤中我提到过,项目中h5跟小程序使用的一个第三方fundebug来抓取以及捕获异常,APP中开发使用U-APM捕获抓取错误异常并监听,{ fundebug捕获异常以及监听方面没有U-APM全面,只能监听到普通异常,U-APM可以监听到奔溃分析,自定义错误异常,启动分析,卡顿分析以受影响人数等等},唯一觉得美中不足的就是,U-APM只支持安卓跟IOS

2.1产品体验内容:集成/接入/使用

2.1.1首先进入网址登录注册应用获取下载SDK

U-APM网站地址应用性能监控平台 U-APM

2.1.2 获取到自己的应用key以及基础sdk

注意:

·       应用的安卓版和iOS版不能使用相同的AppKey,需要分开注册。

·       【友盟+】的应用名与实际应用名和包名无关,若注册应用时,提示应用名称已存在,建议命名为应用名+平台(iOS/Android)。

maven自动集成(推荐)

通过在Android Studio工程build.gradle配置脚本中添加maven线上依赖,导入最新版本组件化统计SDK。

maven依赖配置

在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】SDK新maven仓库地址。

maven { url 'https://dl.bintray.com/umsdk/release' }

buildscript {  repositories {  google()  jcenter() maven { url 'https://dl.bintray.com/umsdk/release' }  } dependencies {  classpath 'com.android.tools.build:gradle:3.4.0'  // NOTE: Do not place your application dependencies here; they belong  // in the individual module build.gradle files  } }  allprojects { repositories {  google()  jcenter() maven { url 'https://dl.bintray.com/umsdk/release' }  } }

在工程App 对应build.gradle配置脚本dependencies段中添加统计SDK库和其它库依赖:

// 下面各SDK根据宿主App是否使用相关业务按需引入。

// OAID目前为目前国内市场主流的Android Q设备标识,可根据需要选择。

// 友盟统计SDK  implementation 'com.umeng.umsdk:common:9.3.3'

// 版本号(必选)  implementation 'com.umeng.umsdk:asms:1.1.4'

// asms包依赖(必选)   implementation 'com.umeng.umsdk:game:9.2.0+G'

//游戏统计SDK依赖(可选)   implementation 'com.umeng.umsdk:apm:1.1.0'

// U-APM产品包依赖(必选)

崩溃/ANR类型

如果您使用的是9.0.4以上版本SDK,同时集成使用了umeng-apm-vx.x.x.aar插件,则默认开启新版本的稳定性功能

-keep class com.uc.** {*;}

如果开发者自己捕获了错误,需要手动上传到【友盟+】服务器可以调用下面两种方法:

@param {e}错误异常

@param{type}自定义错误类型

public static void UMCrash.generateCustomLog(Throwable e, String type)

方法一示例:

try {  // 抛出异常的代码 }

catch (Exception e) {

UMCrash.generateCustomLog(e, "UmengException"); }

方法二:

@param {e}错误异常

@param{type}自定义错误类型

public static void UMCrash.generateCustomLog(String e, String type)

捕获成功查看友盟+U-APM可视化工具:

详细文档查看官放文档比较清晰明了:

开发者中心

2.2集成/接入/使用体验总结与分享

首先来说一下市面上目前:导致 App 性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线、系统函数、编程范式、数据结构等导致的。即便是较有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位和捕获这些错误。随着App业务的与日俱增,各个系统也越来越复杂,服务间的调用,服务的依赖,以及分析服务的性能问题也越棘手,因此引入性能监控平台尤为重要。能不能快速、准确、丰富的定位错误类型,是衡量性能监控产品的头要因素。以友盟+的U-APM应用性能监控平台为例,无论是 Java、Native崩溃,还是 ANR、系统各种强杀等问题;异常问题U-APM都可以捕获到,并会生成内容完整、丰富、全面的日志。作为App开发者,相信大家一定遇到过类似的尴尬问题:故障永远都是你的客户告诉你的,而在什么时候发生的,你也无法确定,只能通过客户的反馈倒推时间节点,靠后从错误日志中得到相对完整的日志信息,友盟+应用性能监控平台U-APM为例触达渠道就有邮件、钉钉、企业微信、飞书等等。其中后三者可以通过webhook的方式直接将监控告警发送到群组里,让组内的研发同学头先时间获取到有效信息,及时更改异常修复。个人觉得还是蛮好的在个人开发中还是企业应用开发中目前都够用了。

2.3对产品提出的建议/意见

作为开发者对U-APM的建议:

1.登录一个账号就可以有一个选择平台来切换ios/安卓来直接看到对应数据的统计,现在需要来回折腾有点麻烦

2.目前监测统计错误异常只支持IOS跟安卓APP,小程序,H5以及公众号这些目前不支持

3.如果从监测的异常有录屏功能就更好了,这样会直接查看录屏回放效果杠杠的~

原文链接

本文为阿里云原创内容,未经允许不得转载。

项目实战总结以及接入U-APM的更多相关文章

  1. SpringBoot电商项目实战 — ElasticSearch接入实现

    如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...

  2. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  3. Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器

    最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外 ...

  4. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...

  5. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...

  6. 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...

  7. 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析

    [.NET Core项目实战-统一认证平台]开篇及目录索引 从本文开始,我们正式进入项目研发阶段,首先我们分析下统一认证平台应该具备哪些功能性需求和非功能性需求,在梳理完这些需求后,设计好系统采用的架 ...

  8. 【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求

    [.NET Core项目实战-统一认证平台]开篇及目录索引 这篇文章,我们将从Ocelot的中间件源码分析,目前Ocelot已经实现那些功能,还有那些功能在我们实际项目中暂时还未实现,如果我们要使用这 ...

  9. 【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我们介绍了网关使用Redis进行缓存,并介绍了如何进行缓存实现,缓存信息清理接口的使用.本篇我们将介绍如何实现网关自定义客户端授权, ...

  10. Kafka项目实战-用户日志上报实时统计之分析与设计

    1.概述 本课程的视频教程地址:<Kafka实战项目之分析与设计>  本课程我通过一个用户实时上报日志案例作为基础,带着大家去分析Kafka这样一个项目的各个环节,从而对项目的整体设计做比 ...

随机推荐

  1. 视野修炼第71期 | Rspack 家族新成员 Rsdoctor

    欢迎来到第 71 期的[视野修炼 - 技术周刊],下面是本期的精选内容简 强烈推荐 Rspack 新成员:Rsdoctor Bun Shell DCloud:App跨平台框架对比2023版 开源工具& ...

  2. CentOS 安装后必需所做的初始化操作

    CentOS 安装后必需所做的初始化操作 #关闭SELinux sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config #关闭防火墙 sy ...

  3. codeforce Round 934 div2 个人题解(A~C)

    A. Destroying Bridges 时间限制: 1秒 内存限制: 256兆 输入: 标准输入 输出: 标准输出 有 $n$ 个岛屿,编号为 $1,2,-,n$.最初,每对岛屿都由一座桥连接.因 ...

  4. python基础八(迭代器、生成器、生成式、递归、匿名函数、面向过程编程)

    一 迭代器 1.什么是迭代器 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而 继续的,单纯的重复并不是迭代2.为何要有迭代器 迭代器是用来迭代取值的工具,而涉及到把多 ...

  5. 01.Android之基础组件问题

    目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInstanceSta ...

  6. Sealos 开源初创公司 Trending 全球 TOP50,中国第二!

    今年,Runa Capital (鲁纳资本) 评选出了 2023 年增长最快的 50 家开源创业公司,Sealos 压轴登场,总共有两家中国公司上榜,Sealos 排名第二. Runa Capital ...

  7. Emgucv以及debugVisualizer下载

    1.Emgucv官网 https://www.emgu.com/ Github-- https://github.com/emgucv/ 在release 包中找到对应系统的版本 例如: libemg ...

  8. 13 CSS 的position属性

    13 CSS 的position属性 就像photoshop中的图层功能会把一整张图片分层一个个图层一样,网页布局中的每一个元素也可以看成是一个个类似图层的层模型.层布局模型就是把网页中的每一个元素看 ...

  9. #并查集,线性筛#nssl 1470 X

    分析 显然答案就是\(2^{连通块个数}-2\), 将每个数的质数所在的集合合并, 最后判断连通块个数即可(线性筛少了个等号改了半天QWQ) 代码 #include <cstdio> #i ...

  10. #高精度,卡特兰数#洛谷 2532 [AHOI2012]树屋阶梯

    题目 分析 设\(dp[n]\)表示大小为\(n\)的树屋阶梯方案数,如何不算重也不算漏 考虑在左下角填充一个尽量大的矩形,一共有\(n\)种方法, 然后剩下的两头就可以用前面的结果表示 也就是\(d ...