版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

这里只是记录下集成友盟统计SDK以及简单配置多渠道打包的步骤。所以1、该Demo不能运行;2、配置多渠道打包只是一种简单的写法,具体复杂写法请阅读参考资料。

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

1、在友盟官网上创建应用,获取Appkey

2、导入SDK【方案介绍,具体步骤见下一步】

有两种方法:(本Demo中采用第一种方法)

方法一:下载SDK,将解压出来的jar包复制到工程libs/目录下。
下载地址:https://developer.umeng.com/

方法二:添加SDK在maven中心库的线上依赖
1、在app的builde.gradle中添加依赖

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.why.project.umengappdemo"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' /*友盟统计需要的最新版本组件化基础库和统计SDK*/
implementation 'com.umeng.sdk:common:1.5.3'
implementation 'com.umeng.sdk:analytics:7.5.3'
}

 如果无法正常集成请在项目的bundle.gradle文件中添加如下配置:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
} allprojects {
repositories {
mavenCentral()//友盟统计sdk
google()
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}

3、根据方法一的方式集成友盟统计SDK

(1)首先,新建thirdlib这个module,用来统一管理第三方平台的SDK;并且在app的bundle.gradle文件中引入thirdlib

//thirdlib
implementation project(':thirdlib')

(2)然后,将下载的友盟统计SDK中的jar文件复制到thirdlib这个module的libs目录下,并且在thirdlib的bundle.gradle文件中引用这些jar文件

    //友盟统计sdk
api files('libs/umeng-analytics-7.5.3.jar')
api files('libs/umeng-common-1.5.3.jar')

还需要在app的bundle.gradle中添加以下代码

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.why.project.umengappdemo"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//集成友盟统计sdk
repositories {
flatDir {
dirs 'libs'
dirs project(':thirdlib').file('libs')
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //thirdlib
implementation project(':thirdlib')
}

(3)然后,在app的AndroidManifest.xml中添加权限、配置Appkey与渠道(Channel)【注意,appkey值是错误的,换成自己的】

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.why.project.umengappdemo"> <!-- ======================友盟统计sdk========================== -->
<!--检测联网方式,区分用户设备使用的是2G、3G或是WiFi。-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取用户设备的mac地址,在平板设备或电视盒子上,无法通过IMEI标示设备,我们会将mac地址作为用户的唯一标识。-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--获取用户设备的IMEI,通过IMEI来唯一的标识用户。App可以不申请READ_PHONE_STATE-->
<!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
<!--允许应用程序联网,以便向我们的服务器端发送数据。-->
<uses-permission android:name="android.permission.INTERNET"/> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity> <!-- ======================友盟统计配置Appkey与Channel====================== -->
<!--value的值填写你在友盟后台申请的应用Appkey-->
<meta-data android:value="63639f9wejfefew9032093jfwsedwr" android:name="UMENG_APPKEY"/>
<!--value的值填写渠道名称,例如yingyongbao。这里设置动态渠道变量-->
<meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/> </application> </manifest>

还需要在app的builde.gradle中配置需要的渠道(比如这里是应用宝、华为、小米、360),对应上面的渠道名称变量。

apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.why.project.umengappdemo"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} /*配置渠道--友盟统计*/
flavorDimensions "default"
//渠道
productFlavors {
yingyongbao {}
huawei {}
xiaomi {}
_360 {}
//批量配置
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
}
//集成友盟统计sdk
repositories {
flatDir {
dirs 'libs'
dirs project(':thirdlib').file('libs')
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //thirdlib
implementation project(':thirdlib')
}

(4)然后,在app中新建MyApplication.java文件,并添加友盟统计初始化方法

下面黄色标记的代码是主要代码,紫色标记的代码是用于获取渠道名称的。

package com.why.project.umengappdemo;

import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils; import com.umeng.commonsdk.UMConfigure; /**
* Created by HaiyuKing
* Used
*/
public class MyApplication extends Application { /**系统上下文*/
private static Context mAppContext; @Override
public void onCreate() {
super.onCreate();
mAppContext = getApplicationContext(); /*=================友盟统计sdk=====================*/
initUmengApp();
} /**获取系统上下文:用于ToastUtil类*/
public static Context getAppContext()
{
return mAppContext;
} //友盟统计
private void initUmengApp(){
/*
注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,也需要在App代码中调用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值,UMConfigure.init调用中appkey和channel参数请置为null)。
*/
/**
* 初始化common库
* 参数1:上下文,必须的参数,不能为空
* 参数2:友盟 app key,非必须参数,如果Manifest文件中已配置app key,该参数可以传空,则使用Manifest中配置的app key,否则该参数必须传入
* 参数3:友盟 channel,非必须参数,如果Manifest文件中已配置channel,该参数可以传空,则使用Manifest中配置的channel,否则该参数必须传入,channel命名请详见channel渠道命名规范
* 参数4:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机
* 参数5:Push推送业务的secret,需要集成Push功能时必须传入Push的secret,否则传空
*/
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,"");
/**
* 设置组件化的Log开关
* 参数: boolean 默认为false,如需查看LOG设置为true
*/
UMConfigure.setLogEnabled(false);
/**
* 设置日志加密
* 参数:boolean 默认为false(不加密)
*/
UMConfigure.setEncryptEnabled(false); // 打开统计SDK调试模式--发布前需要修改为false
UMConfigure.setLogEnabled(false);
} /**
* 这个方法是给其他第三方平台使用的,用于获取当前渠道名称:getAppMetaData(getAppContext(),"UMENG_CHANNEL")
* 获取application中指定的meta-data。对于友盟统计,多渠道配置,调用方法时传入key就是UMENG_CHANNEL
* return 如果没有获取成功(没有对应值,或者异常),则返回值为空
*/
public static String getAppMetaData(Context ctx, String key) {
if (ctx == null || TextUtils.isEmpty(key)) {
return null;
}
String resultData = null;
try {
PackageManager packageManager = ctx.getPackageManager();
if (packageManager != null) {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
resultData = applicationInfo.metaData.getString(key);
}
} }
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
} return resultData;
}
}

这样友盟统计SDK就集成到项目中。

三、使用方法

Session统计

即启动数据的统计(包括新增用户、活跃用户、启动次数、使用时长等基本数据)。

需要在每个Activity的onResume方法中调用 MobclickAgent.onResume(Context),onPause方法中调用 MobclickAgent.onPause(Context)。

  • 确保在所有的Activity中都调用 MobclickAgent.onResume() 和onPause()方法。
  • 如果Activity之间有继承或者控制关系请不要同时在父和子Activity中重复添加nPause和nResume方法,否则会造成重复统计。例如在BaseActivity中添加过,则它的子类就不需要添加了。
  • 当应用在后台运行超过30秒(默认)再回到前端,将被认为是两个独立的session(启动),例如用户回到home,或进入其他程序,经过一段时间后再返回之前的应用。可通过接口:setSessionContinueMillis(long interval) 来自定义这个间隔(参数单位为毫秒)。
  • 如果开发者调用kill或者exit之类的方法杀死进程,请务必在此之前调用onKillProcess(Context context)方法,用来保存统计数据。

常规做法,建新BaseActivity.java文件,然后所有的Activity集成BaseActivity.java

package com.why.project.umengappdemo;

import android.support.v7.app.AppCompatActivity;

import com.umeng.analytics.MobclickAgent;

/**
* Created by HaiyuKing
* Used
*/
public class BaseActivity extends AppCompatActivity { //友盟统计SDK
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
//友盟统计SDK
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
} }

其他统计

参考官网或者阅读参考资料。

多渠道打包发布

混淆配置

#=====================友盟统计sdk=====================
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

参考资料

官网SDK下载

Android友盟统计的集成与使用(包含多渠道打包配置)

多渠道打包之友盟

安卓多渠道打包(结合友盟)

Android使用友盟进行分渠道打包和统计

项目demo下载地址

链接:https://pan.baidu.com/s/1vdRj6BNW2wCjlPSHVQyE9A 密码:vyxk

最新文章

  1. Android高手速成--第三部分 优秀项目
  2. 爆零后的感受外加一道强联通分量HDU 4635的题解
  3. xla_events
  4. Qt 串口编程学习1
  5. 【P1326】超级教主
  6. mongodb的读写分离
  7. Python命令行解析库argparse
  8. Delphi 关闭MDI子窗口
  9. 关于Eclipse中校验输入文件名的源代码
  10. tar命令的详解
  11. jsp 页面获取xml的内容
  12. 数据挖掘方面重要会议的最佳paper集合
  13. Linux环境搭建Hadoop伪分布模式
  14. 修改redis端口号
  15. 关于Arduino 步进电机Stepper库的一些想法
  16. Jquery 文字上下滚动效果示例代码
  17. 架构师之路--应用架构的选型和dubbo
  18. Java分布式锁,搞懂分布式锁实现看这篇文章就对了
  19. Docker-Docker-compose应用
  20. pwn学习日记Day3 基础知识积累

热门文章

  1. 简化异常处理的Throwables类
  2. vector作为函数返回值
  3. 【BZOJ 2844】: albus就是要第一个出场
  4. BZOJ_3398_[Usaco2009 Feb]Bullcow 牡牛和牝牛_组合数学
  5. BZOJ_3524_[Poi2014]Couriers_主席树
  6. BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组
  7. VIJOS-P1635 城市连接
  8. 浅析Django之session与cookie
  9. Esp8266
  10. 挑子学习笔记:DBSCAN算法的python实现