1. 程式人生 > >安卓友盟多渠道打包與統計

安卓友盟多渠道打包與統計

前言:多渠道的目的是上架到不同平臺,使用者下載註冊時傳入渠道標識給後臺統計,目的是為了更好的推廣,同時登陸友盟後臺也可以看到日活量與平臺下載量

右上角點選我的產品>檢視報表

在這裡插入圖片描述

日活量
在這裡插入圖片描述

下載量
在這裡插入圖片描述

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;
    }