Android开发-在Android项目里集成友盟统计SDK进行对移动APP统计的实现

前 言

友盟(Umeng),2010年4月在北京成立,是中国最专业、最有数据凝聚力的移动开发者服务平台。友盟以移动应用统计分析为产品起点,发展成为提供从基础设置搭建-开发-运营服务的整合服务平台,致力于为移动开发者提供专业的数据统计分析、开发和运营组件及推广服务。2013年10月推出“一站式“解决方案,服务包含移动应用统计分析以及细分行业的移动游戏统计分析、社会化分享组件、消息推送、自动更新、用户反馈、错误分析等产品。
友盟提供iOS、Android和Windows Phone等多平台服务。目前,国内主流开发者大多是友盟的用户,已有超34万计的移动应用从友盟服务中获益。
——来自百度百科

友盟对移动APP统计原理

  • 新增用户统计原理
    Android系统根据IMEI号+MAC地址标识设备(独立用户)的唯一性;iOS系统根据OpenUDID标识设备(用户)的唯一性;WP系统根据ANID标识设备(用户)的唯一性,用户联网启动应用之后才能统计到。

  • 友盟启动次数的统计原理
    在每个Activity的开始和结束时分别调用onResume和onPause方法.
    当一个onResume方法与上一个Activity的onPause方法相差30秒,标志新session的开始;当一个onPause方法发生后30秒内没有再触发任何一个Activity的onResume方法,标志该session结束。
    如果应用Crash, Android平台处理成onPause, 照例通过30秒规则来判断是否是session的终止.
    即Android平台一次完整的启动包括如下三种情况:
    1.从启动应用到关闭应用
    2.从启动应用到应用退至后台,且在后台运行时间超过30s
    3.启动应用后设备黑屏,黑屏时间超过30s
    符合以上三种情况的前提下,Android启动次数+1.

  • 友盟单次使用时长的统计原理
    app的单次使用时长=本次启动的结束时间减去本次启动的开始时间,即end_time减去start_time。
    如果在本次启动过程中,应用退到后台运行(例如启动应用的过程中接了个电话,接电话的时候应用会退到后台运行),后台运行时间不超过30s,则此时间会被计算到应用的单次使用时长中;后台运行时间超过30s,则视为本次使用结束,运行到后台的时间不会被计入单次使用时长中。

开发环境

Android Studio 3.1.2
JDK 1.8

开发前准备

