Android之友盟多渠道打包與數據統計(非原創)


文章大綱

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

 

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

  多渠道打包,相信很多同學都知道。在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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM