版權聲明:本文為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); }