全部产品

移动数据分析

更新时间:2017-09-13 10:19:04   分享:   

Mobile Analytics Android SDK开发指南

1. 前言

本文档介绍了移动数据分析(Mobile Analytics) Android SDK的使用方式。

Mobile Analytics Android SDK是阿里云面向移动开发者提供的Android平台下的数据统计与监控服务。通过该SDK,开发者可以在自己的APP中便捷地进行数据埋点,监控日常的业务数据与网络性能数据,并通过阿里云控制台界面观察对应的数据报表展现。另外,用户后续可以通过设定自定义的数据解析规则实现定制化的数据图表展现。

您可以通过获取alicloud-android-demo工程源码获得移动数据分析服务的使用例程。

2. 安装Mobile Analytics Android SDK

2.1 注意

使用1.1.5及之前版本请在【Crash分析】板块查看crash信息。

使用1.1.6版本及之后的版本,请在【新版Crash分析】板块查看crash信息。

推荐使用1.1.6及之后的版本,crash数据更加准确,丢包率更小。

1.1.6之后的版本如果用手动设置channel的方式,请在manService.getMANAnalytics().init方法之前调用,具体请看下方初始化代码。通过mainfest.xml设置的话不影响。

2.2 手动集成SDK

2.2.1 SDK目录结构

  1. OneSDK
  2. |-- libs
  3. |-- |-- jniLibs
  4. | | |-- armeabi
  5. | | | |-- libMotu.so -crash捕获的so
  6. | | |-- armeabi-v7a
  7. | | | |-- libMotu.so
  8. | | |-- x86
  9. | | | |-- libMotu.so
  10. | |-- alicloud-android-sdk-man-1.1.6.jar -移动数据分析主功能包
  11. | |-- alicloud-android-ut-2.6.0.jar -UT基础包
  12. | |-- utdid4all-1.1.5.3_proguard.jar -设备Id生成包

2.2.2 SDK集成

  • 手动拷贝OneSDK目录下的jniLibs到以下目录:src - > main
  • build.gradle配置中添加如下配置项:
  1. android {
  2. ...
  3. defaultConfig {
  4. ...
  5. ndk {
  6. moduleName "jniLibs"
  7. abiFilters "armeabi", "armeabi-v7a", "x86"
  8. }
  9. }
  10. }

2.3 Maven依赖

  • build.gradle中添加Maven仓库地址:
  1. allprojects {
  2. repositories {
  3. maven {
  4. url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
  5. }
  6. }
  7. }
  • gradle添加依赖:
  1. dependencies {
  2. compile 'com.aliyun.ams:alicloud-android-man:1.1.6'
  3. }

开发时可以如上所述指定完整的版本号,也可以指定模糊版本号,gradle自动拉取满足条件的最新版本SDK,如compile 'com.aliyun.ams:alicloud-android-man:1.+'

3. 应用程序初始化

在您使用Mobile Analytics Android SDK进行数据统计与监控前,您需要对SDK的上下文进行一些初始化配置,如权限声明、传递应用上下文、访问控制等。其中权限声明在AndroidManifest.xml文件中进行。

3.1 权限声明及配置AppKey,AppSecret

以下是Mobile Analytics Android SDK所需要的Android权限及配置AppKey,AppSecret,请把这些权限配置到您的AndroidManifest.xml文件,否则,SDK将无法正常工作。

  1. ...
  2. <meta-data android:name="com.alibaba.app.appkey" android:value="YourAppKey"></meta-data>
  3. <meta-data android:name="com.alibaba.app.appsecret" android:value="YourAppSecret"></meta-data>
  4. </application>
  5. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  6. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  7. <uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
  8. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  10. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  11. <uses-permission android:name="android.permission.READ_SETTINGS"/>
  12. <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
  13. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3.2 初始化及参数设置示例

在Application的实现类中,添加初始化SDK的代码。

