本文介绍Android SDK的详细接入步骤。接入SDK后,验证数据上报成功,即可在应用性能监控全链路版平台上使用相关分析功能。
注意
柔佛是开白地域,如需查看该地域接入的应用和功能页面,请提交工单。
import com.apm.insight.AppLog; // 关闭设备OAID的采集(可选) AppLog.setOAIdEnabled(false); // 关闭设备GAID的采集(可选) AppLog.setGAIdEnabled(false);
应用性能监控全链路版的Android SDK无需下载,根据以下初始化配置说明接入即可。
在project级别的build.gradle
文件中,添加maven地址。
buildscript { repositories { maven { url "https://artifact.bytedance.com/repository/Volcengine/" } maven { url "https://artifact.bytedance.com/repository/byteX/" } } } allprojects { repositories { maven { url "https://artifact.bytedance.com/repository/Volcengine/" } } }
接入应用性能监控全链路版。
在project级别的build.gradle
文件的dependencies中,添加以下代码,接入插件组件辅助插桩。apm_insight_plugin
国内海外使用同一个版本。
classpath "com.volcengine:apm_insight_plugin:1.4.2"
在app module的build.gradle
文件的dependencies中,添加以下代码,根据国内应用还是海外应用选择下面两个版本的一个。
国内应用接入cn版本,上报到中国,使用如下依赖:
// 国内应用在dependencies中添加 implementation 'com.volcengine:apm_insight:1.5.6.cn' implementation 'com.volcengine:apm_insight_crash:1.5.9'
海外应用接入oversea版本,上报到马来西亚柔佛,使用如下依赖:
// 海外应用在dependencies中添加 implementation 'com.volcengine:apm_insight:1.5.7.oversea' implementation 'com.volcengine:apm_insight_crash:1.5.8.oversea'
说明
初始化SDK阶段,不获取用户个人信息。
在Application中onCreate中,添加以下代码,初始化崩溃相关功能。
MonitorCrash.Config config = MonitorCrash.Config.app({{AppId}}) .token({{AppToken}})// 设置鉴权token,可从平台应用信息处获取,token错误无法上报数据 // .versionCode(1)// 可选,默认取PackageInfo中的versionCode // .versionName("1.0")// 可选,默认取PackageInfo中的versionName // .channel("test")// 可选,设置App发布渠道,在平台可以筛选 // .url("www.xxx.com")// 默认不需要,私有化部署才配置上报地址 //可选,可以设置自定义did,不设置会使用内部默认的 // .dynamicParams(new MonitorCrash.Config.IDynamicParams() { // @Override // public String getDid() {//返回空会使用内部默认的did。 // return null; // } // // @Override // public String getUserId() {//可选。用户的唯一标识,支持用户自定义UserId把平台数据和自己用户关联起来。内部每次使用会回调getUserId()函数,返回可以定义为变量,用户登录有UserId时对变量进行赋值。 // return null; // } // }) //可选,添加业务自定义数据,在崩溃详情页->现场数据展示 // .customData(crashType -> { // HashMap<String, String> map = new HashMap<>(); // map.put("app_custom", "app_value"); // return map; // }) .exitType(ExitType.EXCEPTION) // 可选,上报应用退出原因,EXCEPTION会过滤USER_REQUEST类型 .enableApmPlusLog(true) // 可选,是否将崩溃信息等写入APMPlus日志,默认false // .crashProtect(true) //可选,是否开启崩溃防护,默认false // .enableOptimizer(true) //可选,是否开启崩溃优化方案,默认false .autoStart(false) // 可选,是否在初始化时自动开启监控,默认为true // .debugMode(true) // 可选,线下使用的日志开关,线上不要调用或设置为false // 可选,添加pv事件的自定义tag,可以用来筛选崩溃率计算的分母数据 //.pageViewTags(<<Map<String, String>>>) .build(); MonitorCrash monitorCrash = MonitorCrash.init(ApplicationContext, config);
说明
启动崩溃监控,开始收集数据。
注意
请在用户同意隐私政策后,再调用方法收集数据。
// 启动监控,当初始化时autoStart传入false设置为初始化时不自动开启监控,需要在合适的位置调用start方法开启监控;如果初始化时未设置autoStart参数或者设置为true,将自动开启监控,不需要调用start方法。 if (monitorCrash != null) { monitorCrash.start(); }
在Application中onCreate中,添加以下代码,初始化性能相关功能。
注意
请在主线程中添加初始化性能相关功能的代码。
//必须放到Application的onCreate里面,会注册监听生命周期,不涉及数据采集和隐私合规问题 ApmInsight.getInstance().init(application); //初始化自定日志,配置自定义日志最大占用磁盘,内部一般配置20,代表最大20M磁盘占用。1.4.1版本开始存在这个api VLog.init(this,20);
启动性能监控,开始收集数据。
注意
请在用户同意隐私政策后,再调用方法收集数据。
//在同意隐私合规后调用 ApmInsightInitConfig.Builder builder = ApmInsightInitConfig.builder(); //设置分配的appid builder.aid({{app_id}}); //设置分配的AppToken builder.token({{AppToken}}); //是否开启卡顿功能 builder.blockDetect(true); //是否开启严重卡顿功能 builder.seriousBlockDetect(true); //是否开启流畅性和丢帧 builder.fpsMonitor(true); //控制是否打开WebView监控 builder.enableHybridMonitor(true); //控制是否打开内存监控 builder.memoryMonitor(true); //控制是否打开电量监控 builder.batteryMonitor(true); //控制是否打开CPU监控 builder.cpuMonitor(true); //控制是否打开磁盘监控 builder.diskMonitor(true); //控制是否打开流量监控 builder.trafficMonitor(true); //控制是否打开用户使用时长的监控 builder.operateMonitor(true); //控制是否打开启动监控,开启需要同时配置apm-plugin插件 builder.startMonitor(true); //控制是否打开页面Activity耗时监控,开启需要同时配置apm-plugin插件 builder.pageMonitor(true); //控制是否打开网络监控,开启需要同时配置apm-plugin插件 builder.netMonitor(true); //是否打印日志,注:线上release版本要配置为false builder.debugMode(true); //默认不需要,私有化部署才需要配置数据上报的域名 (内部有默认域名,测试支持设置http://www.xxx.com 默认是https协议 //builder.defaultReportDomain("www.xxx.com"); //设置渠道。1.3.16版本增加接口 //开启泄露和泄露兜底检测能力,泄露检测和泄露兜底需要分别在平台配置采样 //builder.detectActivityLeak(new IActivityLeakListener() { // @Override // public void onActivityLeaked(Activity activity) { // //activity泄露的回调 // } //}); builder.channel("google play"); //打开自定义日志回捞能力。1.4.1版本新增接口 builder.enableLogRecovery(true); //打开APMPlus日志能力,可以通过回捞获取APMPlus日志 builder.enableAPMPlusLocalLog(true); //设置数据和Rangers Applog数据打通,设备标识did必填。1.3.16版本增加接口 builder.setDynamicParams(new IDynamicParams() { @Override public String getUserUniqueID() { //可选。依赖AppLog可以通过AppLog.getUserUniqueID()获取,否则可以返回null。 return null; } @Override public String getAbSdkVersion() { //可选。如果依赖AppLog可以通过AppLog.getAbSdkVersion()获取,否则可以返回null。getAbSdkVersion是回调类的参数可以初始化后再设置。 return null; } @Override public String getSsid() { //可选。依赖AppLog可以通过AppLog.getSsid()获取,否则可以返回null。getSsid是回调类的参数可以初始化后再设置。 return null; } @Override public String getDid() { //1.4.0版本及以上可选,其他版本必填。设备的唯一标识,如果依赖AppLog可以通过 AppLog.getDid() 获取,也可以自己生成。getDid是回调类的参数可以初始化后再设置。 return null; } @Override public String getUserId() { //可选。用户的唯一标识,支持用户自定义user_id把平台数据和自己用户关联起来。内部每次使用会回调getUserId()函数,返回可以定义为变量,用户登录有UserId时对变量进行赋值。 return "userid"; } }); ApmInsight.getInstance().start(builder.build());
在app module的build.gradle文件最外层,添加以下代码,完成插桩。
插桩是为了简化接入网络监控、启动监控和页面监控,和其他监控能力无关。当前支持最高AGP版本7.0.2,编译异常相关解决方案见文档Apmplus plugin编译异常。编译出现冲突和异常也可以直接使用非插桩方式接入,具体请参见如何根据非插桩方案接入监控能力?。
//在文件头添加 apply plugin: 'apm-plugin' ApmPlugin { // 是否进行插桩 enable true // 是否在Debug包插桩,默认不插桩 enableInDebug true // DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"); // DEBUG 级别Log会汇总所有被插桩处理的类供查看,路径 app/build/ByteX/ApmPlugin/ApmPlugin_log.txt logLevel "DEBUG" // 启动分析开关:监控App启动耗时,需要同时开启pageLoadSwitch startSwitch = true // 页面响应开关:监控Activity的生命周期耗时 pageLoadSwitch = true // 网络监控开关:监控okhttp3的网络请求 okHttp3Switch = true //插桩显示HttpUrlConnection的网络请求开关 httpUrlConnectionSwitch = true // 重要:白名单下的包进行插桩,需要填写要插桩类所在的包名,支持前缀配置,默认可以写com whiteList = [ "com" ] // 黑名单包下类不进行插桩,可以配置包名和类名,没有可以不填 blackList = [ ] }
WebView初始化一般在某个Activity或者某个Fragment内,添加以下代码,将待监控的Webview进行封装。上报数据会在新H5监控模块展示。
//设置webView的WebChromeClient webView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); //调用如下函数控制新H5监控js加载 HybridMonitorManager.getInstance().onProgressChanged(view,newProgress); } }); //WebView加载url前需要调用如下函数 HybridMonitorManager.getInstance().onLoadUrl(webView,url); webView.loadUrl(url);
符号表可以解析崩溃堆栈的内容,将日志里的堆栈信息由原始堆栈转化成经过符号化之后的解析堆栈。符号表主要支持手动上传和自动上传两种方式。
说明
您也可以选择通过自定义脚本等方式上传符号表,详情请参见如何自定义上传符号表。
手动上传在符号表管理页面进行操作。详情请参见Android符号表管理。
在project级别的build.gradle
文件的dependencies中,添加以下代码,接入插件组件。
classpath "com.volcengine:apmplus_upload_plugin:0.0.7"
在应用工程的build.gradle
中,添加以下代码,配置自动上传符号表。
apply plugin: 'apmplus-upload-plugin' ApmPlusUploadConfig { api_token = "" // 从平台的 全部功能->符号表管理->系统选择 Android->下面可以看到api key和api token。或者联系开发同学获取到的对应appId的一个token,私有化部署不用设置 api_key = 0 // 从平台的 全部功能->符号表管理->系统选择 Android->下面可以看到api key和api token。或者联系开发同学获取到的对应appId的一个key,私有化部署不用设置 aid = 12345 // 应用性能监控全链路版上的appid // oversea = true // 海外域名版本符号表上传时设置为true,使用国内平台不需要填写或者设置为false // updateVersionCode = -1 // 默认不用写这一行, 除非您在初始化的时候手动指定了非标准版本号(或SDK版本号); 此处一定要与初始化的版本号一致 // mappingUrl = "https://www.xxx.com" // 默认不用写这一行,如果是私有化,这里配置私有化平台域名 }
注意
updateVersionCode
字段的值必须与初始化APMPlus传入的值一致。updateVersionCode
,请删除这行代码。