仅代表当前个人使用友盟统计成功后的笔记归纳,具体集成方式与解决方法,请根据Umeng文档逐步校验 !
注:此文起始写于2018年,但于2019春节后进行88个埋点之后,发现部分地方存在可改进之处,故此再次进行优化
Umeng - 官方渠道
Umeng - 友情帮助链接
2018年
//Umeng Android Sdk
地址 :http://mobile.umeng.com/custom_sdk
//Umeng Android Sdk 7.4.1集成过程 外部配置
地址 :http://dev.umeng.com/sdk_integate/android_sdk/android_common_guide
//Umeng Android Sdk 7.4.1集成过程 APP统计内部配置
地址 :http://dev.umeng.com/sdk_integate/android_sdk/analytics_doc
2019年
//Umeng Sdk 下载
https://developer.umeng.com/sdk?spm=a311a.9588098.0.0
//Umeng U-App>基础分析>功能使用
https://developer.umeng.com/docs/67953/detail/68131#h1-u81EAu5B9Au4E49u4E8Bu4EF62
//FAQ Umeng官方提供的集成中可能遇到的错误问题(包含解答)
https://developer.umeng.com/docs/66632/cate/66650
//集成测试 - 测试设备
https://mobile.umeng.com/platform/integration/device
基础配置
常规配置
1.build (app)
/**
*友盟统计 版本号根据友盟官网当时给出版本进行设置
*/
compile 'com.umeng.sdk:common:1.4.1'
compile 'com.umeng.sdk:analytics:7.4.1'
2.Android Manifest (加入配置)
- 加入权限
<!-- 必须的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- 推荐的权限 -->
<!-- 添加如下权限,以便使用更多的第三方SDK和更精准的统计数据 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 清单文件下的application内部添加配置参数
//这里可以在清单文件配置,也可以动态的在我们自己的application代码中进行初始化
<meta-data android:value="YOUR_APP_KEY" android:name="自己Umeng平台的appkey"/>
//这个官方说是兼容老版本,同时渠道统计会用到这个,不要修改内部值
<meta-data android:name="UMENG_CHANNEL" android:value="Channel ID"/>
项目配置(自我项目-笔记)
我自己项目中的配置(下面有多渠道区分 - 统计)
步骤1:Android Manifests
<application
android:name=".base.GarageApp"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
//主要是这里的代码 - 用于渠道统计
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
</application>
步骤2:build.gradle (app)
android {
productFlavors {
baidu {}
huawei {}
xiaomi {}
vivo {}
oppo {}
sanxing {}
yingyongbao {}
}
//分别进行打包
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
3.Application(OnCreate 生命周期内加入Umeng初始化方法)
/**这里要注意:如果在清单文件已经配置了初始化信息,
*这里可以少去初始化的代码,如果俩边都配置了
*那么会优先代码中的配置!!!所以这里大家务必注意!*/
//初始化
UMConfigure.init(garageApp,"自己Umeng平台的appkey","Umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
//开启Log
UMConfigure.setLogEnabled(true);
//打开调试模式
MobclickAgent.setDebugMode( true );
/**
*普通统计场景类型:EScenarioType.E_UM_NORMAL
*游戏场景类型:EScenarioType.E_UM_GAME
*/设置统计场景类型
MobclickAgent.setScenarioType(garageApp, MobclickAgent.EScenarioType.E_UM_NORMAL);
//true打开 ,false为关闭
//禁止默认的页面统计方式 (一般不用设置,因为默认是进行统计的)
//MobclickAgent.openActivityDurationTrack(true);
//错误收集(默认已经配置,而且已经打开)
//MobclickAgent.setCatchUncaughtExceptions(true);
统计概念
此处初写于2019年3月5日,于2020年6月29日整合在此处
此处是在公司内部分享会上我做的一篇PPT,现在搬到这里 > <
统计目的我认为主要在于实时掌握用户数据,便于产品运营 ~
统计平台
- 友盟统计 (友盟官网)
- 友盟SDK集成与埋点
- 友盟+ U-App 基础看板
- 极光统计 (极光官网)
配置流程
统计范围
用户分析
-
新增用户
新增用户是第一次下载并启动的用户 以设备为准
-
活跃用户
启动过应用的用户(去重),启动过一次的用户即视为活跃用户,包括新用户与老用户
-
启动次数
打开应用视为启动。完全退出或后台运行超过30s后再次进入应用,视为一次新启动。
开发过程中可以通过setSessionContinueMills来自定义两次启动的间隔,默认30s -
版本分布
现有版本下每个版本的用户使用情况
-
行业数据
选取app的行业范围,不然无法进行统计
留存分析
-
留存用户
某段时间内的新增用户(活跃用户),经过一段时间后,又继续使用应用的被认作是留存用户;这部分用户占当时新增用户(活跃用户)的比例即是留存率。例如,5月份新增用户200,这200人在6月份启动过应用的有100人,7月份启动过应用的有80人,8月份启动过应用的有50人;则5月新增用户一个月后的留存率是50%,两个月后的留存率是40%,三个月后的留存率是25%。注:“活跃用户留存”仅支持查看2018年4月1日之后的留存情况
-
用户新鲜度
某日的活跃用户来源于当天新增用户、1天前新增用户…30天前新增用户、30+天前新增用户。其中当天新增用户与您在当日的推广行为相关,n天前新增用户与n日前的新增用户和n日留存率有关
-
用户活跃度
活跃1天的用户,表示这个用户在过去15天中仅有1天启动;
活跃2天的用户,表示这个用户在过去15天中仅有2天启动;
…
活跃15天的用户,表示这个用户在过去15天中15天都启动了
活跃天数越多的用户,其活跃程度越高,对APP的价值越大
渠道分析
-
时段详情
每个时间的用户用户活跃情况
-
渠道列表
多渠道打包之后uMeng会进行渠道统计
用户参与度
-
使用时长
一次启动的使用时长(针对整个app)
-
使用频率
启动应用次数(分日、周统计)
-
访问页面
比较鸡肋,页面重复统计,如页面A\B\A重复统计
-
使用间隔
可以结合活跃用户,进行活跃统计,主要统计用户俩次使用app的间隔时间
功能使用
-
页面访问路径
页面访问路径描述的是用户从打开到离开应用整个过程中每一步骤的页面访问、跳转情况。页面访问路径是全量统计。如果您在Android应用中使用了Fragment页面统计功能,这里的页面包括您指定统计的activity和Fragment。页面的高度表现该页面被访问的次数,同一页面在不同步骤中用相同的颜色进行展示。每一步骤中,页面节点按照访问次数大小从上往下排列,会显示每一步总的页面访问次数、占总访问次数比例以及前后两步之间的转化率。如果页面的总会话数达到50W上限,或者单版本会话数达到10W上限,会进行日志抽样处理。
-
自定义事件(埋点必备)
埋点的具体方式就在本文,可直接阅读本文实现埋点需求 ~
-
事件转化率
目标事件:整个事件转化率所关心的最终转化率的目标,是序列中最后一个事件
步骤数:从初始事件到目标事件经历的事件数
所选时段转化率:所选时段内,该事件序列的最终转化率
终端使用
-
设备终端
可以查看在指定时段(1天、7天、30天)内用户机型的分布情况,并可以进行版本、渠道和分群的交叉筛选。
筛选只展示昨日及之前的数据,启动次数指标只支持昨日之前的查询 -
网络及运营商
可以查看在指定时段(1天、7天、30天)内用户{{wayType}}的分布情况,并可以进行版本、渠道和分群的交叉筛选。
筛选只展示昨日及之前的数据,启动次数指标只支持昨日之前的查询 -
地域
可以查看在指定时段(1天、7天、30天)内用户省市的分布情况,并可以进行版本、渠道和分群的交叉筛选。
筛选只展示昨日及之前的数据,启动次数指标只支持昨日之前的查询。
如果当日用户在A省启动之后又在B省启动了,分地域查看数据时,此用户在A、B两省都会被算为活跃用户。(按总体查看数据时不受影响)
更新频率
- 实时更新
- 第二天更新
- 每周更新
- 按周期更新
- 特殊更新
更新表
多渠道区分 - 统计
如用户下载的市场是华为、小米、oppo之类的(渠道包与渠道统计相对应)
渠道分布
- AndroidMainfest(清单文件)中的application内添加
//这里是方便Umeng的渠道统计,进行配置 UMENG_CHANNEL 不可改变不然无法识别
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
- build(app)中,android内添加渠道名,这里要注意的是 如果是数字开头是不行的!需要添加下划线!这是俩种方式,可以使用uc的方式添加渠道,也可以使用现在的不直接声明的模式。个人介意第一种样式!
第一种方式:
productFlavors{
uc {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
}
baidu{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
}
第二种方式:
productFlavors{
default_channel{}
wandoujia{}
yingyongbao{}
xiaomi{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
渠道打包
声明渠道之后,可前往此处打出多渠道包 ~ 之后Umeng会自行识别渠道进行统计 ~
埋点统计
后台设置
-
已有的自定义事件查看
-
自定义事件添加流程
Step 1:
Step 2:
Step 3:
前台注册
移动端代码注册
App内事件埋点 (对应的事件下进行设置)
//eventId为已在后台注册自定义事件id
MobclickAgent.onEvent(MainActivity.this,"eventId");
对应的Activity、Fragment内添加对应需求代码
时常统计(Session时长 - 集成埋点的同时会自动统计时长)
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
统计跳转页面
public void onResume() {
super.onResume();
MobclickAgent.onPageStart("newOrderBtn");
}
public void onPause() {
super.onPause();
MobclickAgent.onPageEnd("newOrderBtn");
}
集成测试
使用环境 - 自我测试,绑定自己手机查看埋点效果
测试设备
- 测试设备 - 查看
- 测试设备 - 添加测试设备
- 设备识别信息获取的方法
老版本(sdk 7.4.1)
/**
* 测试
* */
public static String getDeviceInfo(Context context) {
try {
org.json.JSONObject json = new org.json.JSONObject();
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
String device_id = null;
if (checkPermission(context, Manifest.permission.READ_PHONE_STATE)) {
device_id = tm.getDeviceId();
}
String mac = null;
FileReader fstream = null;
try {
fstream = new FileReader("/sys/class/net/wlan0/address");
} catch (FileNotFoundException e) {
fstream = new FileReader("/sys/class/net/eth0/address");
}
BufferedReader in = null;
if (fstream != null) {
try {
in = new BufferedReader(fstream, 1024);
mac = in.readLine();
} catch (IOException e) {
} finally {
if (fstream != null) {
try {
fstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
json.put("mac", mac);
if (TextUtils.isEmpty(device_id)) {
device_id = mac;
}
if (TextUtils.isEmpty(device_id)) {
device_id = android.provider.Settings.Secure.getString(context.getContentResolver(),
android.provider.Settings.Secure.ANDROID_ID);
}
json.put("device_id", device_id);
return json.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
新版本(2019年的组件化获取方式 统计sdk 7.0.0以上)
/**
*此方法我在2019/2/21使用时, 数据返回格式与数据错误;
*可通过断点获取deviceInfo[0]与deviceInfo[1] 的值进行拼接,组成设备识别信息
* 样例 :{"device_id":"KVVVA17B24202090","mac":"1c:15:1f:74:0c:7c"}
*/
public static String[] getTestDeviceInfo(Context context){
String[] deviceInfo = new String[2];
try {
if(context != null){
deviceInfo[0] = DeviceConfig.getDeviceIdForGeneral(context);
deviceInfo[1] = DeviceConfig.getMac(context);
}
} catch (Exception e){
}
return deviceInfo;
}
实时日志、历史日志
必须非常注意!!!
- 只有测试设备绑定成功,才能收到日志信息
- 数据收集策略有俩种,一种是时间间隔控制 ;一种是app关闭重新启动; 这也意味着只有满足其中一种情况后Umeng才能收到我们统计的数据
- 测试设备的统计数据不算入自定义事件(防止污染数据)
- 当我们操作完app关闭之后,重启app,然后在Umeng后台查看实时数据内的自定义事件,如下图 (此刻Android是支持的,IOS还没有支持)
大功告成(老夫退了)
错误锦集
埋点未生效
- 检查后台是否注册此事件
- 检查代码中是否注册此事件
- 检查俩端自定义事件Id是否相同
- Activity、Fragment是否重写onResume()、onPause()内的方法,如下 (友情建议下文代码封装到BaseActivity、BaseFragment)
activity 版本 - -~
@Override
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
fragment 版本 - -~
@Override
public void onResume() {
super.onResume();
MobclickAgent.onResume(getActivity());
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPause(getActivity());
}
实时日志、历史日志(重复提出,烦请注意)
- 只有测试设备绑定成功,才能收到日志信息
- 数据收集策略有俩种,一种是时间间隔控制 ;一种是app关闭重新启动; 这也意味着只有满足其中一种情况后Umeng才能收到我们统计的数据
- 测试设备的统计数据不算入自定义事件(防止污染数据)
- 当我们操作完app关闭之后,重启app,然后在Umeng后台查看实时数据内的自定义事件,如下图 (此刻Android是支持的,IOS还没有支持)
埋点可能错误原因(由友盟客服和技术提出)
- 自定义事件默认退出动发送,请按照这个顺序测试 :启动应用-触发自定义事件-应用退到后台-打印log日志,观察log是否有event字段,如果自定义事件集成正确是可以看到这个字段的
- 发送策略问题,自定义事件数据默认退出发送
- 确认自定义事件参数传入合法。可参阅 事件参数FAQ
- 触发自定义事件后关闭应用超过30s后再重新启动应用,查看调试log中是否有ekv字段及相关事件ID。
- 是否在后台定义了事件ID。
- 自定义事件报表中“独立用户数”第二天展示前一天数据。
- 是否使用了集成测试,集成测试数据要在集成测试日志中查看。
- 网络延迟。
- 不要在service中使用自定义事件,这会造成活跃用户异常
- 打开debug模式则必须打包后才能有事件 亲 您可以按照这个顺序测试一下 :启动应用-触发自定义事件-关闭应用-40s后重新启动应用-打印log日志,观察log是否有ekv字段和相关事件ID,如果自定义事件集成无误是可以看到这个字段的。