鉴于ArgusAPM部分代码采用了AJC编译器进行代码织入的功能,一些第三方的SDK可能为了安全性考虑做了一些加固处理或者禁止代码织入等限制,导致在接入的过程中可能会遇到各种奇葩的错误,因此我们建议:
- 如果是第三方的SDK,请在gradle脚本里面exclude掉,具体请参考详细接入文档;
- 如果exclude掉之后还会报错,请写一个报错的Demo并发送给管理员,发送之前,请先通知管理员;
- 提issue,并把报错的上下文贴进去。
# 以下为一些常见的问题:
1. 接入ArgusAPM是否会对APP性能产生影响?
几乎没有影响,360的亿万级产品均在使用,请放心使用。
2. 是否可以接入自己的后台?
ArgusAPM目前允许两种方式进行使用:
- 一是按照ArgusAPM官方文档进行接入,这时候无论是云规则的下发还是数据的上传都是用的360官方自己的服务器;
- 另外一种方式是:如果用户只想使用ArgusAPM采集性能数据,采集到的数据想要上传至自己的服务器,那么可以按照如下操作:
- 针对想要实现ArgusAPM与自己的服务器的对接,我们提供了一个示例,可以参考项目源码中的argus-apm-cloud-dummy-impl模块;
- 单独创建一个Module并依赖argus-apm-cloud模块,实现ArgusAPM与自己服务器的对接;(我们提供了两个接口,只需要实现这两个接口就可以了,目前采用的是同步请求的格式)3. 崩溃报在了com.argusapm.android包下,请问一定是ArgusAPM的错误吗?
因为ArgusAPM内部的部分功能采用了AOP代码织入,APK在构建的时候如果被这些AOP文件织入了相关的代码,将会有部分的APP代码在混淆的时候会被分配到该包下,请反混淆后确认是不是ArgusAPM引起的崩溃。
4. 如何查看本地采集到的数据?
请在文件系统里查看data/data/xxx_package_name/databases/apm.db
5. 性能的指标如何定义?
性能指标是通过云规则文件来进行配置的,如果想要定义卡顿的指标为:4500ms,则只需要更改云规则的文件里面的block_min_time为4500就可以了,其他的类似。
6. 为什么后台没有采集数据?
针对客户端数据采集,我们对上传规则做了限制,只有在Wifi状态且网络状态有变化的时候才会去上传,对此我们建议多用几款测试机进行测试,当采集到了一定量的数据之后,断开WiFi,再打开WiFi进行上传即可。我们目前默认的规则是两个小时作为间隔进行上传,并且上传之后,在第二天方能看到后台相应的数据。
在上传之前也可以先查看一下本地的数据库是否采集到了相应的数据,以及数据量的多少,查看请参考FAQ的第四条,然后再进行断网重连上传,最后再查看本地的数据库是否还有这些数据,如果上传从成功的话,本地的数据库会做清空处理。
最后,后台数据显示会延迟到第二天才能查看。
7. 如何线下调试?
ArgusAPM采集性能是在满足云规则的某些默认条件的时候,才会去采集数据,并最终上传至服务器,如果APP本身没有什么性能问题的话,ArgusAPM是不会去采集相应的数据的,那么,这些云规则文件里面的限定值又该如何更改呢,对此,为了方便,我们提供了线下调试的功能,具体步骤如下:
- 取出云规则文件
将Github上面的源码下载下来,并进入到argus-apm-cloud-dummy-impl模块下,将该模块下assets目录下的argus_apm_sdk_config.json文件拷贝出来(随便放到自己电脑上的某个目录);
- 更改云规则文件
打开argus_apm_sdk_config.json文件,发现里面有很多的配置项,对于我们关心的可能就是采集点的指标大小,对此我们只需要更改:
- 将anr_filter的值更改为自己的applicationId
- 将func_control模块下的字段值调整成自己想要设置的性能指标值,默认越小越容易采集到数据,例如activity_first_min_time字段,如果设置成300,那么如果有Activity页面打开的时候第一帧超过300毫秒,就会采集到该页面的详细信息;再比如block_min_time字段,如果设置成4500,那么当APP有超过4500毫秒的卡顿的时候就会采集到相应的堆栈信息,如果设置成1500,那么就是超过1500毫秒的时候就会采集相应的卡顿信息,其他字段同上;
- 将g_core下面的字段全部设置成true
- 将更改后的argus_apm_sdk_config.json文件放置到sdcard/360/Apm目录下;
在自己的Application里面增加如下配置:
builder.setEnabled(ApmTask.FLAG_LOCAL_DEBUG); //是否读取本地配置,默认关闭即可。
将APP杀掉重启,并点击APP里面的页面;
查看本地数据库里面是否有采集到的数据,具体路径如下data/data/xxx_package_name/databases/apm.db如果有数据说明采集到了数据;
如果apm.db里面有数据,请打开集成ArgusAPM的APP并断开WIFI,然后重新打开WIFI,再次查看apm.db里面是否有数据,如果没有则表示上传成功并清理掉了本地的数据,如果还有数据,则表示可能没有上传成功,请重复该步骤;
上传成功之后第二天将会在后台看到相应的数据展示;
如果这些还满足不了您的需求,则可以自己实现一个定制版的服务器,对此我们提供了相应的接口,只需要简单实现即可,无论是云规则的下发,还是数据的上传都可由自己来控制,具体请查看FAQ第二条。
9.ArgusAPM后台对版本号的限制?
目前ArgusAPM的DC后台对版本号做了一定的限制,请严格按照下面的格式进行配置,否则将展示不了数据:
1.1.0
1.1.4.469816
2.4
2.4.2
2.4.20
2.4.20alpha
2.4.20beta
2.4.20rc1
2.4.20.rc2
注意:不要在这些版本前面加V或者其他的字符。
10. 如果想要通过ArgusAPM源码的方式进行接入,请按照如下方式:
注意:如果采用源码的方式,那么云规则的下发和数据的上传都是argus-apm-cloud-dummy-impl模块下的假实现,需要开发者自行修改,从而对接自己的服务器。
第一步: 将project下的build.gradle里面的扩展属性ArgusAPM_Release更改为false;
第二步: 配置argusapm.gradle文件里面的moduleDependencies字段为:
`moduleDependencies ':argus-apm-main',':argus-apm-aop',':argus-apm-okhttp'`
第三步: 删除argus-apm-main模块下的libs目录下的两个jar包;
第四步: 重新Rebuild即可。
其他的模块不需要再设置,源码里面已经通过依赖配置过了;只要配置moduleDependencies 这个属性,在编译的时候就会使用本地的源码进行编译,而不会在使用JCenter仓库上面的依赖库进行编译了。
其他的操作都和详细文档接入方式一样,不需要做特殊处理。
11. 如何进行数据上报?
具体上传步骤:
- 打开APP,WIFI下断网并重新连接WiFi;
- 查看Logcat日志如果想要查看上报是否成功Log日志的话,可以在Logcat里面输入argus_apm:如果显示如下日志,则表示上传成功:
D/argus_apm: ❖ com.apm.application/UploadManager ❖ begin uploadData
D/argus_apm: ❖ com.apm.application/UploadManager ❖ upload.state.c 53ed260e 1
D/argus_apm: ❖ com.apm.application/UploadManager ❖ upload.state 53ed260e 1
注意:着重看后两行的最后一个字符是不是1,如果是1则表示上传成功,否则表示上传失败。
12. 如果APP在接入的过程中,遇到一些未知的错误,建议如下:
第一步:将classpath 'com.qihoo360.argusapm:argus-apm-gradle:2.0.1.1007'
删除;
第二步:删除apply plugin: 'argusapm'
第三步:在APP的build.gradle脚本里添加依赖:
api 'com.qihoo360.argusapm:argus-apm-main:2.0.1.1007'
其他都和插件接入方式一样,这样就可以先不采集AOP相关的一些点,例如网络、WebView等。