Android之友盟多渠道打包與數(shù)據(jù)統(tǒng)計(非原創(chuàng))

文章大綱

一黍析、多渠道打包與數(shù)據(jù)統(tǒng)計介紹
二、友盟實現(xiàn)多渠道打包實戰(zhàn)
三屎开、友盟數(shù)據(jù)統(tǒng)計實戰(zhàn)
四阐枣、項目源碼下載
五、參考文章

一奄抽、多渠道打包與數(shù)據(jù)統(tǒng)計介紹

??多渠道打包蔼两,相信很多同學(xué)都知道。在Android Studio中只要經(jīng)過配置逞度,就能打出對應(yīng)市場的渠道包额划。打過包的同學(xué)可能都會有這樣的感受:散熱器瘋狂地轉(zhuǎn)、打包速度那叫一個慢档泽。這時候除了無奈俊戳,還是無奈揖赴。
??app上線后,一般公司都希望跟蹤app在市場上的使用情況抑胎。包括新增用戶燥滑、活躍用戶、渠道信息阿逃、錯誤信息等铭拧,還有例如商城類的app,需要跟蹤用戶最喜歡瀏覽哪種類型的店鋪或商品
??針對上面問題恃锉,如果我們自己手動去一個個處理搀菩,那么會崩潰的,因此已經(jīng)有相關(guān)第三方平臺做好了這方面功能淡喜,我們進行集成即可秕磷。多渠道打包和數(shù)據(jù)統(tǒng)計的第三方有很多,在此我們使用友盟平臺進行實戰(zhàn)炼团。

二澎嚣、友盟實現(xiàn)多渠道打包實戰(zhàn)

1. 接入前準備工作

(1)獲取AppKey

??集成【友盟+】SDK之前,您首先需要到 【友盟+】官網(wǎng)注冊并且添加新應(yīng)用瘟芝,獲得AppKey易桃。

特別提醒 :我們建議開發(fā)者在注冊賬號時使用企業(yè)郵箱,避免使用個人郵箱注冊锌俱,防止由于個人離職帶來的問題晤郑,建議使用的賬號形式:umeng@企業(yè)域名、apps@企業(yè)域名贸宏、dev@企業(yè)域名造寝。

常見問題
問題1 :應(yīng)用的安卓版和iOS版能否共用一個AppKey。
答案:不同平臺的應(yīng)用禁止使用相同的AppKey吭练,需要分開注冊诫龙。
問題2 :注冊應(yīng)用時,提示應(yīng)用名稱已存在鲫咽。
答案 :【友盟+】后臺的應(yīng)用名與實際應(yīng)用名和包名無關(guān)签赃,建議命名為應(yīng)用名+平臺(iOS/Android)。

(2)build.gradle添加相關(guān)配置

??在工程build.gradle配置腳本中buildscript和allprojects段中添加【友盟+】sdk 新maven倉庫地址

buildscript {
    
    repositories {
        google()
        jcenter()
        mavenCentral()

        //添加友盟相關(guān)的maven地址
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
    dependencies {

        classpath 'com.android.tools.build:gradle:3.1.2'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

      //添加友盟相關(guān)的maven地址
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

(3)工程build.gradle配置

   //添加友盟依賴
    implementation 'com.umeng.sdk:common:latest.integration'
    implementation 'com.umeng.sdk:analytics:latest.integration'

(4)添加相關(guān)權(quán)限

<!-- 必須的權(quán)限 -->
<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" />

<!-- 推薦的權(quán)限 -->
<!-- 添加如下權(quán)限分尸,以便使用更多的第三方SDK和更精準的統(tǒng)計數(shù)據(jù) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(5)AndroidManifest清單配置文件方式初始化appkey和channel

<!--友盟統(tǒng)計appkey配置-->
        <meta-data android:value="實際項目在友盟的appkey" android:name="UMENG_APPKEY"/>
        <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>

(6)自定義Application

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        /**
         * 初始化common庫
         * 參數(shù)1:上下文锦聊,必須的參數(shù),不能為空
         * 參數(shù)2:友盟 app key箩绍,非必須參數(shù)孔庭,如果Manifest文件中已配置app key,該參數(shù)可以傳空伶选,則使用Manifest中配置的app key史飞,否則該參數(shù)必須傳入
         * 參數(shù)3:友盟 channel尖昏,非必須參數(shù),如果Manifest文件中已配置channel构资,該參數(shù)可以傳空抽诉,則使用Manifest中配置的channel,否則該參數(shù)必須傳入吐绵,channel命名請詳見channel渠道命名規(guī)范
         * 參數(shù)4:設(shè)備類型迹淌,必須參數(shù),傳參數(shù)為UMConfigure.DEVICE_TYPE_PHONE則表示手機己单;傳參數(shù)為UMConfigure.DEVICE_TYPE_BOX則表示盒子唉窃;默認為手機
         * 參數(shù)5:Push推送業(yè)務(wù)的secret,需要集成Push功能時必須傳入Push的secret纹笼,否則傳空
         */
        //如果AndroidManifest.xml清單配置中沒有設(shè)置appkey和channel纹份,則可以在這里設(shè)置
        //        UMConfigure.init(this, "58edcfeb310c93091c000be2", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b");
        UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,"");
    }
}