Mobile Analytics Android SDK初始化部分的接口如下:

  1. public class YourApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. /* 【注意】建议您在Application中初始化MAN,以保证正常获取MANService*/
  6. // 获取MAN服务
  7. MANService manService = MANServiceProvider.getService();
  8. // 打开调试日志,线上版本建议关闭
  9. // manService.getMANAnalytics().turnOnDebug();
  10. // 设置渠道(用以标记该app的分发渠道名称),如果不关心可以不设置即不调用该接口,渠道设置将影响控制台【渠道分析】栏目的报表展现。如果文档3.3章节更能满足您渠道配置的需求,就不要调用此方法,按照3.3进行配置即可;1.1.6版本及之后的版本,请在init方法之前调用此方法设置channel.
  11. manService.getMANAnalytics().setChannel("某渠道");
  12. // MAN初始化方法之一,从AndroidManifest.xml中获取appKey和appSecret初始化
  13. manService.getMANAnalytics().init(this, getApplicationContext());
  14. // MAN另一初始化方法,手动指定appKey和appSecret
  15. // String appKey = "******";
  16. // String appSecret = "******";
  17. // manService.getMANAnalytics().init(this, getApplicationContext(), appKey, appSecret);
  18. // 若需要关闭 SDK 的自动异常捕获功能可进行如下操作,详见文档5.4
  19. manService.getMANAnalytics().turnOffCrashReporter();
  20. // 通过此接口关闭页面自动打点功能,详见文档4.2
  21. manService.getMANAnalytics().turnOffAutoPageTrack();
  22. // 若AndroidManifest.xml 中的 android:versionName 不能满足需求,可在此指定
  23. // 若在上述两个地方均没有设置appversion,上报的字段默认为null
  24. manService.getMANAnalytics().setAppVersion("3.1.1");
  25. }
  26. }

3.3 配置渠道信息

您可以在AndroidManifest.xml中配置您的渠道信息,您只需要将<YOUR CHANNEL ID>替换您的渠道信息即可。

【注意】SDK执行初始化时会自动获取AndroidManifest.xml中的字段,并到填充渠道字段;初始化完成后。若同时调用了setChannel方法,则以setChannel方法中的参数为准。

  1. <application ...
  2. <meta-data
  3. android:name="ALIYUN_MAN_CHANNEL"
  4. android:value="<YOUR CHANNEL ID>" >
  5. </meta-data>
  6. </application>

3.4 SDK调试说明

在控制台中观察到的【今日实时】、【系统质量】-【实时Crash信息】、【新版crash分析】、【系统质量】-【性能分析】部分均为实时数据,调试时可参考该数据,验证环境配置及初始化是否正确。数据统计的准确性依赖APP的常规生命轨迹,比如应用启动次数依赖于用户正常退出应用触发的上报策略。

4. 业务数据统计

4.1 会员账号信息埋点

4.1.1 用户注册埋点

在用户注册成功之后,可使用userRegister 完成用户注册埋点。

  1. MANService manService = MANServiceProvider.getService();
  2. // 注册用户埋点
  3. manService.getMANAnalytics().userRegister("usernick");

4.1.2 用户登录及注销埋点

用户登录埋点:

  1. MANService manService = MANServiceProvider.getService();
  2. // 用户登录埋点
  3. manService.getMANAnalytics().updateUserAccount("usernick", "userid");

用户注销埋点:

  1. // 用户注销埋点
  2. manService.getMANAnalytics().updateUserAccount("", "");

如果不进行 4.1 会员账号信息埋点,此时不能在今日实时里看到【登录会员】和【新注册会员】的统计信息,而设备相关的统计【活跃用户】和【新增用户】可以看到。

完成上述埋点后,您就可以在阿里云控制台看到相应统计信息,例如下图所示为用户周活跃度。

4.2 页面埋点

说明:Mobile Analytics SDK默认会自动采集Android 4.0及以上系统的Activity 页面,如果不需要自动采集可使用下面方法关闭自动页面打点。打开页面自动埋点时,默认页面名称为class.getSimpleName()并去除Activity后缀。

  1. // 关闭自动打点
  2. MANService manService = MANServiceProvider.getService();
  3. manService.getMANAnalytics().turnOffAutoPageTrack();

为了满足Android 4.0以下系统的页面采集需求,您可按照如下的说明进行手动埋点。

【注意】:如果App中没有进行页面埋点,活跃用户参数不能正常统计。

4.2.1 手动Activity页面埋点

在Activity 的onReasume 以及onPause 中分别加入pageAppear和pageDisAppear代码,建议下述代码可以在一个基类中做,让其它所有的activity类都继承这个基类,就完成了所有子类页面埋点。

代码示例如下:

  1. public class BaseActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. }
  6. @Override
  7. protected void onResume() {
  8. super.onResume();
  9. MANService manService = MANServiceProvider.getService();
  10. manService.getMANPageHitHelper().pageAppear(this);
  11. }
  12. @Override
  13. protected void onPause() {
  14. super.onPause();
  15. MANService manService = MANServiceProvider.getService();
  16. manService.getMANPageHitHelper().pageDisAppear(this);
  17. }
  18. }

页面埋点将影响控制台【页面路径分析】、【关键漏斗】、【页面留存】等指标的报表展现。

4.2.2 给Activity页面增加属性统计

场景例子:

我们要开发一个购物app,在购物的app的宝贝展示页面,我们可能想要知道,此页面都展示了哪些商品?可以简单理解为,我们可以对采集的页面(GoodsDetails 页面)记录上增加一个宝贝属性就可以,如item_id=xxxxxx。

代码示例如下:

  1. // 这句话要在一个页面的onPause 之前任何位置调用都可以
  2. Map<String, String> lMap = new HashMap<String, String>();
  3. lMap.put("item_id", "xxxxxx");
  4. MANService manService = MANServiceProvider.getService();
  5. manService.getMANPageHitHelper().updatePageProperties(lMap);

结果Log:

  1. 11-06 16:10:32.088: I/cache_log(10879): UT:...||2001||-||-||3191||item_id=xxxxxx

这里:2001 是页面事件的ID,3191 是页面展示的时长,item_id=xxxxxx 就是属性。

4.2.3 页面基础埋点使用

上述是针对Activity级别的页面埋点,只需简单地调用pageAppear和pageDispear即可完成埋点对相应的数据上报,上报数据包括:页面名称、来源页面名称、页面停留时间和额外属性设置等。如果需要对非Activity页面,如Fragment进行埋点,或者需要灵活把控页面埋点上报信息,如修改上报页面信息、对页面停留时长做特殊处理等,可以使用页面基础埋点的方式。通过该方式上报埋点数据同样将影响控制台【页面路径分析】、【关键漏斗】、【页面留存】等指标的报表展现。使用方式如下:

获取基础页面打点对象:

  1. // 传入参数为页面名称
  2. MANPageHitBuilder pageHitBuilder = new MANPageHitBuilder(String pageName);

设置来源页面名称:

  1. pageHitBuilder.setReferPage(String referPageName);

设置页面停留时间:

  1. pageHitBuilder.setDurationOnPage(long duration);

设置页面属性:

  1. pageHitBuilder.setProperty(String key, String value);
  2. pageHitBuilder.setProperties(Map<String, String> properties);

构造页面埋点log数据:

  1. pageHitBuilder.build();

5. 性能数据统计

APP性能直接决定了用户体验效果,同时也一直是业务开发人员容易忽视的问题。Mobile Analytics提供了丰富的性能监控API方便用户全方位监控自己的APP运行状态。

5.1 基本网络性能统计

Mobile Analytics针对传统APP的网络性能统计进行了封装,方便用户埋点,获取网络层面的常见指标,这些指标包括:

  • 请求的整体响应时间
  • APP整体带宽利用率
  • 网络异常统计

在进行正确地数据埋点上报后,您可以在阿里云控制台Mobile Analytics监控页面观察您的APP的相应性能指标情况。

5.1.1 开始网络请求

Mobile Analytics对网络性能的统计以一次网络请求为基本单位,您需要在这次网络请求的流程中埋入一些记录点,让Mobile Analytics统计这次请求的相关数据,上报到数据分析中心。具体方法如下:

对某个网络请求的统计通过MANNetworkPerformanceHitBuilder完成,在发起网络请求前,您需要调用如下代码,记录此次网络请求的Host信息和请求Method,并标记网络请求开始:

  1. MANNetworkPerformanceHitBuilder networkPerfBuilder = new MANNetworkPerformanceHitBuilder("taobao.com", "GET");
  2. /* 打点记录网络请求开始 */
  3. networkPerfBuilder.hitRequestStart();

此外,Mobile Analytics Android SDK还提供了可以附加额外信息的接口:

  1. /* 附带额外需要上报信息 */
  2. networkPerfBuilder.withExtraInfo("name1", "value1");

【注意】Host必须符合标准Hostname格式,否则会被忽略。Method必须是“GET”或者“POST”,否则默认为“GET”,目前只支持这两个值。我们在前台展示时会用这些信息中的’Host’, ‘Method’作为维度。

5.1.2 网络请求正常结束,统计请求响应时间

请求结束后,您还需要做一次埋点,来标记该次网络请求的结束。接口如下:

  1. networkPerfBuilder.hitRequestEndWithLoadBytes(loadBytes);

类型为int的loadBytes参数是为了让您传入该次网络请求的总下载数据量,以便Mobile Analytics Android SDK打点记录。

在您调用这个函数以后,整个网络性能埋点流程就结束了,该次网络请求的相关数据会上报到数据分析平台,分析汇总后,您就可以到阿里云控制台Mobile Analytics页面观察您的APP的相应性能指标情况,如下图所示。

5.1.3 网络请求异常结束,上报网络异常

网络请求无法避免异常情况,在埋点时,如果抛出异常打断了整个网络请求的流程,那么您是需要对此做额外处理的,否则将导致打点数据紊乱。上报的办法也很简便,您只需要在抓获异常以后选择默认网络异常类型或者自定义网络异常类型的任意一种方式来标记这次请求发生了异常:

默认网络异常类型

异常类型或HttpResponseCode 对应接口
400<=HttpResponseCode<500 buildHttpCodeClientError4XX()
500<=HttpResponseCode buildHttpCodeServerError5XX()
MalformedURLException buildMalformedURLException()
InterruptedIOException buildInterruptedIOException()
SocketTimeoutException buildSocketTimeoutException()
IOException buildIOException()

使用说明:

  1. // 如果您需要上报其它异常,请按照上表替换buildIOException为相应接口
  2. MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildIOException()
  3. .withExtraInfo("error_url", url.toString())
  4. .withExtraInfo("other_info", "value");
  5. networkPerfBuilder.hitRequestEndWithError(errorInfo);

自定义网络异常类型

如果默认网络异常类型无法满足您的需求,您可以自定义网络异常类型,但是网络异常类型编码要在 1001 <= YourErrorCode <= 1010范围内,如果不进行前端配置将以错误编码(10xx)的形式进行展示,如果在前端配置错误编码对应的信息,就会展示您所配置的信息。

使用说明:

  1. MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildCustomErrorCode(1001)
  2. .withExtraInfo("error_url", url.toString());
  3. networkPerfBuilder.hitRequestEndWithError(errorInfo);

5.1.5节中示例代码的最后部分已经展示了具体如何操作。这个接口的errorInfo参数是为了让您上报这次异常的一些您认为有价值的信息。

【注意】 一旦您调用了MANNetworkPerformanceHitBuildernetworkPerfBuilder.hitRequestStart();接口以后,您需要确认代码在正常情况下执行到networkPerfBuilder.hitRequestEndWithLoadBytes(loadBytes);,或者在异常请求下执行到networkPerfBuilder.hitRequestEndWithError(errorInfo);,否则,此次网络请求的相关信息将上报失败。

5.1.4 调用Tracker的send方法上报打点数据

使用builder进行各个阶段的打点以后,需要获取到MANTracker将它的数据上报,如下:

  1. manService.getMANAnalytics().getDefaultTracker().send(networkEvent); // 调用Track的send方法把此次打点的数据上报

5.1.5 代码示例

