仅代表当前个人使用友盟统计成功后的笔记归纳,具体集成方式与解决方法,请根据Umeng文档逐步校验 !
注:此文起始写于2018年,但于2019春节后进行88个埋点之后,发现部分地方存在可改进之处,故此再次进行优化
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代码中进行初始化
<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,现在搬到这里 > <
统计目的我认为主要在于实时掌握用户数据,便于产品运营 ~
新增用户
新增用户是第一次下载并启动的用户 以设备为准
活跃用户
启动过应用的用户(去重),启动过一次的用户即视为活跃用户,包括新用户与老用户
启动次数
打开应用视为启动。完全退出或后台运行超过30s后再次进入应用,视为一次新启动。
开发过程中可以通过setSessionContinueMills来自定义两次启动的间隔,默认30s
版本分布
现有版本下每个版本的用户使用情况
行业数据
留存用户
某段时间内的新增用户(活跃用户),经过一段时间后,又继续使用应用的被认作是留存用户;这部分用户占当时新增用户(活跃用户)的比例即是留存率。例如,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之类的(渠道包与渠道统计相对应)
//这里是方便Umeng的渠道统计,进行配置 UMENG_CHANNEL 不可改变不然无法识别
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
第一种方式:
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会自行识别渠道进行统计 ~
移动端代码注册
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;
}
必须非常注意!!!
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());
}
借鉴文章 5分钟实现Android友盟统计的集成与使用