资料:
获取APPKey:在编辑应用中看到:5ac59318b27b0a3b6c00030f
自动集成:
dependencies {
compile 'com.umeng.sdk:common:latest.integration'
compile 'com.umeng.sdk:analytics:latest.integration'
}
如果无法正常集成请添加如下配置:
allprojects {
repositories {
mavenCentral()
}
}
权限授予:
<manifest ……>
<uses-sdk android:minSdkVersion="8">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.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application ……>
初始化及通用接口:
/*
注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,也需要在App代码中调用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值,UMConfigure.init调用中appkey和channel参数请置为null)。
*/
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);
注意:
参数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,否则传空。
或者:
<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值,可以调用此版本初始化函数。
*/
UMConfigure.init(Context context, int deviceType, String pushSecret);
2.场景类型设置接口:
public static void setScenarioType(Context context, EScenarioType etype);
参数 | 含义 |
---|---|
context | 当前宿主进程的ApplicationContext上下文。 |
etype | EScenarioType.E_UM_NORMAL 普通统计场景,如果您在埋点过程中没有使用到U-Game统计接口,请使用普通统计场景。 EScenarioType.E_UM_GAME 游戏场景 ,如果您在埋点过程中需要使用到U-Game统计接口,则必须设置游戏场景,否则所有的U-Game统计接口不会生效。 |
示例:
java
MobclickAgent.setScenarioType(mContext, EScenarioType.E_UM_NORMAL);
3.设置secretkey
secretkey设置接口,防止AppKey被盗用,secretkey需要网站申请。申请方法见AppKey保护策略(Secret)介绍。
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之间有继承或者控制关系,请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计,导致启动次数异常增高。(例如:使用TabHost、TabActivity、ActivityGroup时)。
当应用在后台运行超过30秒(默认)再回到前台,将被认为是两次独立的session(启动),例如:用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。即被认为是两个独立的session。
session间隔时长设置接口(一般情况下不用修改此值 ):
// interval: 单位是毫秒,默认Session间隔时间是30秒
public static void setSessionContinueMillis(long interval);
参数 | 含义 |
---|---|
interval | 单位为毫秒,默认值为30000。 |
示例:
// 将默认Session间隔时长改为40秒。
MobclickAgent.setSessionContinueMillis(1000*40);
非常重要: 必须确保在所有页面对应Activity中调用 MobclickAgent.onResume() 和MobclickAgent.onPause()方法,才能够保证获取正确的新增用户、活跃用户、启动次数、使用时长等基本数据。
下载量–用户总数:
后台查看即可
每日用户活跃数–日活数:
后台查看即可
事件统计–APP业务活动分析:
统计SDK为用户提供了自定义事件的功能,用于追踪用户行为,记录行为发生的具体细节。 自定义事件目前包括”计数事件”和”计算事件”,二者的区别以及详细说明请 点击这里。
自定义事件字段说明
event id:自定义事件id。
key:自定义事件下的参数。
value:自定义事件参数下的参数值。
计数事件
1.使用计数事件需要在后台添加事件时选择”计数事件”。
2.在您希望跟踪的代码部分,调用如下方法:
public static void onEvent(Context context, String eventID);
public static void onEvent(Context context, String eventID, String label);
参数 | 含义 |
---|---|
context | 当前宿主进程的ApplicationContext上下文。 |
eventId | 为当前统计的事件ID。 |
label | 事件的标签属性。 |
示例:
统计微博应用中”转发”事件发生的次数,那么在转发的函数里调用
java
MobclickAgent.onEvent(mContext,"Forward");
MobclickAgent.onEvent(mContext, "Select", "Channel");
统计点击行为各属性被触发的次数
考虑事件在不同属性上的取值,可以调用如下方法:
public static void onEvent(Context context, String eventID, Map<String, String> map);
参数 | 含义 |
---|---|
context | 当前宿主进程的ApplicationContext上下文。 |
eventId | 为当前统计的事件ID。 |
map | 为当前事件的属性和取值(Key-Value键值对)。 |
示例:
统计电商应用中”购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
java
HashMap
map.put("type","book");map.put("quantity","3");
MobclickAgent.onEvent(mContext, "purchase", map);
计算事件
1.使用计算事件需要在后台添加事件时选择”计算事件”。
2.统计一个数值类型的连续变量(该变量必须为整数),用户每次触发的数值的分布情况,如事件持续时间、每次付款金额等,可以调用如下方法:
public static void onEventValue(Context context, String eventID, Map<String, String> map, int du);
参数 | 含义 |
---|---|
context | 当前宿主进程的ApplicationContext上下文。 |
eventID | 为当前统计的事件ID。 |
map | 为当前事件的属性和取值(Key-Value键值对)。 |
du | 当前事件的数值,取值范围是-2,147,483,648 到 +2,147,483,647 之间的有符号整数,即int 32类型,如果数据超出了该范围,会造成数据丢包,影响数据统计的准确性。 |
示例:
统计一次音乐播放,包括音乐类型,作者和播放时长,可以在音乐播放结束后这么调用:
java
int duration = 12000; //开发者需要自己计算音乐播放时长
Map
map_value.put("type" , "popular" );map_value.put("artist" , "JJLin" );
MobclickAgent.onEventValue(this, "music" , map_value, duration);
卸载量–用户流失数:
后台查看,留存分析
查bug和修复:后台错误分析
组件化统计SDK内建JVM层错误统计。SDK通过Thread.UncaughtExceptionHandler 捕获程序崩溃日志,并在程序下次启动时发送到服务器。
如不需要错误统计功能,可通过此方法关闭:
// isEnable: false-关闭错误统计功能;true-打开错误统计功能(默认打开)
public static void setCatchUncaughtExceptions(boolean isEnable)
参数 | 含义 |
---|---|
isEnable | 错误统计开关,false-关闭错误统计功能;true-打开错误统计功能(默认打开)。 |
如果开发者自己捕获了错误,需要手动上传到【友盟+】服务器可以调用下面方法:
java
public static void reportError(Context context, String error);
//或 public static void reportError(Context context, Throwable e);
参数 | 含义 |
---|---|
context | 当前宿主进程的ApplicationContext上下文。 |
error | 错误内容字符串。 |
e | 错误发生时抛出的异常对象。 |
示例:
java
MobclickAgent.reportError(mContext, "Parameter Error");
try {
// 抛出异常的代码
}
catch (Exception e) {
MobclickAgent.reportError(mContext, e);
}
使用自定义错误,查看时请在错误列表页面选择【自定义错误】。
特别注意:这点参考视频资料
如果使用了混淆,那么代码混淆后变量和方法名无法人为识别,很难知道是哪个方法出现了异常,所以在混淆的时候加上:
properties
-printmapping mapping.txt
如果您的应用使用了代码混淆,请添加如下配置,以避免【友盟+】SDK被错误混淆导致SDK不可用。
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理apk时,proguard可能会将R.java删除,如果遇到这个问题,请添加如下配置:
-keep public class [您的应用包名].R$*{
public static final int *;
}
映射文件mapping
方便异常上报的处理,如果不提交该文件,那么提交混淆后的代码异常,鬼知道源码的哪个方法出错了,该文件可以从后台上传,在混淆中加入:
-printmapping mapping.txt
注意:如果一时半会儿没有在output中出现mapping.txt文件,则clean项目再make
参考资料:
gradle多渠道和友盟打包渠道统计:http://bbs.umeng.com/thread-9119-1-1.html
gradle出错:https://blog.csdn.net/small_technical/article/details/72782671
使用Android studio Gradle 实现友盟多渠道打包及统计
以友盟的渠道统计为例,渠道信息一般在 AndroidManifest.xml中修改以下值:
<meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />
首先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定义配置的值。
build.gradle文件就利用productFlavors这样写:
flavorDimensions "default"
productFlavors {
wandoujia {dimension "default"}
baidu {dimension "default"}
c360 {dimension "default"}
uc {dimension "default"}
myChannel{dimension "default"}
//这里注意:渠道名称最好不要大写
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
注意:遇到错误:Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r
添加:flavorDimensions “default”,可以查看上文所推荐的资料
使用android studio 和 gradle 多渠道打包:(善知堂视频讲解和第一行代码,后者更清楚)
应用生成签名:反手键module -> open module settings -> signing -> 点击加号 -> 填入相应字段。其中alias字段默认是key0
使用gradle多渠道打包:
右侧Gradle -> module name -> Tasks -> build -> 执行assemble(channel name)
使用Android Studio多渠道打包:
菜单 -> Build -> generate signed apk -> 选择key 和 productFlavors
建议使用第二种方式可视化,而且是已经签名过的APK,第一种虽然手动签名了,但是apk文件名却显示unsigned
PS:
多渠道打包的实际意义在于渠道差异性,对于不同平台App可以展现出不同的特性,如果各个平台特性相同,那么渠道差异性基本不存在,没必要使用多渠道打包,直接一个渠道发布所有平台即可。
渠道差异性使用和配置见第一行代码,有最基本的使用(通过覆写manifest文件等)