記得最早以前都是用友盟全家桶,埋點是用友盟,推送也是用友盟;但是近倆年我參與開發(fā)的app,埋點都是用神策、推送都是用極光私服,分享都是去對應集成對應平臺的SDK
神策篇
- 神策(Android)- 集成基礎埋點的整個過程
- 神策(Android)- 在曝光采集基礎上學習項目架構
一切以 官方文檔 為準,因為隨著版本升級,集成文檔或許多多少少會有一些變動,此篇僅記錄我集成神策基礎埋點的整個過程
基礎配置
基礎配置:涵蓋 AGP 和 Sdk 的引入
- 關于如何在
AGP 8.0+
版本中使用插件以及插件的常用配置,請參考 SDK 插件說明。 -
Android Plugin
需要Android Gradle Plugin 3.2.0+
,否則會導致元素點擊事件和 Fragment 的頁面瀏覽事件無法觸發(fā),App 和 H5 打通功能受影響
。 - 插件與 SDK 版本依賴關系:
官方配置
在 project
級別的 build.gradle
文件中添加 android-gradle-plugin2
依賴:
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
// 添加 gradle 3.2.0+ 依賴
classpath 'com.android.tools.build:gradle:3.5.3'
// 添加神策分析 android-gradle-plugin2 依賴
classpath 'com.sensorsdata.analytics.android:android-gradle-plugin2:3.5.3'
}
}
在主 module(app)
的 build.gradle
文件中應用 com.sensorsdata.analytics.android
插件依賴:
apply plugin: 'com.android.application'
// 應用 com.sensorsdata.analytics.android 插件
apply plugin: 'com.sensorsdata.analytics.android'
dependencies {
}
在主 module
的 build.gradle
文件中添加 SDK 依賴
:
apply plugin: 'com.android.application'
// 應用 com.sensorsdata.analytics.android 插件
apply plugin: 'com.sensorsdata.analytics.android'
dependencies {
// 添加 Sensors Analytics SDK 依賴
implementation 'com.sensorsdata.analytics.android:SensorsAnalyticsSDK:6.6.7'
}
推薦版本(截止 2023.6.30)
項目配置
當前項目使用的是kts,非groovy,倆者使用可能稍有區(qū)別
build.gradle(project)
@file:Suppress("UnstableApiUsage", "DSL_SCOPE_VIOLATION")
buildscript {
dependencies {
classpath("com.android.tools.build:gradle:7.4.0")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21")
classpath("com.sensorsdata.analytics.android:android-gradle-plugin2:3.5.4")
}
}
plugins {
//若是感覺某個無用,可自行刪除
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.jvm) apply false
id("org.jetbrains.kotlin.android") version "1.7.21" apply false
}
build.gradle(主 module(app)
)
plugins {
id("haapp.android.application")
id("com.sensorsdata.analytics.android")
}
build.gradle(module)
哪個模塊做相關的初始化操作,就在哪個模塊引入 SDK
dependencies {
implementation("com.sensorsdata.analytics.android:SensorsAnalyticsSDK:6.6.8")
}
初始化SDK
主要涵蓋 官方SDK初始化
和 項目初始化的基礎封裝
官方初始化
一般金融行業(yè)的app會涉及合規(guī)的問題,需要確認用戶授權后才可使用;
延遲初始化 SDK 會導致全埋點采集不準確和可視化全埋點、點擊分析功能異常,若 App 有合規(guī)需求,可參考 Android 合規(guī)步驟。
在 Application
的 onCreate()
方法中同步調用 SensorsDataAPI.startWithConfigOptions()
初始化 SDK:
String SA_SERVER_URL = "數(shù)據(jù)接收地址";
// 初始化配置
SAConfigOptions saConfigOptions = new SAConfigOptions(SA_SERVER_URL);
// 開啟全埋點
saConfigOptions.setAutoTrackEventType(SensorsAnalyticsAutoTrackEventType.APP_CLICK |
SensorsAnalyticsAutoTrackEventType.APP_START |
SensorsAnalyticsAutoTrackEventType.APP_END |
SensorsAnalyticsAutoTrackEventType.APP_VIEW_SCREEN)
//開啟 Log
.enableLog(true);
/**
* 其他配置,如開啟可視化全埋點
*/
// 需要在主線程初始化神策 SDK
SensorsDataAPI.startWithConfigOptions(this, saConfigOptions);
SDK 共需要四個權限:
SDK 為簡化集成步驟,默認在 AndroidManifest.xml
中注冊了以上四個權限。如果想要去除 SDK 注冊的權限,可以使用 tools:node="remove"
配置。關于 tools:node="remove"
的詳細說明可參考谷歌 官方文檔,配置代碼參考:
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
項目初始化
我只用了直接初始化的API(很有限),關于更多的API可以前往 基礎 API 功能介紹
可以直接寫在 Application
中,這里是封裝了一個管理類,可以直接在 Application
中調用 SensorManger.initSetting(context)
;對應的serviceUrl 地址(上報服務器)需要在神策后臺查看一下,也可以讓我方運營、神策運營告知一下,因為測試上報的服務器有所不同
import android.app.Activity
import android.app.Application
import android.content.Context
import com.sensorsdata.analytics.android.sdk.SAConfigOptions
import com.sensorsdata.analytics.android.sdk.SensorsAnalyticsAutoTrackEventType
import com.sensorsdata.analytics.android.sdk.SensorsDataAPI
import com.sensorsdata.analytics.android.sdk.core.business.exposure.SAExposureConfig
import org.json.JSONObject
import java.util.concurrent.Executors
internal object SensorManger {
// 埋點數(shù)據(jù)對應的上報服務器,都是需要運營 或 神策方提供
// 測試
private const val serviceUrl = "https://xx.com.cn:8888"
// 生產
// private const val serviceUrl = "https://xx.com.cn"
fun initSetting(application: Application) {
init(application)
}
fun initSetting(activity: Activity) {
init(activity)
}
private fun init(context: Context) {
// 開啟全埋點 其他配置,如開啟可視化全埋點 需要在主線程初始化神策 SDK
SensorsDataAPI.startWithConfigOptions(context, SAConfigOptions(serviceUrl).apply {
// 開啟全埋點
autoTrackEventType = SensorsAnalyticsAutoTrackEventType.APP_START or
SensorsAnalyticsAutoTrackEventType.APP_END
// 打開 SDK 的日志輸出功能
enableLog(BuildVariants.isDebug())
// 開啟 App 打通 H5
enableJavaScriptBridge(true)
// 傳入 true 代表開啟推送點擊事件自動采集
enableTrackPush(true)
})
trackAppInstall(context)
}
/**
* 記錄激活事件
*/
private fun trackAppInstall(context: Context) {
try {
val properties = JSONObject()
//這里的 DownloadChannel 負責記錄下載商店的渠道,值應傳入具體應用商店包的標記。如果沒有為不同商店打多渠道包,則可以忽略該屬性的代碼示例。
properties.put("DownloadChannel", getChannelName(context))
// 觸發(fā)激活事件
// 如果您之前使用 trackInstallation() 觸發(fā)的激活事件,需要繼續(xù)保持原來的調用,無需改為 trackAppInstall(),否則會導致激活事件數(shù)據(jù)分離。
SensorsDataAPI.sharedInstance().trackAppInstall(properties)
} catch (e: Exception) {
e.printStackTrace()
}
}
/**
* 獲取渠道名,獲取不到默認"android"
*/
private fun getChannelName(context: Context?): String {
var channelName: String? = null
try {
val packageManager: PackageManager? = context?.packageManager
val applicationInfo: ApplicationInfo? = packageManager?.getApplicationInfo(
context.packageName,
PackageManager.GET_META_DATA
)
channelName = applicationInfo?.metaData?.get("CHANNEL_ID").toString()
} catch (e: Exception) {
e.printStackTrace()
}
return channelName ?: "android"
}
private val executor by lazy { Executors.newSingleThreadExecutor() }
private fun execute(inv: () -> Unit) {
executor.execute {
try {
inv.invoke()
} catch (throwable: Throwable) {
Timber.e(throwable)
}
}
}
fun track(eventName: String, properties: Map<String, String?>) = execute {
val jsonObject = JSONObject()
properties.entries.forEach {
jsonObject.put(it.key.string(), it.value.string())
}
SensorsDataAPI.sharedInstance().track(eventName, jsonObject)
}
}
配置 Scheme
Scheme 是什么?
- 是一種頁面內跳轉協(xié)議
- 通過定義自己的scheme協(xié)議,可以非常方便跳轉app中的各個頁面
- 通過scheme協(xié)議,服務器可以定制化告訴App跳轉到APP內部頁面
在使用神策系統(tǒng)中的 Debug 實時查看、App 點擊分析、可視化全埋點等需要掃碼的功能
時,需要給某一個 Activity 配置 scheme
,配置后掃碼即可拉起該 Activity 頁面并且與神策系統(tǒng)建立連接使用相關功能。
官方配置
Sdk 5.2.2及以上版本
在 AndroidManifest
文件中,配置以下 Activity,并將 scheme 的值替換為您項目中的值
<!-- Android 12 需添加 android:exported="true"-->
<activity android:name="com.sensorsdata.analytics.android.sdk.dialog.SchemeActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="您項目的 scheme" />
</intent-filter>
</activity>
Sdk 5.2.2以下版本
獲取 Scheme 后,在 AndroidManifest
文件中的 Activity 標簽內配置 Scheme,以 MainActivity 為例:
<activity android:name=".MainActivity">
<!-- 在 MainActivity 中配置 Scheme-->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:scheme="您項目的 Scheme 值" />
</intent-filter>
</activity>
項目配置
對應的scheme地址
需要在神策后臺查看一下,也可以讓我方運營、神策運營告知一下
AndroidManifest
<!-- Android 12 需添加 android:exported="true"-->
<activity
android:name="com.sensorsdata.analytics.android.sdk.dialog.SchemeActivity"
android:configChanges="orientation|screenSize"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 測試 -->
<data android:scheme="l77777" />
<!-- 生產 -->
<!--<data android:scheme="l66666" />-->
</intent-filter>
</activity>
打通APP和H5
版本要求
Android SDK v4.0.8 及以上版本
Android 插件 v3.2.4 及以上版本
初始化 SDK 時,進行如下配置,即可開啟 App 打通 H5 功能
// 開啟 App 打通 H5
saConfigOptions.enableJavaScriptBridge(boolean isSupportJellyBean);
isSupportJellyBean:是否支持 API level 16 及以下的版本。
打通功能通過 WebView 的 addJavascriptInterface()
方法實現(xiàn),但在 API level 16 及以下的版本,addJavascriptInterface()
方法有安全漏洞,因此請謹慎使用。
打通功能需要 App 和 H5 同時開啟才可以生效,H5 開啟方法請 參考 App 打通 H5。
-
X5 內核
打通,在初始化后添加SensorsDataAPI.sharedInstance().showUpX5WebView(WebView,true);
-
UC 內核
的 WebView 除了上述代碼,還需要在插件配置中添加:addUCJavaScriptInterface = true
這個選項,在主 module
級別的build.gradle
文件中添加我們的擴展如下;
sensorsAnalytics{
addUCJavaScriptInterface=true
}
因為項目中正好有這個需求,所以在我們初始化的時候已經開啟了這個功能
實踐封裝
這兒只做簡單封裝說明吧,有興趣的可以去 神策(Android)- 在曝光采集基礎上學習項目架構 看一下
StatisticsEvent 單例工具 - 方便調用
object StatisticsEvent {
/**
* 神策埋點:測試
*/
@JvmStatic
fun test(param1: String?) {
StatisticsService.service.test(param1)
}
}
StatisticsService 抽象類 - 統(tǒng)計方法
ServiceManager 相關講解可以去 在曝光采集基礎上學習項目架構 看一下,這里就不重復講究了
interface StatisticsService {
// 這里是實例化該Service,因為Hilt原因,采用了注入方式;可自行改為
companion object {
@JvmStatic
val service: StatisticsService by lazy { ServiceManager.queryStatisticsService() }
}
// 測試
fun test(param1: String?)
}
StatisticsServiceImpl 具體類 - 方法實現(xiàn)
internal class StatisticsServiceImpl @Inject constructor() : StatisticsService {
override fun track(eventName: String?, properties: MutableMap<String, String?>.() -> Unit) {
track(eventName, mutableMapOf<String, String?>().apply(properties))
}
override fun track(eventName: String?, properties: Map<String, String?>) {
if (eventName.isNullOrEmpty()) return
SensorManger.track(eventName, properties)
}
/**
* 神策埋點:測試
*/
override fun test(param1: String?) {
val properties = mutableMapOf<String, String>()
properties["param1"] = "下雨天"
SensorManger.track(EventName.test, properties)
}
}
EventName 事件名稱管理
internal object EventName {
const val test: String = "運營提供的埋點事件名稱" // 測試
}
興趣環(huán)節(jié)
在 StatisticsService
中海油另一種獲取接口實例的方式(主要用到了反射,先獲取實例,然后通過ARouter
傳遞回去)文章來源:http://www.zghlxwxcb.cn/news/detail-527658.html
companion object {
@JvmStatic
val service: StatisticsService? by lazy { ServiceManager.getService(StatisticsService::class.java) }
}
ServiceManager 獲取Service文章來源地址http://www.zghlxwxcb.cn/news/detail-527658.html
import com.alibaba.android.arouter.launcher.ARouter
class ServiceManager {
companion object {
@JvmStatic
fun <T> getService(service: Class<out T>): T {
return ARouter.getInstance().navigation(service)
}
@JvmStatic
fun getService(path: String): Any {
return ARouter.getInstance().build(path).navigation()
}
}
}
到了這里,關于神策(Android)- 集成基礎埋點的整個過程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!