安卓友盟多渠道打包與統計
前言:多渠道的目的是上架到不同平臺,使用者下載註冊時傳入渠道標識給後臺統計,目的是為了更好的推廣,同時登陸友盟後臺也可以看到日活量與平臺下載量
右上角點選我的產品>檢視報表
日活量
下載量
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;
}