友盟统计的一次详细分析,记录自己深入阅读统计的过程
2016-12-20 17:39
477 查看
国内专业的移动应用统计分析平台。我们帮助移动应用开发商统计和分析流量来源、内容使用、用户属性和行为数据,以便开发商利用数据进行产品、运营、推广策略的决策。
A:不同平台的应用禁止使用相同的Appkey,需要分开注册。
Q:注册应用时,提示“应用名称已存在”
A:友盟后台的应用名与实际应用名和包名无关,建议命名为“应用名+平台(IOS/Android)”。
如果无法正常集成请添加如下代码 :
etype是官方场景,有如下场景:
andriod 6.0之后,设备信息部分获取有所变动,请参考官网:https://developer.android.com/training/permissions/requesting.html
小技巧:当xml中的targetSdkVersion=x(x<23)时候, 可以正常获取信息(相当于跳过了6.0权限检查)
中的Channel ID 替换为您应用的推广渠道名称,channel id自定义。
例如在豌豆荚渠道推广此包,代码示例:
渠道命名规范
1.可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
2.首尾字符不可以为空格
3.不要使用纯数字作为渠道ID
4.最多256个字符
5.”unknown” 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名
在您查看数据时,渠道会作为一个数据细分的维度。
非常重要:每台设备仅记录首次安装激活的渠道,如果该设备再次安装其他渠道包,则数据仍会被记录在初始的安装渠道上(这一点就有点坑爹了)。 所以在测试不同的渠道时,请使用不同的设备来分别测试。也可使用集成测试功能进行测试,了解更多集成测试请点击这里 。
UMAnalyticsConfig初始化参数类,提供多参数构造方式:
构造意义:
- String appkey:官方申请的Appkey
- String channel: 渠道号
- EScenarioType eType: 场景模式,包含统计、游戏、统计盒子、游戏盒子
- Boolean isCrashEnable: 可选初始化. 是否开启crash模式
A:目前不支持删除渠道,但可以隐藏,请在 设置–渠道 里隐藏渠道
渠道统计使用中的问题请参见友盟开发者社区: 友盟渠道统计使用的那些事儿
A:请查看设置–版本–已隐藏版本列表,是否隐藏了该版本。
onPause方法中调用
确保在所有的Activity中都调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。
注意 如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计,导致启动次数异常增高。(eg.使用TabHost、TabActivity、ActivityGroup时)。(一般项目开发都有父类Activity,所以只在父类Activity中添加这两个方法调用就可以了)
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:
来自定义这个间隔(参数单位为毫秒)。
- 如果开发者调用Process.kill或者System.exit之类的方法杀死进程,请务必在此之前调用
方法,用来保存统计数据。
session统计的相关问题请参见友盟开发者社区: 启动次数的统计原理, 单次使用时长的统计原理
至此,基本功能集成已经结束。**
非常重要:必须调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。
ID:用户账号ID,长度小于64字节
Provider:账号来源。如果用户通过第三方账号登陆,可以调用此接口进行统计。支持自定义,不能以下划线”_”开头,使用大写字母和数字标识,长度小于32 字节; 如果是上市公司,建议使用股票代码。
账号登出时需调用此接口,调用之后不再发送账号相关内容。
当用户使用第三方账号(如新浪微博)登录时,可以这样统计:
如果您集成了新版SDK的账号接口,可以通过启动账号统计开关,来开启账号报表的展现。账号统计报表开关仅作用于报表的展现,不影响数据的计算。您可以根据实际的需要来启动或者暂停该功能。==集成此功能的第二天才能在后台报表看见账号的数据==。可在下图所示位置查看
页面访问路径的数据为全量统计。若您希望查看测试数据,请使用 集成测试 ,了解更多集成测试请 点击这里 。
☺ 页面统计的常见问题参见友盟开发者社区: 页面访问路径中你需要了解的知识点 ,页面访问路径常见问题详解
MobclickAgent.onResume() 和MobclickAgent.onPause() 方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能)
2.MobclickAgent.onPageStart() 和MobclickAgent.onPageEnd() 方法是用来统计页面跳转的
在仅有Activity的应用中,SDK 自动帮助开发者调用了 2 中的方法,并把Activity 类名作为页面名称统计。但是在包含fragment的程序中我们希望统计更详细的页面,所以需要自己调用方法做更详细的统计。
首先,需要在程序入口(应该是Application)处,调用
禁止默认的页面统计方式,这样将不会再自动统计Activity。
然后需要手动添加以下代码:
使用 MobclickAgent.onResume 和 MobclickAgent.onPause 方法统计时长, 这和基本统计中的情况一样(针对Activity)
使用 MobclickAgent.onPageStart 和 MobclickAgent.onPageEnd 方法统计页面(针对页面,页面可能是Activity 也可能是Fragment或View)
如果页面是直接由Activity实现的,统计代码大约是这样:
如果页面是使用FragmentActivity + Fragment实现的,需要在 FragmentActivity 中统计时长:
并在其包含的 Fragment 中统计页面:
注意:这些方法的调用,需要保证线性不交叉,每个 onResume 都对应一个 onPause ,每个 Start 都有一个 End 配对。这样才能保证每个页面统计的正确,关于页面统计API的最佳实践说明见这里 。
Android平台的数据发送策略有两种方式:
启动时发送:新增、活跃、启动次数等数据在APP本次打开时即刻发送,使用时长、自定义事件、错误统计等在使用过程中产生的所有消息数据都在下次启动应用时发送。如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。
按间隔发送:按特定间隔发送数据,间隔时长介于==90秒与1天之间==。新增、活跃、启动次数等数据在APP本次打开时即刻发送,使用时长、自定义事件、错误统计等在使用过程中产生的所有数据都按间隔发送,如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。
点击发送策略之后,可以看到设置页面
注意 :
(1)在没有获取到在线配置时,默认使用启动时发送的策略。
(2)在打开debug调试模式或者使用集成测试时,不受发送策略控制。
如果enable为true,SDK会对日志进行加密。加密模式可以有效防止网络攻击,提高数据安全性。
如果enable为false,SDK将按照非加密的方式来传输日志。
如果您没有设置加密模式,SDK的加密模式为false(不加密)。(默认不加密)
这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示”NoSuchMethod”错误。
另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
☺ 自定义事件使用中的问题请参见友盟开发者社区: 自定义事件常见问题,关于自定义事件的那些事儿
key :自定义事件下的参数
value :自定义事件参数下的参数值
自定义事件的代码需要放在Activity里的onResume–onPause之间,请在友盟初始化之后调用事件,不支持在service中统计。
个人发现:上面所说的自定义事件包括计数和计时时间,需要把程序添加到onResume–onPause,但自己测试的时候发现,计数时间不需要添加到onResume–onPause之间就可以统计到相应的次数。
MobclickAgent.onEvent(Context context, String eventId);
context 指当前的Activity
eventId 为当前统计的事件ID。
示例:统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用
map 为当前事件的属性和取值(Key-Value键值对)。
示例:统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
统计一个数值类型的连续变量(该变量必须为整数),用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等,可以调用如下方法:
MobclickAgent.onEventValue(Context context, String id, Map
上面方法在Android统计分析V5.2.2之后(>=)才提供,之前的版本可以通过下面的方式封装计算事件:
注意:onEventBegin(…),onEventEnd(…)以及onEventDuration(…)后续不再支持,不建议使用。
- 如需统计使用时长,开发者需要自己上传时长数据(如示例中的duration所示),时长数据会在计算事件的数值型部分展示;
- 如果使用了onEventBegin(…),onEventEnd(…)以及onEventDuration(…)方法,时长数据会在计算事件的字符串型中显示。
如图:
使用了onEventBegin(…),onEventEnd(…)以及onEventDuration(…)方法,时长数据会显示在【消息时长】选项中,为了兼容老用户,线上仍保留这个选项,此方法已不建议使用。
如图:
开发者使用计算事件自己上传时长数据(如示例中的duration所示),时长数据会在计算事件的数值型部分展示:
@param context:当前Activity
@param keyPath:最大8个
@param value:数值参数
@param label:事件标签,事件的一个属性说明(一期只做采样不做计算,二期会对label进行计算)使用结构化事件前,请先到友盟U-App管理后台的设置->结构化事件中添加相应的事件ID
结构化事件介绍:http://dev.umeng.com/analytics/reports/usage#3
id, ts, du是保留字段,不能作为event id及key的名称。==每个应用至多添加500个自定义事件==,每个event 的 key不能超过10个,每个key的取值不能超过1000个。
如需要统计支付金额、使用时长等数值型的连续变量,请使用计算事件(不允许通过key-value结构来统计类似搜索关键词,网页链接等随机生成的字符串信息)。若需要提高指标上限,请申请APP企业认证,了解企业认证点击这里。
Java代码集成 首先要找到你的WebView对象,并做下面的初始化工作。
context 当前Activity引用
webview 当前的WebView对象
client WebChromeClient实例,如果开发者实现了自己的WebChromeClient,那么请传入这个实例
context 当前Activity引用
webview 当前的WebView对象
集成了上面的代码后,我们将会监听友盟的 js 代码调用。
js 代码集成在网页端,请添加如下的 js 代码:
这里面提供了两个js接口,分别用来统计自定义事件和K-V对形式的KV事件,并且和Java接口有如下的映射:
示例:
实现原理:
如您所见,我们提供的 js 接口,最后都会调用一个 prompt(…) 方法, 然后我们通过拦截 prompt 接口的事件,得到 js 代码中的参数,然后再映射到 Java 代码上的指定方法。所以我们在第一步初始化的时候,实现了自己的WebChromeClient 然后覆盖其中的方法来完成 prompt 事件的拦截,如果您的代码中同样实现了自己的 WebChromeClient 请务必在初始化的时候,调用以下代码,并传入相应的 WebChromeClient 。
说明:
上面示例的完整代码可以在 example 程序的 assets/demo.html 文件夹下找到。对应的Java初始化代码可以在 com.umeng.example.analytics.AnalyticsHome.java 中找到。
SDK通过Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。 如不需要错误统计功能,可通过此方法关闭
如果开发者自己捕获了错误,需要上传到友盟服务器可以调用下面方法:
使用自定义错误,查看时请在错误列表页面选择【自定义错误】
错误统计的常见问题参见友盟开发者社区: 友盟错误分析常见问题汇总
在发生社交行为,比如分享了到新浪微博之后,调用这样一行代码:
会把分享信息发送到友盟服务器, 我们会通过这些信息创建社交行为报表。
相关参数说明: UMPlatformData:
- UMeida meida 平台枚举类型(必填)
- String user_id 用户的id(必填)
- String weiboId 微博id
- String name 用户姓名
- GENDER gender 用户性别
MobclickAgent.onKillProcess(Context context) 如果开发者调用 Process.kill 或者 System.exit 之类的方法杀死进程,请务必在此之前调用此方法,用来保存统计数据。
确认APPKEY已经正确的写入Androidmanifest.xml
确认所有的Activity中都调用了onResume和onPause方法
确认测试手机(或者模拟器)已成功连入网络
集成测试是通过收集和展示已注册测试设备发送的日志,来检验SDK集成有效性和完整性的一个服务。 所有由注册设备发送的应用日志将实时地进行展示,您可以方便地查看包括应用版本、渠道名称、自定义事件、页面访问情况等数据,提升集成与调试的工作效率。
注意:
使用集成测试之后,所有测试数据不会进入应用正式的统计后台,只能在 “管理–集成测试–实时日志” 里查看,您不必再担心因为测试而导致的数据污染问题,让数据更加真实有效的反应用户使用情况。
使用集成测试模式请先在程序入口处调用如下代码,打开调试模式:
使用集成测试请点击这里。
使用普通测试流程,请先在程序入口添加以下代码打开调试模式:
打开调试模式后,您可以在logcat中查看您的数据是否成功发送到友盟服务器,以及集成过程中的出错原因等,友盟相关log的tag是MobclickAgent。
A:集成测试与普通测试两者都需要添加代码MobclickAgent.setDebugMode( true ) 打开调试模式,但是集成测试需要添加测试设备,集成测试功能说明参见这里。集成测试隔离测试数据,普通的测试不区分测试数据与真实数据;集成测试的结果需在实时日志中查看,普通测试则是在友盟相关的log中查看。
多指标 | 多维度 | 丰富模型 |
---|---|---|
友盟统计的六个特点
1:应用趋势
清晰展现应用的新增用户、活跃用户、启动次数、版本分布、行业指标等数据,方便您从整体掌控应用的运营情况及增长动态。2:渠道分析
在哪里推广最有效?从哪里获取的用户最有价值?友盟统计渠道分析功能可以实时查看各渠道的新增用户、活跃用户、次日留存率等用户指标,通过数据对比评估不同渠道的用户质量和活跃程度,从而衡量推广效果。3:留存分析
您可以掌握每日(周/月)的新增用户在初次使用后一段时间内的留存率,留存率的高低一定程度上反映了产品和用户质量的好坏。4:行为分析
针对性地进行应用内的数据统计,了解用户的产品使用细节及行为特征,帮助您寻找产品改进的突破点,评估产品优化的效果。5:用户属性
用户的基本属性和行为特征,帮助您全面了解用户。6:错误分析
收集并归类崩溃日志,提供错误管理及分析工具,帮助开发者更好的解决问题,从而提高应用的稳定性,改善应用质量。详细的集成步骤(8个方面)
1:集成准备
1.1 获得Appkey
1.1.1 FAQ
Q:应用的安卓版和IOS版能否共用一个appkeyA:不同平台的应用禁止使用相同的Appkey,需要分开注册。
Q:注册应用时,提示“应用名称已存在”
A:友盟后台的应用名与实际应用名和包名无关,建议命名为“应用名+平台(IOS/Android)”。
1.2 下载SDK
1.3 导入SDK
1.3.2 使用Android Studio导入SDK
dependencies { compile 'com.umeng.analytics:analytics:latest.integration' }
如果无法正常集成请添加如下代码 :
allprojects { repositories { mavenCentral() } }
2. 基本功能集成
2.1 新增场景类型设置接口
场景类型设置接口。MobclickAgent.setScenarioType(Context context, EScenarioType etype)
etype是官方场景,有如下场景:
EScenarioType. E_UM_NORMAL 普通统计场景类型 EScenarioType. E_UM_GAME 游戏场景类型 EScenarioType. E_UM_ANALYTICS_OEM 统计盒子场景类型 EScenarioType. E_UM_GAME_OEM 游戏盒子场景类型
2.1.1 UTDID相关
为防止冲突UTDID包单独提供,如果需要请导入UTDID包(友盟统计的jar包和支付宝的jar包冲突)2.2 配置Appkey
2.2.1 XML配置Appkey
manifest的配置主要包括添加权限,以下权限缺一不可,填写Appkey和填写渠道id三部分,代码示例如下:<manifest……> <uses-sdk android:minSdkVersion="4"></uses-sdk> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application ……> …… <activity ……/> <meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> </application> </manifest>
andriod 6.0之后,设备信息部分获取有所变动,请参考官网:https://developer.android.com/training/permissions/requesting.html
小技巧:当xml中的targetSdkVersion=x(x<23)时候, 可以正常获取信息(相当于跳过了6.0权限检查)
2.2.2 权限说明
权限 | 用途 |
---|---|
ACCESS_NETWORK_STATE(必须) | 检测联网方式,区分用户设备使用的是2G、3G或是WiFi |
READ_PHONE_STATE(必须) | 获取用户设备的IMEI,通过IMEI和mac来唯一的标识用户(仅对于手机用户)。 |
ACCESS_WIFI_STATE(必须) | 获取用户设备的mac地址,在平板设备上,无法通过imei标示设备,我们会将mac地址作为用户的唯一标识 |
READ_PHONE_STATE(必须) | 允许应用程序联网,以便向我们的服务器端发送数据。 |
2.2.3 填写appkey
将 中的YOUR_APP_KEY 替换为您在友盟后台申请的应用Appkey(Appkey可在统计后台的 统计分析->设置->应用信息 页面查看),其他部分均不需改动。2.2.4 channel填写
将<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
中的Channel ID 替换为您应用的推广渠道名称,channel id自定义。
例如在豌豆荚渠道推广此包,代码示例:
<meta-data android:value="Wandoujia" android:name="UMENG_CHANNEL"/>
渠道命名规范
1.可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
2.首尾字符不可以为空格
3.不要使用纯数字作为渠道ID
4.最多256个字符
5.”unknown” 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名
在您查看数据时,渠道会作为一个数据细分的维度。
非常重要:每台设备仅记录首次安装激活的渠道,如果该设备再次安装其他渠道包,则数据仍会被记录在初始的安装渠道上(这一点就有点坑爹了)。 所以在测试不同的渠道时,请使用不同的设备来分别测试。也可使用集成测试功能进行测试,了解更多集成测试请点击这里 。
2.2.5 在代码中配置Appkey和Channel
如果希望在代码中配置Appkey、Channel、Token(Dplus)等信息,请在程序入口处调用如下方法:MobclickAgent. startWithConfigure(UMAnalyticsConfig config)
UMAnalyticsConfig初始化参数类,提供多参数构造方式:
UMAnalyticsConfig(Context context, String appkey, String channelId) UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType) UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType,Boolean isCrashEnable)
构造意义:
- String appkey:官方申请的Appkey
- String channel: 渠道号
- EScenarioType eType: 场景模式,包含统计、游戏、统计盒子、游戏盒子
- Boolean isCrashEnable: 可选初始化. 是否开启crash模式
2.2.6 FAQ
如何删除不需要的渠道?A:目前不支持删除渠道,但可以隐藏,请在 设置–渠道 里隐藏渠道
渠道统计使用中的问题请参见友盟开发者社区: 友盟渠道统计使用的那些事儿
2.2.7 version标识
以SDk打包时的VersionName (Android中的版本名称,大众所理解的版本号)作为应用程序的版本标识。2.2.8 FAQ
Q:在版本分布中没有看到应用相应的版本A:请查看设置–版本–已隐藏版本列表,是否隐藏了该版本。
2.3 session的统计(session中文名称会话,但是这里为什么叫session统计呢?不明白)
在每个Activity的onResume方法中调用MobclickAgent.onResume(Context) ,
onPause方法中调用
MobclickAgent.onPause(Context)
public void onResume() { super.onResume(); MobclickAgent.onResume(this);//在这里调用 } public void onPause() { super.onPause(); MobclickAgent.onPause(this);//在这里调用 }
确保在所有的Activity中都调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,这两个调用将不会阻塞应用程序的主线程,也不会影响应用程序的性能。
注意 如果您的Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加onPause和onResume方法,否则会造成重复统计,导致启动次数异常增高。(eg.使用TabHost、TabActivity、ActivityGroup时)。(一般项目开发都有父类Activity,所以只在父类Activity中添加这两个方法调用就可以了)
当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:
MobclickAgent.setSessionContinueMillis(long interval)
来自定义这个间隔(参数单位为毫秒)。
- 如果开发者调用Process.kill或者System.exit之类的方法杀死进程,请务必在此之前调用
MobclickAgent.onKillProcess(Context context)
方法,用来保存统计数据。
session统计的相关问题请参见友盟开发者社区: 启动次数的统计原理, 单次使用时长的统计原理
至此,基本功能集成已经结束。**
非常重要:必须调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。
2.4 账号的统计(可以在登陆的地方调用这个方法来统计手机号码登陆和第三方登陆的用户信息)
友盟在统计用户时以设备为标准,如果需要统计应用自身的账号(需使用5.6.1及以上版本SDK),请使用以下接口:public static void onProfileSignIn(String ID) ; public static void onProfileSignIn(String Provider, String ID) ;
ID:用户账号ID,长度小于64字节
Provider:账号来源。如果用户通过第三方账号登陆,可以调用此接口进行统计。支持自定义,不能以下划线”_”开头,使用大写字母和数字标识,长度小于32 字节; 如果是上市公司,建议使用股票代码。
public static void onProfileSignOff();
账号登出时需调用此接口,调用之后不再发送账号相关内容。
当用户使用第三方账号(如新浪微博)登录时,可以这样统计:
MobclickAgent.onProfileSignIn("WB","userID");
2.4.1 启动账号统计
集成账号统计功能后,请到我的产品-设置-应用信息,选择启动使用账号统计报表,如下图如果您集成了新版SDK的账号接口,可以通过启动账号统计开关,来开启账号报表的展现。账号统计报表开关仅作用于报表的展现,不影响数据的计算。您可以根据实际的需要来启动或者暂停该功能。==集成此功能的第二天才能在后台报表看见账号的数据==。可在下图所示位置查看
2.5 页面的统计(这个才是统计的重点部分)
页面统计集成正确,才能够获取正确的页面访问路径、访问深度(PV)的数据。页面访问路径的数据为全量统计。若您希望查看测试数据,请使用 集成测试 ,了解更多集成测试请 点击这里 。
☺ 页面统计的常见问题参见友盟开发者社区: 页面访问路径中你需要了解的知识点 ,页面访问路径常见问题详解
2.5.1 只由Activity构成的应用
==如果您已经完成2==.3步骤之前的代码添加,那么SDK已默认统计了每个Activity的跳转路径。页面统计不需要再添加其他代码。2.5.2 包含Activity、Fragment或View的应用(一定会有一些Activity包含好几个Fragment的)
统计应用中包含Fragment的情况比较复杂,首先要明确一些概念。MobclickAgent.onResume() 和MobclickAgent.onPause() 方法是用来统计应用时长的(也就是Session时长,当然还包括一些其他功能)
2.MobclickAgent.onPageStart() 和MobclickAgent.onPageEnd() 方法是用来统计页面跳转的
在仅有Activity的应用中,SDK 自动帮助开发者调用了 2 中的方法,并把Activity 类名作为页面名称统计。但是在包含fragment的程序中我们希望统计更详细的页面,所以需要自己调用方法做更详细的统计。
首先,需要在程序入口(应该是Application)处,调用
MobclickAgent.openActivityDurationTrack(false)
禁止默认的页面统计方式,这样将不会再自动统计Activity。
然后需要手动添加以下代码:
使用 MobclickAgent.onResume 和 MobclickAgent.onPause 方法统计时长, 这和基本统计中的情况一样(针对Activity)
使用 MobclickAgent.onPageStart 和 MobclickAgent.onPageEnd 方法统计页面(针对页面,页面可能是Activity 也可能是Fragment或View)
如果页面是直接由Activity实现的,统计代码大约是这样:
public void onResume() { super.onResume(); MobclickAgent.onPageStart("SplashScreen"); //统计页面(仅有Activity的应用中SDK自动调用,不需要单独写。"SplashScreen"为页面名称,可自定义) MobclickAgent.onResume(this); //统计时长 } public void onPause() { super.onPause(); MobclickAgent.onPageEnd("SplashScreen"); // (仅有Activity的应用中SDK自动调用,不需要单独写)保证 onPageEnd 在onPause 之前调用,因为 onPause 中会保存信息。"SplashScreen"为页面名称,可自定义 MobclickAgent.onPause(this); }
如果页面是使用FragmentActivity + Fragment实现的,需要在 FragmentActivity 中统计时长:
public void onResume() { super.onResume(); MobclickAgent.onResume(this); //统计时长 } public void onPause() { super.onPause(); MobclickAgent.onPause(this); }
并在其包含的 Fragment 中统计页面:
public void onResume() { super.onResume(); MobclickAgent.onPageStart("MainScreen"); //统计页面,"MainScreen"为页面名称,可自定义 } public void onPause() { super.onPause(); MobclickAgent.onPageEnd("MainScreen"); }
注意:这些方法的调用,需要保证线性不交叉,每个 onResume 都对应一个 onPause ,每个 Start 都有一个 End 配对。这样才能保证每个页面统计的正确,关于页面统计API的最佳实践说明见这里 。
2.6 发送策略(选择什么时候发送数据???)
发送策略设定了用户产生的数据发送回友盟服务器的频率。Android平台的数据发送策略有两种方式:
启动时发送:新增、活跃、启动次数等数据在APP本次打开时即刻发送,使用时长、自定义事件、错误统计等在使用过程中产生的所有消息数据都在下次启动应用时发送。如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。
按间隔发送:按特定间隔发送数据,间隔时长介于==90秒与1天之间==。新增、活跃、启动次数等数据在APP本次打开时即刻发送,使用时长、自定义事件、错误统计等在使用过程中产生的所有数据都按间隔发送,如果应用程序启动时处在不联网状态,那么消息将会缓存在本地,下次再尝试发送。
2.6.1 发送策略设置方法
您可以在后台 统计分析->设置->发送策略 页面自定义发送间隔。具体如下图:点击发送策略之后,可以看到设置页面
注意 :
(1)在没有获取到在线配置时,默认使用启动时发送的策略。
(2)在打开debug调试模式或者使用集成测试时,不受发送策略控制。
2.7 日志加密设置(这个一般没必要去设置)
/** 设置是否对日志信息进行加密, 默认false(不加密). */ AnalyticsConfig.enableEncrypt(boolean enable);//6.0.0版本以前 MobclickAgent.enableEncrypt(boolean enable);//6.0.0版本及以后
如果enable为true,SDK会对日志进行加密。加密模式可以有效防止网络攻击,提高数据安全性。
如果enable为false,SDK将按照非加密的方式来传输日志。
如果您没有设置加密模式,SDK的加密模式为false(不加密)。(默认不加密)
2.8 代码混淆
如果您的应用使用了混淆, 请添加-keepclassmembers class * { public <init> (org.json.JSONObject); }
这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示”NoSuchMethod”错误。
另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
-keep public class [您的应用包名].R$*{ public static final int *; }
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
3. 自定义事件的统计(这个算是统计的重点部分)
自定义事件可以实现在应用程序中埋点来统计用户的点击行为。自定义事件目前包括“计数事件”和“计算事件”,二者的区别以及详细说明请点击这里。☺ 自定义事件使用中的问题请参见友盟开发者社区: 自定义事件常见问题,关于自定义事件的那些事儿
3.1 自定义事件字段说明
event id :自定义事件idkey :自定义事件下的参数
value :自定义事件参数下的参数值
3.2 使用自定义事件的依赖条件
使用自定义事件功能请先登陆友盟官网 , 在 “统计分析->设置->事件” (子账户由于权限限制可能无法看到“设置”选项,请联系主帐号开通权限。)页面中添加相应的事件id(事件id可用英文或数字,不要使用中文和特殊字符且不能使用英文句号“.”您可以使用下划线“_”),然后服务器才会对相应的事件请求进行处理。自定义事件的代码需要放在Activity里的onResume–onPause之间,请在友盟初始化之后调用事件,不支持在service中统计。
个人发现:上面所说的自定义事件包括计数和计时时间,需要把程序添加到onResume–onPause,但自己测试的时候发现,计数时间不需要添加到onResume–onPause之间就可以统计到相应的次数。
3.3 计数事件(计数事件最简单)
使用计数事件需要在后台添加事件时选择“计数事件”。3.3.1 统计发生次数
在您希望跟踪的代码部分,调用如下方法:MobclickAgent.onEvent(Context context, String eventId);
context 指当前的Activity
eventId 为当前统计的事件ID。
示例:统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用
MobclickAgent.onEvent(mContext,"Forward");
3.3.2 统计点击行为各属性被触发的次数
考虑事件在不同属性上的取值,可以调用如下方法:MobclickAgent.onEvent(Context context, String eventId, HashMap map);
map 为当前事件的属性和取值(Key-Value键值对)。
示例:统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
HashMap<String,String> map = new HashMap<String,String>(); map.put("type","book"); map.put("quantity","3"); MobclickAgent.onEvent(mContext, "purchase", map);
3.4 计算事件
使用计算事件需要在后台添加事件时选择“计算事件”。统计一个数值类型的连续变量(该变量必须为整数),用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等,可以调用如下方法:
MobclickAgent.onEventValue(Context context, String id, Map
int duration = 12000; //开发者需要自己计算音乐播放时长 Map<String, String> map_value = new HashMap<String, String>(); map_value.put("type" , "popular" ); map_value.put("artist" , "JJLin" ); MobclickAgent.onEventValue(this, "music" , map_value, duration);
上面方法在Android统计分析V5.2.2之后(>=)才提供,之前的版本可以通过下面的方式封装计算事件:
public static void onEvent(Context context, String id, HashMap<String,String> m, long value){ m.put("__ct__", String.valueOf(value)); MobclickAgent.onEvent(context, id, m); }
注意:onEventBegin(…),onEventEnd(…)以及onEventDuration(…)后续不再支持,不建议使用。
- 如需统计使用时长,开发者需要自己上传时长数据(如示例中的duration所示),时长数据会在计算事件的数值型部分展示;
- 如果使用了onEventBegin(…),onEventEnd(…)以及onEventDuration(…)方法,时长数据会在计算事件的字符串型中显示。
如图:
使用了onEventBegin(…),onEventEnd(…)以及onEventDuration(…)方法,时长数据会显示在【消息时长】选项中,为了兼容老用户,线上仍保留这个选项,此方法已不建议使用。
如图:
开发者使用计算事件自己上传时长数据(如示例中的duration所示),时长数据会在计算事件的数值型部分展示:
3.4.2 统计点击次数及各属性触发次数(==计算事件还能完成像计数事件一样的功能==)
计算事件除能够统计数值型的参数外还具有计数事件的所有功能,详细说明。3.5 结构化事件
结构化事件是在自定义事件基础上升级和完善得到的新功能,具有更高级和先进的结构设计,用于追踪用户行为、记录行为发生的具体细节。调用方法如下:public static void onEvent(Context context, List keyPath, int value, String label){agent.onEvent(context, keyPath, value, label); }
@param context:当前Activity
@param keyPath:最大8个
@param value:数值参数
@param label:事件标签,事件的一个属性说明(一期只做采样不做计算,二期会对label进行计算)使用结构化事件前,请先到友盟U-App管理后台的设置->结构化事件中添加相应的事件ID
结构化事件介绍:http://dev.umeng.com/analytics/reports/usage#3
3.6 注意事项
event id 不能使用特殊字符,不建议使用中文,且长度不能超过128个字节;map中的key和value 都不能使用特殊字符,key 不能超过128个字节,value 不能超过256个字节。id, ts, du是保留字段,不能作为event id及key的名称。==每个应用至多添加500个自定义事件==,每个event 的 key不能超过10个,每个key的取值不能超过1000个。
如需要统计支付金额、使用时长等数值型的连续变量,请使用计算事件(不允许通过key-value结构来统计类似搜索关键词,网页链接等随机生成的字符串信息)。若需要提高指标上限,请申请APP企业认证,了解企业认证点击这里。
3.7 在webview中统计自定义事件
如果你的页面中使用了WebView 嵌入HTML,js 的代码,并且希望统计HTML中的点击事件,比如点击了某个链接的次数, 这时你需要阅读下面的文档,通过友盟的 js 接口来统计相关的事件。注意如果你的HTML是运行在浏览器的,那么还 是无法统计的,下文仅针对使用WebView 加载 网页的情况。Java代码集成 首先要找到你的WebView对象,并做下面的初始化工作。
WebView webview = (WebView) findViewById(R.id.webview); new MobclickAgentJSInterface(Context, webview); public MobclickAgentJSInterface(Context context, WebView webview, WebChromeClient client)
context 当前Activity引用
webview 当前的WebView对象
client WebChromeClient实例,如果开发者实现了自己的WebChromeClient,那么请传入这个实例
public MobclickAgentJSInterface(Context context, WebView webview)
context 当前Activity引用
webview 当前的WebView对象
集成了上面的代码后,我们将会监听友盟的 js 代码调用。
js 代码集成在网页端,请添加如下的 js 代码:
<script type="text/javascript"> function onEvent(tag, label, duration) { prompt("event", JSON.stringify({tag:tag,label:label, duration:duration})); } function onKVEvent(tag, map, duration) { map.id = tag; map.duration = duration; prompt("ekv", JSON.stringify( map )); } </script>
这里面提供了两个js接口,分别用来统计自定义事件和K-V对形式的KV事件,并且和Java接口有如下的映射:
onEvent(tag) -> MobclickAgent.onEvent(Context context, String tag); //tag 传入字符串 onEvent(tag, label)-> MobclickAgent.onEvent(Context context, String tag, String label); // tag ,label 传入字符串 onEvent(tag, '', du) -> MobclickAgent.onEvent(Context context, long duration); // tag 传入字符串, 第二个变量 传入空字符串, du 传入 数值类型 onEvent(tag, label, du) -> MobclickAgent.onEvent(Context context, String tag, String label, long du); // tag, label 传入字符串, du 传入数值类型 onKVEvent(id, {} ) -> MobclickAgent.onEvent(Context context, HashMap map); // id 传入字符串, 第二个参数传入 js 对象eg:{'item':'gun','type':'weapon'} onKVEvent(id, {} , du) -> MobclickAgent.onEvent(Context context, HashMap map, long du); // id 传入字符串, 第二个参数传入 js 对象eg:{'item':'gun','type':'weapon'}, du 传入 数值类型
示例:
<a onClick="onEvent('click')"> SimpleEvent</a> <a onClick="onEvent('click','button')"> EventWithLabel </a> <a onClick="onEvent('play','music',123)"> EventWithLabelAndDuration </a> <a onClick="onEvent('play','',123)"> EventWithDuration </a> <a onClick="onKVEvent('buy',{'item':'gun'})"> KVEvent </a> <a onClick="onKVEvent('play',{'music':'blue'}, 123)"> KVEventWithDuration </a>
实现原理:
如您所见,我们提供的 js 接口,最后都会调用一个 prompt(…) 方法, 然后我们通过拦截 prompt 接口的事件,得到 js 代码中的参数,然后再映射到 Java 代码上的指定方法。所以我们在第一步初始化的时候,实现了自己的WebChromeClient 然后覆盖其中的方法来完成 prompt 事件的拦截,如果您的代码中同样实现了自己的 WebChromeClient 请务必在初始化的时候,调用以下代码,并传入相应的 WebChromeClient 。
public *MobclickAgentJSInterface*(Context context, WebView webview, WebChromeClient client)
说明:
上面示例的完整代码可以在 example 程序的 assets/demo.html 文件夹下找到。对应的Java初始化代码可以在 com.umeng.example.analytics.AnalyticsHome.java 中找到。
4. 错误统计(默认集成,可以关闭)
Android统计SDK从V4.6版本开始内建错误统计,不需要开发者再手动集成。SDK通过Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。 如不需要错误统计功能,可通过此方法关闭
MobclickAgent.setCatchUncaughtExceptions(false);
如果开发者自己捕获了错误,需要上传到友盟服务器可以调用下面方法:
public static void reportError(Context context, String error) //或 public static void reportError(Context context, Throwable e)
使用自定义错误,查看时请在错误列表页面选择【自定义错误】
错误统计的常见问题参见友盟开发者社区: 友盟错误分析常见问题汇总
5. 社交统计
针对社交行为的垂直统计,可以非常详尽地统计应用中发生的各种社交行为。 只需要调用一行代码,便可享用到丰富的社交行为和社交用户分析报表。在发生社交行为,比如分享了到新浪微博之后,调用这样一行代码:
UMPlatformData platform = new UMPlatformData(UMedia.SINA_WEIBO, "user_id"); platform.setGender(GENDER.MALE); //optional platform.setWeiboId("weiboId"); //optional MobclickAgent.onSocialEvent(this, platform);
会把分享信息发送到友盟服务器, 我们会通过这些信息创建社交行为报表。
相关参数说明: UMPlatformData:
- UMeida meida 平台枚举类型(必填)
- String user_id 用户的id(必填)
- String weiboId 微博id
- String name 用户姓名
- GENDER gender 用户性别
6. 其他API
MobclickAgent.setOpenGLContext(GL10 gl) 设置openGL 信息,辅助统计GPU 信息MobclickAgent.onKillProcess(Context context) 如果开发者调用 Process.kill 或者 System.exit 之类的方法杀死进程,请务必在此之前调用此方法,用来保存统计数据。
- android6.0中采集mac方式变更,新增接口 public static void setCheckDevice(boolean enable) 该接口默认参数是true,即采集mac地址,但如果开发者需要在googleplay发布,考虑到审核风险,可以调用该接口,参数设置为 false 就不会采集mac地址。
7. 测试与调试
7.1 确认如下内容
确认所需的权限都已经添加:INTERNET, READPHONESTATE确认APPKEY已经正确的写入Androidmanifest.xml
确认所有的Activity中都调用了onResume和onPause方法
确认测试手机(或者模拟器)已成功连入网络
7.2 使用集成测试服务(推荐)
什么是集成测试?集成测试是通过收集和展示已注册测试设备发送的日志,来检验SDK集成有效性和完整性的一个服务。 所有由注册设备发送的应用日志将实时地进行展示,您可以方便地查看包括应用版本、渠道名称、自定义事件、页面访问情况等数据,提升集成与调试的工作效率。
注意:
使用集成测试之后,所有测试数据不会进入应用正式的统计后台,只能在 “管理–集成测试–实时日志” 里查看,您不必再担心因为测试而导致的数据污染问题,让数据更加真实有效的反应用户使用情况。
使用集成测试模式请先在程序入口处调用如下代码,打开调试模式:
MobclickAgent.setDebugMode( true );
使用集成测试请点击这里。
7.3 使用普通测试流程
如果您不使用集成测试服务来测试数据,那您可以通过普通测试流程查看测试数据。 使用普通测试流程,您的测试数据会与用户的真实使用数据同时处理,从而导致数据污染。使用普通测试流程,请先在程序入口添加以下代码打开调试模式:
MobclickAgent.setDebugMode( true );
打开调试模式后,您可以在logcat中查看您的数据是否成功发送到友盟服务器,以及集成过程中的出错原因等,友盟相关log的tag是MobclickAgent。
7.3.1 FAQ
Q:集成测试与普通测试的区别?A:集成测试与普通测试两者都需要添加代码MobclickAgent.setDebugMode( true ) 打开调试模式,但是集成测试需要添加测试设备,集成测试功能说明参见这里。集成测试隔离测试数据,普通的测试不区分测试数据与真实数据;集成测试的结果需在实时日志中查看,普通测试则是在友盟相关的log中查看。
8. 技术支持
为了能够尽快响应您的反馈,请提供您的appkey及logcat中的详细出错日志,您所提供的内容越详细越有助于我们帮您解决问题。常见问题请阅读友盟论坛中统计SDK常见问题索引。相关文章推荐
- 一步步开发自己的博客 番外篇(7、异步记录日志 和 文章阅读量统计)
- 记录一次系统调用慢的 分析过程
- android6.0系统 PowerManager深入分析(非常详细) << 推荐阅读
- Hive map阶段优化之一次详细的优化分析过程
- Java虚拟机原理分析之Win10下VS2017编译OpenJDK8与单步调试HotSpot VM过程详细记录
- 记录一次OOM分析过程
- 记录一次统计首页MYSQL非常慢的解决过程
- 记录一次redis数据库搭建过程并详细说明配置
- Java虚拟机原理分析之Win7下VS2010编译OpenJDK8与单步调试HotSpot VM过程详细记录
- 记录一次bug解决过程:git深入学习和JDK8新特性
- 详细记录一下JAVA应用程序服务出现内存溢出的利用MAT分析过程
- 一次工作记录,写一遍为了更好地记忆(有用的内容都是转的,自己写的只是过程)
- 记录一次http切换成https,并修改域名过程的坑自己的经历
- 让我们一起来对VSTS扩展开发吧------制作自己的VSTS模版----第五节 分析过程模版的定义文件
- 详细的万象锁定界面制作全过程附工具正文分析错误
- uClinux 启动过程详细分析(二)
- 一次SQL优化分析的全过程
- 记录一下自己学习程序的过程
- Linux系统开机过程详细分析
- uClinux 启动过程详细分析