Android之友盟多渠道打包與數據統計

来源:https://www.cnblogs.com/WUXIAOCHANG/archive/2019/04/10/10683942.html
-Advertisement-
Play Games

文章大綱 一、多渠道打包與數據統計介紹二、友盟實現多渠道打包實戰三、友盟數據統計實戰四、項目源碼下載五、參考文章 一、多渠道打包與數據統計介紹 多渠道打包,相信很多同學都知道。在Android Studio中只要經過配置,就能打出對應市場的渠道包。打過包的同學可能都會有這樣的感受:散熱器瘋狂地轉、打 ...


文章大綱

一、多渠道打包與數據統計介紹
二、友盟實現多渠道打包實戰
三、友盟數據統計實戰
四、項目源碼下載
五、參考文章

 

一、多渠道打包與數據統計介紹

  多渠道打包,相信很多同學都知道。在Android Studio中只要經過配置,就能打出對應市場的渠道包。打過包的同學可能都會有這樣的感受:散熱器瘋狂地轉、打包速度那叫一個慢。這時候除了無奈,還是無奈。
  app上線後,一般公司都希望跟蹤app在市場上的使用情況。包括新增用戶、活躍用戶、渠道信息、錯誤信息等,還有例如商城類的app,需要跟蹤用戶最喜歡瀏覽哪種類型的店鋪或商品
  針對上面問題,如果我們自己手動去一個個處理,那麼會崩潰的,因此已經有相關第三方平臺做好了這方面功能,我們進行集成即可。多渠道打包和數據統計的第三方有很多,在此我們使用友盟平臺進行實戰。

二、友盟實現多渠道打包實戰

1. 接入前準備工作

(1)獲取AppKey

  集成【友盟+】SDK之前,您首先需要到 【友盟+】官網註冊並且添加新應用,獲得AppKey。

特別提醒 :我們建議開發者在註冊賬號時使用企業郵箱,避免使用個人郵箱註冊,防止由於個人離職帶來的問題,建議使用的賬號形式:umeng@企業功能變數名稱、apps@企業功能變數名稱、dev@企業功能變數名稱。

 

常見問題
問題1 :應用的安卓版和iOS版能否共用一個AppKey。
答案:不同平臺的應用禁止使用相同的AppKey,需要分開註冊。
問題2 :註冊應用時,提示應用名稱已存在。
答案 :【友盟+】後臺的應用名與實際應用名和包名無關,建議命名為應用名+平臺(iOS/Android)。

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

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

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

        //添加友盟相關的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()

      //添加友盟相關的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)添加相關許可權

<!-- 必須的許可權 -->
<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" />

<!-- 推薦的許可權 -->
<!-- 添加如下許可權,以便使用更多的第三方SDK和更精準的統計數據 -->
<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

<!--友盟統計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庫
         * 參數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,否則傳空
         */
        //如果AndroidManifest.xml清單配置中沒有設置appkey和channel,則可以在這裡設置
        //        UMConfigure.init(this, "58edcfeb310c93091c000be2", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "1fe6a20054bcef865eeb0991ee84525b");
        UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE,"");
    }
}

2. 實現多渠道打包代碼

(1)添加多渠道打包

//多渠道打包支持

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

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

更新項目時候出現異常
  當我們更新項目時候,可能會出現以下異常

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 它的維度就是該版本號,這樣維度就是都是統一的了
        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()

        //添加友盟相關的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()
        //添加友盟相關的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"//設置包名
            versionCode 2
            versionName "3.1"//設置版本號
        }//自己打包測試使用
        Tencent {}//投放應用寶市場
        Baidu {
            versionCode 1
            versionName "3.0"
        }//投放百度市場
        Wandoujia {}//投放豌豆莢市場
        PP {}//投放PP助手市場
        Qihoo {}//投放PP助手市場
        Vivo {}//投放vivo市場
        Oppo {}//投放oppo市場
        Xiaomi {}//投放小米市場
        Meizu {}//投放魅族市場
        Huawei {}//投放華為應用市場
        Lenovo {}//投放聯想市場
        Letv {}//投放樂視市場
        Gionee {}//投放金立市場
        HiMarket {}//投放安卓市場

        //manifestPlaceholders 使用相關的值替換了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">

    <!-- 必須的許可權 -->
    <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" />

    <!-- 推薦的許可權 -->
    <!-- 添加如下許可權,以便使用更多的第三方SDK和更精準的統計數據 -->
    <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">

        <!--友盟統計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)添加多渠道信息統計

  即啟動數據的統計(包括新增用戶、活躍用戶、啟動次數、使用時長等基本數據)
  需要在每個Activity的onResume方法中調用 MobclickAgent.onResume(Context),
onPause方法中調用 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");//參數二為當前統計的事件ID

            }
        });
    }

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

溫馨提示:
(1)如果Activity之間有繼承或者控制關係請不要同時在父和子Activity中重覆添加nPause和nResume方法,否則會造成重覆統計。例如在BaseActivity中添加過,則它的子類就不需要添加了。
(2)當應用在後臺運行超過30秒(預設)再回到前端,將被認為是兩個獨立的session(啟動),例如用戶回到home,或進入其他程式,經過一段時間後再返回之前的應用。可通過介面:setSessionContinueMillis(long interval) 來自定義這個間隔(參數單位為毫秒)。
(3)如果開發者調用kill或者exit之類的方法殺死進程,請務必在此之前調用onKillProcess(Context context)方法,用來保存統計數據。