集成【友盟+】SDK之前,您首先需要到 【友盟+】官网注册并且添加新应用,获得AppKey。(友盟官网
这里写图片描述

Android Studio集成模式

  • 添加统计SDK在maven中心库的线上依赖
    通过在Android Studio工程build.gradle配置脚本中添加maven线上依赖,导入最新版本组件化统计SDK。
注意:统计SDK必须依赖基础组件库。所以需要加入对应依赖: 
implementation 'com.umeng.sdk:common:latest.integration'
dependencies {
    ...
    implementation 'com.umeng.sdk:common:latest.integration'
    implementation'com.umeng.sdk:analytics:latest.integration'
}
  • 如果无法正常集成请添加如下配置:
allprojects {
    repositories {
            mavenCentral()     
    }
}
  • 在Android Studio 3.1及以上版本中添加maven依赖
    在Android Studio 3.1及以上版本开发环境下,指定引用最新版本依赖写法”latest.integration”可能导致下载库超时,此时需要指定具体版本号。
dependencies {
    ...
    implementation 'com.umeng.sdk:common:1.5.0'
    implementation  'com.umeng.sdk:analytics:7.5.0'
}

在AndroidManifest.xml清单文件里授权相应的权限

    <!-- 必须的权限 -->
    <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" />
  • 权限说明:
权限 用途
ACCESS_NETWORK_STATE(必须) 检测联网方式,区分用户设备使用的是2G、3G或是WiFi。
READ_PHONE_STATE(必须) 获取用户设备的IMEI,通过IMEI来唯一的标识用户。
ACCESS_WIFI_STATE(必须) 获取用户设备的mac地址,在平板设备或电视盒子上,无法通过IMEI标示设备,我们会将mac地址作为用户的唯一标识。
INTERNET(必须) 允许应用程序联网,以便向我们的服务器端发送数据。

初始化及通用接口

  • 添加初始化方法
    在项目工程的自定义application中的onCreate方法中添加以下两个方法之一。
    注意:一定要在主进程进行该项操作,如果您使用到PUSH,还需在推送进程(channel进程)同样进行该项操作`
  • 方法一:
/**
 - 初始化common库
 - 参数1:上下文,不能为空
 - 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
 - 参数3:Push推送业务的secret
*/
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b");
  • 注意:如果项目的Manifest文件中已经配置【友盟+】的AppKey和Channel,则使用该方法初始化,同时不必再次传入AppKey和Channel两个参数。
    参数1:上下文,必须的参数,不能为空。
    参数2:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机。
    参数3:Push推送业务的secret,需要集成Push功能时必须传入Push的secret,否则传空。
  • 方法二:
/**
 - 初始化common库
 - 参数1:上下文,不能为空
 - 参数2:【友盟+】 AppKey
 - 参数3:【友盟+】 Channel
 - 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
 - 参数5:Push推送业务的secret
*/
UMConfigure.init(this, "58edcfeb310c93091c000be2", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b");
  • 注意:
    参数1:上下文,必须的参数,不能为空。
    参数2:【友盟+】 AppKey,非必须参数,如果Manifest文件中已配置AppKey,该参数可以传空,则使用Manifest中配置的AppKey,否则该参数必须传入。
    参数3:【友盟+】 Channel,非必须参数,如果Manifest文件中已配置Channel,该参数可以传空,则使用Manifest中配置的Channel,否则该参数必须传入,Channel命名请详见Channel渠道命名规范。
    参数4:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机。
    参数5:Push推送业务的secret,需要集成Push功能时必须传入Push的secret,否则传空。
  • AndroidManifest清单配置文件方式初始化AppKey和channel
    为了兼容老版本的SDK,本版本中仍然支持Manifest配置文件方式设置AppKey和Channel,内容如下:
<manifest>
    <application ……>
        ……
        <meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> 
        <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> 
    </application>    
</manifest>
  • 完成上述步骤,【友盟+】产品的初始化就完成了,对于各组件产品的其它设置或高级功能请查看具体组件详细内容。
    注意:即使用户已经在项目AndroidManifest.xml清单配置中设置了AppKey和Channel, 新版组件化SDK还是要求必须在项目工程的自定义application中的onCreate方法中调用初始化函数UMConfigure.init,已经在AndroidManifest.xml清单配置中设置了AppKey和Channel参数的用户,初始化函数中AppKey和Channel参数可以传入null。
    Channel渠道的使用规范
    每台设备仅记录首次安装激活的渠道,在其他渠道再次安装不会重复计量。 所以在测试不同的渠道的时候,请使用不同的设备来分别测试不要改变’UMENG_CHANNEL’。
    Channel渠道的命名规范
    1.可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
    2.首尾字符不可以为空格。
    3.不要使用纯数字作为渠道ID。
    4.最多256个字符。
    5.”unknown” 及其各种大小写形式,作为【友盟+】保留的字段,不可以作为渠道名。

通用接口

  • 设置Log开关
    初始化时(一般在MainActivity主页面文件中初始化时,下同)可以通过该方法设置组件化的Log是否输出,默认关闭Log输出。
/**
 * 设置组件化的Log开关
 * 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(true);
  • 设置日志加密
    初始化时可以通过该方法设置日志加密。
/**
 * 设置日志加密
 * 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(true);
  • 如果参数为true,SDK会对日志进行加密。加密模式可以有效防止网络攻击,提高数据安全性。
    如果参数为false,SDK将按照非加密的方式来传输日志。
    如果您没有设置加密模式,SDK的加密模式为false(不加密)。

场景类型设置接口

MobclickAgent.setScenarioType(mContext, EScenarioType.E_UM_NORMAL);
参数 含义
(mContext 当前宿主进程的ApplicationContext上下文。
EScenarioType.E_UM_NORMAL EScenarioType.E_UM_NORMAL 普通统计场景,如果您在埋点过程中没有使用到U-Game统计接口,请使用普通统计场景。 EScenarioType.E_UM_GAME 游戏场景 ,如果您在埋点过程中需要使用到U-Game统计接口,则必须设置游戏场景,否则所有的U-Game统计接口不会生效。

Session启动、App使用时长等基础数据统计接口API

  • 在App中每个Activity的onResume方法中调用 MobclickAgent.onResume(context),onPause方法中调用 MobclickAgent.onPause(context)。
@Override
public void onResume() {
    super.onResume();
    MobclickAgent.onResume(this);
}

@Override
public void onPause() {
    super.onPause();
    MobclickAgent.onPause(this);
}
  • 注意:确保在所有的Activity中都调用 MobclickAgent.onResume() 和onPause()方法,这两个调用不会阻塞应用程序的主线程,也不会影响应用程序的性能。
    如果您的Activity之间有继承或者控制关系,请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计,导致启动次数异常增高。(例如:使用TabHost、TabActivity、ActivityGroup时)。
    当应用在后台运行超过30秒(默认)再回到前台,将被认为是两次独立的Session(启动),例如:用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。即被认为是两个独立的Session。

Session间隔时长设置接口(一般情况下不用修改此值)

// 将默认Session间隔时长改为1秒。
MobclickAgent.setSessionContinueMillis(1000);
  • Session统计的相关问题请参见【友盟+】开发者社区:启动次数的统计原理,单次使用时长的统计原理。
    至此,基本功能集成已经结束。
    非常重要: 必须确保在所有页面对应Activity中调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。

统计结果

这里写图片描述


猜你喜欢

转载自blog.csdn.net/fukaimei/article/details/80445893