以下是一个较为完善的示例代码:

  1. MANService manService = MANServiceProvider.getService();
  2. String urlString = "http://www.aliyun.com";
  3. MANNetworkPerformanceHitBuilder networkPerformanceHitBuilder = new MANNetworkPerformanceHitBuilder("www.aliyun.com", "GET");
  4. try {
  5. URL url = new URL(urlString);
  6. byte[] buf = new byte[64 * 1024];
  7. // 打点记录请求开始
  8. networkPerformanceHitBuilder.hitRequestStart();
  9. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  10. // 建立连接
  11. conn.connect();
  12. // 开始获取响应内容
  13. int responseCode = conn.getResponseCode();
  14. long totalBytes = 0;
  15. int len = 0;
  16. if (responseCode == 200) {
  17. // 读尽响应内容
  18. InputStream in = conn.getInputStream();
  19. while ((len = in.read(buf)) != -1) {
  20. totalBytes += len;
  21. }
  22. in.close();
  23. }
  24. // 附带额外需要上报信息
  25. networkPerformanceHitBuilder.withExtraInfo("name1", "value1");
  26. // 打点标记请求结束
  27. networkPerformanceHitBuilder.hitRequestEndWithLoadBytes(totalBytes);
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. // 按照文档5.1.3的说明选择默认网络异常类型或者自定义网络异常类型来上报网络异常
  31. MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildIOException()
  32. .withExtraInfo("error_url", urlString)
  33. .withExtraInfo("other_info", "value");
  34. // MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildCustomErrorCode(1001)
  35. // .withExtraInfo("error_url", urlString)
  36. // .withExtraInfo("other_info", "value");
  37. // 打点,记录出错情况
  38. networkPerformanceHitBuilder.hitRequestEndWithError(errorInfo);
  39. }
  40. // 上报网络性能事件打点数据
  41. manService.getMANAnalytics().getDefaultTracker().send(networkPerformanceHitBuilder.build());

5.2 高级网络性能统计

如果您对网络指标有更细粒度的要求,并且已经按照5.1的文档说明进行了网络性能埋点,此时如果按照本章进行操作,便可以增加TCP建连时间及首字节响应时间的埋点。

  • TCP建连时间(5.2 高级网络指标统计)
  • 请求的首字节响应时间(5.2 高级网络指标统计)
  • 请求的整体响应时间 (见5.1 基本网络性能统计)
  • APP整体带宽利用率 (见5.1 基本网络性能统计)
  • 网络异常统计 (见5.1 基本网络性能统计)

5.2.1 TCP建连时间统计

如果您希望统计该次网络请求TCP建连的耗时,那么在发起网络请求以后,建连成功时,您需要调用以下接口标记建连成功:

  1. /*打点记录建连成功*/
  2. networkPerfBuilder.hitConnectFinished();

这个函数一般在httpURLConnection.connect()方法或者httpClient.execute()方法执行完毕时调用。

5.2.2 请求首字节响应时间统计

如果您希望统计该次网络请求的首字节响应时间,您需要调用以下接口标记首字节到达:

  1. networkPerfBuilder.hitRecievedFirstByte();

这个时间点一般是在httpURLConnection.getResponseCode()方法或者HttpResponse.getStatusLine.getStatusCode()方法执行完毕以后。

5.2.3 代码示例