2. 實現(xiàn)多渠道打包代碼

(1)添加多渠道打包

//多渠道打包支持

    productFlavors {
        Alpha {
            applicationId "info.xinfu.o2o"http://設(shè)置包名
            versionCode 2
            versionName "3.1"http://設(shè)置版本號
        }//自己打包測試使用
        Tencent {}//投放應(yīng)用寶市場
        Baidu {
            versionCode 1
            versionName "3.0"
        }//投放百度市場
        Wandoujia {}//投放豌豆莢市場
        PP {}//投放PP助手市場
        Qihoo {}//投放PP助手市場
        Vivo {}//投放vivo市場
        Oppo {}//投放oppo市場
        Xiaomi {}//投放小米市場
        Meizu {}//投放魅族市場
        Huawei {}//投放華為應(yīng)用市場
        Lenovo {}//投放聯(lián)想市場
        Letv {}//投放樂視市場
        Gionee {}//投放金立市場
        HiMarket {}//投放安卓市場

        //manifestPlaceholders 使用相關(guān)的值替換了UMENG_CHANNEL_VALUE
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }

更新項目時候出現(xiàn)異常
??當我們更新項目時候,可能會出現(xiàn)以下異常

Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

解決辦法如下:

defaultConfig {
      ...
      //版本名后面添加一句話廷痘,意思就是flavor dimension 它的維度就是該版本號蔓涧,這樣維度就是都是統(tǒng)一的了
        flavorDimensions "versionCode"
    }

(2)配置完成后project的build.gradle

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

buildscript {
    
    repositories {
        google()
        jcenter()
        mavenCentral()

        //添加友盟相關(guān)的maven地址
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
    dependencies {


        classpath 'com.android.tools.build:gradle:3.1.2'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        //添加友盟相關(guān)的maven地址
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

(3)配置完成后app的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.wxc.testpackage"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        //解決Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html異常
        flavorDimensions "versionCode"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //多渠道打包支持
    productFlavors {
        Alpha {
            applicationId "info.xinfu.o2o"http://設(shè)置包名
            versionCode 2
            versionName "3.1"http://設(shè)置版本號
        }//自己打包測試使用
        Tencent {}//投放應(yīng)用寶市場
        Baidu {
            versionCode 1
            versionName "3.0"
        }//投放百度市場
        Wandoujia {}//投放豌豆莢市場
        PP {}//投放PP助手市場
        Qihoo {}//投放PP助手市場
        Vivo {}//投放vivo市場
        Oppo {}//投放oppo市場
        Xiaomi {}//投放小米市場
        Meizu {}//投放魅族市場
        Huawei {}//投放華為應(yīng)用市場
        Lenovo {}//投放聯(lián)想市場
        Letv {}//投放樂視市場
        Gionee {}//投放金立市場
        HiMarket {}//投放安卓市場

        //manifestPlaceholders 使用相關(guān)的值替換了UMENG_CHANNEL_VALUE
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }
}

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'

    //添加友盟依賴
    implementation 'com.umeng.sdk:common:latest.integration'
    implementation 'com.umeng.sdk:analytics:latest.integration'

}

(4)配置完成后的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wxc.testpackage">

    <!-- 必須的權(quán)限 -->
    <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" />

    <!-- 推薦的權(quán)限 -->
    <!-- 添加如下權(quán)限,以便使用更多的第三方SDK和更精準的統(tǒng)計數(shù)據(jù) -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".MyApplication"
        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">

        <!--友盟統(tǒng)計appkey配置-->
        <meta-data android:value="5cac9da40cafb2a2bd00148e" android:name="UMENG_APPKEY"/>
        <meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

(5)添加多渠道信息統(tǒng)計

??即啟動數(shù)據(jù)的統(tǒng)計(包括新增用戶笋额、活躍用戶元暴、啟動次數(shù)、使用時長等基本數(shù)據(jù))
??需要在每個Activity的onResume方法中調(diào)用 MobclickAgent.onResume(Context),
onPause方法中調(diào)用 MobclickAgent.onPause(Context)兄猩,如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MobclickAgent.onResume(this);

        Button button = findViewById(R.id.checkButton);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this, "點擊了", Toast.LENGTH_SHORT).show();

                MobclickAgent.onEvent(MainActivity.this, "checkButton");//參數(shù)二為當前統(tǒng)計的事件ID

            }
        });
    }

    protected void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
    }
}