(6)項目打包

選擇Generate Signed APK

 

新建一個簽名文件

 

填寫信息

     

補充說明:
(1)android 7.0中引入了APK Signature Scheme v2,v1呢是jar Signature來自JDKV1:應該是通過ZIP條目進行驗證,這樣APK 簽署後可進行許多修改 - 可以移動甚至重新壓縮文件。(2)V2:驗證壓縮文件的所有位元組,而不是單個 ZIP 條目,因此,在簽名後無法再更改(包括 zipalign)。正因如此,現在在編譯過程中,我們將壓縮、調整和簽署合併成一步完成。好處顯而易見,更安全而且新的簽名可縮短在設備上進行驗證的時間(不需要費時地解壓縮然後驗證),從而加快應用安裝速度。v1和v2的簽名使用:
(4)只勾選v1簽名並不會影響什麼,但是在7.0上不會使用更安全的驗證方式,只勾選V2簽名7.0以下會直接安裝完顯示未安裝,7.0以上則使用了V2的方式驗證。同時勾選V1和V2則所有機型都沒問題

運行結果如下所示:

 

(7)運行結果

 

當我們用手機安裝apk後,在友盟後臺可看到以下統計

 

三、友盟數據統計實戰

1. 自定義點擊事件

  自定義事件可以實現在應用程式中埋點來統計用戶的點擊行為。例如我們的應用需要統計用戶是點擊了“,還是cheackButton按鈕。自定義事件目前包括"計數事件"和"計算事件",這裡主要講下計數事件。
1、首先需要在友盟後臺添加自定義事件:設置-事件-手工添加-添加事件。如下:

 

在需要統計位置中加入以下代碼

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

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

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

            }
        });

運行程式後,在友盟後臺可看到以下結果

 

2. 錯誤統計

  組件化統計SDK內建JVM層錯誤統計。SDK通過Thread.UncaughtExceptionHandler 捕獲程式崩潰日誌,併在程式下次啟動時發送到伺服器。
  如不需要錯誤統計功能,可通過此方法關閉:

// isEnable: false-關閉錯誤統計功能;true-打開錯誤統計功能(預設打開)
public static void setCatchUncaughtExceptions(boolean isEnable)

參數 含義
isEnable 錯誤統計開關,false-關閉錯誤統計功能;true-打開錯誤統計功能(預設打開)。
如果開發者自己捕獲了錯誤,需要手動上傳到【友盟+】伺服器可以調用下麵方法:

代碼:複製代碼到剪切板
public static void reportError(Context context, String error);   
//或  
public static void reportError(Context context, Throwable e);

參數 含義
context 當前宿主進程的ApplicationContext上下文。
error 錯誤內容字元串。
e 錯誤發生時拋出的異常對象。

3.總結

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

四、項目源碼下載

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

五、參考文章

  1. https://www.jianshu.com/p/e4da2f477cd8
  2. https://www.jianshu.com/p/e4da2f477cd8
  3. https://www.jianshu.com/p/3acba4233bc6
  4. https://www.jianshu.com/p/476ba5953d94
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.將資料庫中查詢的表格導出到指定的路徑,首先啟用.xp_cmdshell,上一篇隨筆有寫如何開啟.xp_cmdshell。 DECLARE @sql NVARCHAR(4000) --定義變數存儲格式 DECLARE @server NVARCHAR(20) --定義變數存儲格式 set @ser ...
  • 在使用JDBC連接mysql資料庫的時候發生SQLException '¤¤°ê¼Ð·Ç®É¶¡'的異常情況! ...
  • 筆記記錄自林曉斌(丁奇)老師的《MySQL實戰45講》 (本篇內圖片均來自丁奇老師的講解,如有侵權,請聯繫我刪除) 17) --如何正確地顯示隨機消息? 如果有這麼一個英語單詞表,需要每次訪問時隨機顯示三個單詞。但實際使用中發現,隨著單詞表越變越大,選單詞這個邏輯變得越來越慢。建表語句如下: 為了便 ...
  • 一、Hive測試 1.查看資料庫 show databases; 2.使用某個資料庫,如預設資料庫 user default; 3.創建表 create table if not exist itstar(id int,name string); 4.插入數據 insert into table i ...
  • 1. 查看系統資料庫參數配置: select * from sys.configurations where name='xp_cmdshell' 修改系統資料庫參數: 2.通過命令方式,啟動xp_cmdshell: sp_configure 'show advanced options',1 re ...
  • (一)neo4j安裝 neo4j有社區版本和企業版,社區版本是免費的,企業版本是收費的。在linux上安裝如下步驟: 1、將下載的neo4j-enterprise-3.4.0-unix.tar.gz包上傳到linux伺服器,並解壓。 2、設置$NEO4J_HOME也就是解壓圖資料庫安裝包所在的目錄到 ...
  • Android模擬器Genymotion的安裝和使用 by:授客 QQ:1033553122 環境: Win7 Genymotion 2.12.0 下載地址:http://download.canadiancontent.netGenymotion.html VirtualBox 5.1.34 下載 ...
  • 前言- 上幾篇文章,我們一個一個的研究了Cubism官方提供的Android使用Live2D的簡單例子,但是依舊和大家平時見到的還是有很大差距的。在研究了代碼差不多一周以後,我決定還是用文字的形式記錄一下比較好。 下麵就是我們的主角:SampleApp1 下載及運行 編譯運行後的結果- 先來粗略看看 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...