下面是增加TCP建连时间及首字节响应时间埋点后的示例代码:

  1. MANService manService = MANServiceProvider.getService();
  2. String urlString = "http://www.aliyun.com";
  3. MANNetworkPerformanceHitBuilder networkPerformanceHitBuilder = new MANNetworkPerformanceHitBuilder("www.aliyun.com", "GET");
  4. try {
  5. URL url = new URL(urlString);
  6. byte[] buf = new byte[64 * 1024];
  7. // 打点记录请求开始
  8. networkPerformanceHitBuilder.hitRequestStart();
  9. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  10. // 建立连接
  11. conn.connect();
  12. // 打点记录建连时间
  13. networkPerformanceHitBuilder.hitConnectFinished();
  14. // 开始获取响应内容
  15. int responseCode = conn.getResponseCode();
  16. // 打点记录首包时间
  17. networkPerformanceHitBuilder.hitRecievedFirstByte();
  18. long totalBytes = 0;
  19. int len = 0;
  20. if (responseCode == 200) {
  21. // 读尽响应内容
  22. InputStream in = conn.getInputStream();
  23. while ((len = in.read(buf)) != -1) {
  24. totalBytes += len;
  25. }
  26. in.close();
  27. }
  28. // 附带额外需要上报信息
  29. networkPerformanceHitBuilder.withExtraInfo("name1", "value1");
  30. // 打点标记请求结束
  31. networkPerformanceHitBuilder.hitRequestEndWithLoadBytes(totalBytes);
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. // 按照文档5.1.3的说明选择默认网络异常类型或者自定义网络异常类型来上报网络异常
  35. MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildIOException()
  36. .withExtraInfo("error_url", urlString)
  37. .withExtraInfo("other_info", "value");
  38. // MANNetworkErrorInfo errorInfo = MANNetworkErrorCodeBuilder.buildCustomErrorCode(1001)
  39. // .withExtraInfo("error_url", urlString)
  40. // .withExtraInfo("other_info", "value");
  41. // 打点,记录出错情况
  42. networkPerformanceHitBuilder.hitRequestEndWithError(errorInfo);
  43. }
  44. // 上报网络性能事件打点数据
  45. manService.getMANAnalytics().getDefaultTracker().send(networkPerformanceHitBuilder.build());

5.3 自定义性能事件埋点

自定义性能事件埋点可满足用户针对定制化的性能事件进行实时监控的需求(比如,Cache的读写耗时,私有网络协议的RPC耗时,客户端算法的耗时等)。在进行正确的客户端埋点后,您可通过阿里云控制台进行数据的多维度实时监控。

自定义性能事件可包含以下几部分内容:

1.事件名称(event_label),只能为字母、数字和下划线组成【必选】

2.事件从开始到完成消耗的时长【必选】

3.事件所携带的属性【可选】

【注意】 自定义性能事件用于监控用户事件的时间开销,请参考下述代码实例正确传递参数。

例子:

  1. String labelKey = "fibonacci";
  2. MANCustomPerformanceHitBuilder performanceHitBuilder = new MANCustomPerformanceHitBuilder(labelKey);
  3. // 记录自定义性能事件起始时间
  4. performanceHitBuilder.hitStart();
  5. fibonacci(1);
  6. // 记录自定义性能事件结束时间
  7. performanceHitBuilder.hitEnd();
  8. // 设置时长方法2
  9. // long timeCost = 0;
  10. // performanceHitBuilder.setDuration(timeCost);
  11. performanceHitBuilder.withExtraInfo("EXTRA_INFO_KEY1", "EXTRA_INFO_VALUE")
  12. .withExtraInfo("EXTRA_INFO_KEY2", "EXTRA_INFO_VALUE");
  13. // 上报自定义性能事件打点数据
  14. manService.getMANAnalytics().sendCustomPerformance(performanceHitBuilder.build());

5.4 Crash 异常捕获埋点

由于CrashHandler(app crash数据采集)是默认开启的,如果您不需要,可以通过如下方式关闭

  1. MANService manService = MANServiceProvider.getService();
  2. // 关闭crash自动采集功能
  3. manService.getMANAnalytics().turnOffCrashReporter();

【注意】 这段代码建议与初始化SDK代码放置在一起,在程序启动部分执行。

【注意】 如果您的代码中使用了Thread.setDefaultUncaughtExceptionHandler(handler),请在初始化MAN SDK之前调用Thread.setDefaultUncaughtExceptionHandler(handler)。这样MAN收到异常通知以后,会再次通知到您的handler,

如果使用了crash采集功能,可在前端界面实时看到crash相关信息,如下图所示。

6 自定义事件埋点

自定义事件埋点可用于满足用户的定制化需求。

自定义事件可包含以下几个部分内容:

1.事件名称(event_label)