溫馨提示:
(1)如果Activity之間有繼承或者控制關(guān)系請不要同時在父和子Activity中重復(fù)添加nPause和nResume方法茉盏,否則會造成重復(fù)統(tǒng)計。例如在BaseActivity中添加過枢冤,則它的子類就不需要添加了鸠姨。
(2)當應(yīng)用在后臺運行超過30秒(默認)再回到前端,將被認為是兩個獨立的session(啟動)淹真,例如用戶回到home享怀,或進入其他程序,經(jīng)過一段時間后再返回之前的應(yīng)用趟咆。可通過接口:setSessionContinueMillis(long interval) 來自定義這個間隔(參數(shù)單位為毫秒)梅屉。
(3)如果開發(fā)者調(diào)用kill或者exit之類的方法殺死進程值纱,請務(wù)必在此之前調(diào)用onKillProcess(Context context)方法,用來保存統(tǒng)計數(shù)據(jù)坯汤。

(6)項目打包

選擇Generate Signed APK

新建一個簽名文件

填寫信息

補充說明:
(1)android 7.0中引入了APK Signature Scheme v2虐唠,v1呢是jar Signature來自JDKV1:應(yīng)該是通過ZIP條目進行驗證,這樣APK 簽署后可進行許多修改 - 可以移動甚至重新壓縮文件惰聂。(2)V2:驗證壓縮文件的所有字節(jié)疆偿,而不是單個 ZIP 條目咱筛,因此,在簽名后無法再更改(包括 zipalign)杆故。正因如此迅箩,現(xiàn)在在編譯過程中,我們將壓縮处铛、調(diào)整和簽署合并成一步完成饲趋。好處顯而易見,更安全而且新的簽名可縮短在設(shè)備上進行驗證的時間(不需要費時地解壓縮然后驗證)撤蟆,從而加快應(yīng)用安裝速度奕塑。v1和v2的簽名使用:
(4)只勾選v1簽名并不會影響什么,但是在7.0上不會使用更安全的驗證方式家肯,只勾選V2簽名7.0以下會直接安裝完顯示未安裝龄砰,7.0以上則使用了V2的方式驗證。同時勾選V1和V2則所有機型都沒問題

運行結(jié)果如下所示:

(7)運行結(jié)果

當我們用手機安裝apk后讨衣,在友盟后臺可看到以下統(tǒng)計

三换棚、友盟數(shù)據(jù)統(tǒng)計實戰(zhàn)

1. 自定義點擊事件

