前言:多渠道的目的是上架到不同平台,用户下载注册时传入渠道标识给后台统计,目的是为了更好的推广,同时登陆友盟后台也可以看到日活量与平台下载量
1、友盟注册平台:https://www.umeng.com/
右上角点击我的产品>查看报表
日活量
下载量
2、
①:在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】sdk 新maven仓库地址。如下图。
maven { url ‘https://dl.bintray.com/umsdk/release’ }
app build.gradle中进行配置
implementation 'com.umeng.umsdk:analytics:7.5.4'
implementation 'com.umeng.umsdk:common:1.5.4'
//implementation 'com.umeng.analytics:analytics:latest.integration'
其中latest.integration代表使用最新版(不建议这样做因为新版可能存在兼容性问题)
signingConfigs {
release {
storeFile file('D:/workspace/helloword.jks')
storePassword '123456'
keyAlias '123'
keyPassword '123456'
//v2SigningEnabled false
}
}
//打包相关配置
buildTypes {
debug {
shrinkResources true // 移除无用的resource文件
minifyEnabled false //不启用混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',
'proguard-fresco.pro'
//签名配置
signingConfig signingConfigs.debug
}
release {
shrinkResources true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
/*配置渠道*/
productFlavors {
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
huawei {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
vivo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "vivo"]
}
meizu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
sanxing {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "sanxing"]
}
oppo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "oppo"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
ailibaba {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ailibaba"]
}
anzhi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "anzhi"]
}
mumayi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "mumayi"]
}
kuan {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
}
sougou {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "sougou"]
}
chuizi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "chuizi"]
}
}
这里配置了15个平台都是英文小写全称(anzhi:安智 kuan:酷安)
②: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"/>
<!-- 友盟统计配置Appkey与Channel -->
<meta-data
android:name="UMENG_APPKEY"
android:value="填入你的AppKey" />
<!-- value的值填写渠道名称,例如yingyongbao。这里设置动态渠道变量 -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
AppKey查看在应用设置>应用信息处获得
③:如果需要混淆设置
#友盟
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public <init> (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 *;
}
④:初始化及通用接口
新建BaseApplication并在清单文件中注册,在onCreate方法中加入
/**
* 初始化common库
* 参数1:上下文,不能为空
* 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、
* UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
* 参数3:Push推送业务的secret
*/
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,
"");
/**
* 设置组件化的Log开关
* 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(true);
/**
* 设置日志加密
* 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(true);
这样多渠道就配置好了,在进行签名打包有选项可选择
3、再来看看统计代码比较少
在你的基类BaseActivity中添加
@Override
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
注意:不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计,导致启动次数异常增高。
4、Session间隔时长设置接口
// 将默认Session间隔时长改为50秒。(interval 单位为毫秒,默认值为30000。)
MobclickAgent.setSessionContinueMillis(1000*50);
注意:当应用在后台运行超过30秒(默认)再回到前台,将被认为是两次独立的Session(启动),例如:用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。即被认为是两个独立的Session。
最后启用统计即可
5、获取渠道标识
将获得的标识传入后台即可
/**
* 获取渠道名
* @param context 此处习惯性的设置为activity,实际上context就可以
* @return 如果没有获取成功,那么返回值为空
*/
public static String getChannelName(Context context) {
if (context == null) {
return null;
}
String channelName = null;
try {
PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
//注意此处为ApplicationInfo,因为友盟设置的meta-data是在application标签中
ApplicationInfo applicationInfo = packageManager.
getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
//这里的UMENG_CHANNEL要与manifest中的配置文件标识一致
channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return channelName;
}