2.事件从开始到完成消耗的时长

3.事件所携带的属性

4.事件对应的页面

例子:

  1. // 事件名称:play_music
  2. MANCustomHitBuilder hitBuilder = new MANHitBuilders.MANCustomHitBuilder("playmusic");
  3. // 可使用如下接口设置时长:3分钟
  4. hitBuilder.setDurationOnEvent(3 * 60 * 1000);
  5. // 设置关联的页面名称:聆听
  6. hitBuilder.setEventPage("Listen");
  7. // 设置属性:类型摇滚
  8. hitBuilder.setProperty("type", "rock");
  9. // 设置属性:歌曲标题
  10. hitBuilder.setProperty("title", "wonderful tonight");
  11. // 发送自定义事件打点
  12. MANService manService = MANServiceProvider.getService();
  13. manService.getMANAnalytics().getDefaultTracker().send(hitBuilder.build());

自定义事件扩展参数在控制台【自定义事件】-【详细数据】-【参数分析】中可查看,但查看之前请在【管理设置】-【自定义事件管理】中添加要在控制台显示的事件ID。如果您需要对自定义事件进行实时监控,请参考【5.3 自定义性能事件】章节。

7. 如何实时验证数据是否正常上报

您当前可以通过以下两种方式进行验证:

  • 打开移动数据分析log,查看logcat是否会出现如UT:{"t":1464532680574,"ret":"","success":"success"}的日志;

    注意:SDK的日志上报会有缓存和聚合,因此上报时机会比API调用时机滞后一些,可耐心等待30-60s或将应用切到后台查看。

  • 登录控制台查看活跃用户等实时报表;

    注意:活跃用户的统计依赖页面埋点,移动数据分析后台会将零星的页面埋点处理为噪点,进行过滤,因此请确保您有足量的页面埋点事件上报(>5),另外控制台的实时报表大概会有5min的延迟。

8. H5数据的上报

H5页面采集并没有单独的SDK,依赖native进行上传,通过JSBridge通知给native,然后调用MAN的相应方法,进行数据的上报。可运行demo请参考:alicloud-android-demo

8.1 代码示例

JavaScript代码:

  1. // 这里通过在JS alert消息,然后在native端进行捕获通信
  2. alert( "jsbridge://custom" );

Java

重写WebChromeClientonAlert方法,对于约定好的scheme,进行拦截,然后根据相应内容执行不同的方法,从而达到调用native埋点的目的。

  1. WebView webView = (WebView) findViewById(R.id.h5DemoWebview);
  2. webView.setWebChromeClient(new WebChromeClient(){
  3. @Override
  4. public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
  5. // 这里只要自己约定好方式就行,uri、json、xml等等。
  6. Uri uri = Uri.parse(message);
  7. if ( uri.getScheme().equals( "jsbridge" ) ) {
  8. if ( uri.getHost().equals( "custom" ) ) {
  9. // 事件名称:play_music
  10. MANHitBuilders.MANCustomHitBuilder hitBuilder = new MANHitBuilders.MANCustomHitBuilder("playmusic");
  11. // 可使用如下接口设置时长:3分钟
  12. hitBuilder.setDurationOnEvent(3 * 60 * 1000);
  13. // 设置关联的页面名称:聆听
  14. hitBuilder.setEventPage("Listen");
  15. // 设置属性:类型摇滚
  16. hitBuilder.setProperty("type", "rock");
  17. // 设置属性:歌曲标题
  18. hitBuilder.setProperty("title", "wonderful tonight");
  19. // 发送自定义事件打点
  20. MANService manService = MANServiceProvider.getService();
  21. manService.getMANAnalytics().getDefaultTracker().send(hitBuilder.build());
  22. }
  23. return true;
  24. }
  25. return super.onJsAlert(view, url, message, result);
  26. }
  27. });

9. 混淆配置

  1. -keep class com.alibaba.sdk.android.**{*;}
  2. -keep class com.ut.**{*;}
  3. -keep class com.ta.**{*;}
本文导读目录
本文导读目录
以上内容是否对您有帮助?