??自定義事件可以實現(xiàn)在應(yīng)用程序中埋點來統(tǒng)計用戶的點擊行為。例如我們的應(yīng)用需要統(tǒng)計用戶是點擊了“值依,還是cheackButton按鈕圃泡。自定義事件目前包括"計數(shù)事件"和"計算事件",這里主要講下計數(shù)事件愿险。
1颇蜡、首先需要在友盟后臺添加自定義事件:設(shè)置-事件-手工添加-添加事件。如下:

在需要統(tǒng)計位置中加入以下代碼

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this, "點擊了", Toast.LENGTH_SHORT).show();

                MobclickAgent.onEvent(MainActivity.this, "checkButton");//參數(shù)二為當前統(tǒng)計的事件ID

            }
        });

運行程序后辆亏,在友盟后臺可看到以下結(jié)果

2. 錯誤統(tǒng)計

??組件化統(tǒng)計SDK內(nèi)建JVM層錯誤統(tǒng)計风秤。SDK通過Thread.UncaughtExceptionHandler 捕獲程序崩潰日志,并在程序下次啟動時發(fā)送到服務(wù)器扮叨。
??如不需要錯誤統(tǒng)計功能缤弦,可通過此方法關(guān)閉:

// isEnable: false-關(guān)閉錯誤統(tǒng)計功能;true-打開錯誤統(tǒng)計功能(默認打開)
public static void setCatchUncaughtExceptions(boolean isEnable)

參數(shù) 含義
isEnable 錯誤統(tǒng)計開關(guān)彻磁,false-關(guān)閉錯誤統(tǒng)計功能碍沐;true-打開錯誤統(tǒng)計功能(默認打開)。
如果開發(fā)者自己捕獲了錯誤衷蜓,需要手動上傳到【友盟+】服務(wù)器可以調(diào)用下面方法:

代碼:復(fù)制代碼到剪切板
public static void reportError(Context context, String error);   
//或  
public static void reportError(Context context, Throwable e);

參數(shù) 含義
context 當前宿主進程的ApplicationContext上下文累提。
error 錯誤內(nèi)容字符串。
e 錯誤發(fā)生時拋出的異常對象磁浇。

3.總結(jié)

??友盟還提供了其他的統(tǒng)計方法斋陪,包括頁面統(tǒng)計、賬號統(tǒng)計等,具體的功能事情請參考友盟的開發(fā)者文檔:
https://developer.umeng.com/docs/66632/detail/101848#h2-u9519u8BEFu7EDFu8BA111

四无虚、項目源碼下載

鏈接:https://pan.baidu.com/s/1sUKsyJUNQLJ4j65_ZxkNZQ
密碼:yvqs

五缔赠、參考文章

  1. http://www.reibang.com/p/e4da2f477cd8
  2. http://www.reibang.com/p/e4da2f477cd8
  3. http://www.reibang.com/p/3acba4233bc6
  4. http://www.reibang.com/p/476ba5953d94
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市友题,隨后出現(xiàn)的幾起案子嗤堰,更是在濱河造成了極大的恐慌,老刑警劉巖咆爽,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呢岗,死亡現(xiàn)場離奇詭異彻桃,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門子眶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰蝠,“玉大人彪杉,你說我怎么就攤上這事灭抑。” “怎么了漾稀?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵模闲,是天一觀的道長。 經(jīng)常有香客問我崭捍,道長尸折,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任殷蛇,我火速辦了婚禮实夹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粒梦。我一直安慰自己亮航,他們只是感情好,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布匀们。 她就那樣靜靜地躺著缴淋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泄朴。 梳的紋絲不亂的頭發(fā)上重抖,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機與錄音祖灰,去河邊找鬼仇哆。 笑死,一個胖子當著我的面吹牛夫植,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼详民,長吁一口氣:“原來是場噩夢啊……” “哼延欠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沈跨,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤由捎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饿凛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狞玛,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年涧窒,在試婚紗的時候發(fā)現(xiàn)自己被綠了心肪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡纠吴,死狀恐怖硬鞍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戴已,我是刑警寧澤固该,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站糖儡,受9級特大地震影響伐坏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜握联,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一桦沉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拴疤,春花似錦永部、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜒犯,卻和暖如春组橄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罚随。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工玉工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淘菩。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓遵班,卻偏偏與公主長得像屠升,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狭郑,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容