【埋点】Loading_Start 增加数数事件上报缓存处理,数数初始化前缓存事件,防止事件丢失

This commit is contained in:
Lindong 2026-01-26 16:24:45 +08:00
parent 479e8aad93
commit 13ee0de952
3 changed files with 105 additions and 19 deletions

View File

@ -70,10 +70,12 @@ object StatisticUtil {
"adid" to AdjustManager.instance().getAaId()
)
FireBaseManager.instance().reportEvent(eventKey, eventData, superPropertiesMap)
ShushuManager.instance().reportEvent(eventKey, eventData, superPropertiesMap)
val shushuManager = ShushuManager.instance()
shushuManager.reportEvent(eventKey, eventData, superPropertiesMap)
StatisticLogger.d("[reportEvents] shushuReady=${shushuManager.isSdkReady()} eventKey=$eventKey")
if (BuildConfig.DEBUG) {
StatisticLogger.d("Events reported to shushu&Firebase: type=$eventKey")
StatisticLogger.d("[reportEvents] Events reported to shushu&Firebase: type=$eventKey")
}
}
}
@ -95,6 +97,14 @@ object StatisticUtil {
data: Map<String, Any>
) {
reportEvents(eventName, data)
val dataStr = try {
data.entries
.sortedBy { it.key }
.joinToString(prefix = "{", postfix = "}") { (k, v) -> "$k=$v" }
} catch (t: Throwable) {
"format_failed:${t.javaClass.simpleName}"
}
StatisticLogger.d("[DataReporter] eventName: $eventName data=$dataStr")
}
override fun setCommonParams(params: Map<String, Any>) {

View File

@ -8,6 +8,8 @@ import cn.thinkingdata.analytics.ThinkingAnalyticsSDK
import com.ama.core.architecture.BaseApp
import com.ama.core.architecture.util.AndroidUtil.Companion.gson
import com.gamedog.statisticreporter.StatisticLogger
import java.util.ArrayDeque
import java.util.concurrent.atomic.AtomicBoolean
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@ -33,19 +35,43 @@ class ShushuManager private constructor() {
private val mAppContext = BaseApp.appContext()
private val mBgScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
private val mMainScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
private lateinit var mShushuSdk: ThinkingAnalyticsSDK
lateinit var mShushuSdk: ThinkingAnalyticsSDK
private data class PendingEvent(
val eventKey: String,
val params: Map<String, Any>?,
val superProperties: Map<String, Any>
)
private val initStarted = AtomicBoolean(false)
@Volatile
private var sdkReady: Boolean = false
private val pendingEventsLock = Any()
private val pendingEvents = ArrayDeque<PendingEvent>()
private val trackLock = Any()
private val maxPendingEvents = 200
fun initShushu(shushuAppId: String, shushuServerUrl: String) {
if (sdkReady) return
if (!initStarted.compareAndSet(false, true)) return
mMainScope.launch {
TDAnalytics.init(mAppContext, shushuAppId, shushuServerUrl)
try {
TDAnalytics.init(mAppContext, shushuAppId, shushuServerUrl)
val config = TDConfig.getInstance(mAppContext, shushuAppId, shushuServerUrl)
config.setMode(/*if (BuildConfig.DEBUG) TDConfig.ModeEnum.DEBUG else*/ TDConfig.ModeEnum.NORMAL)
mShushuSdk = ThinkingAnalyticsSDK.sharedInstance(config)
configAutoTrack()
val config = TDConfig.getInstance(mAppContext, shushuAppId, shushuServerUrl)
config.setMode(/*if (BuildConfig.DEBUG) TDConfig.ModeEnum.DEBUG else*/ TDConfig.ModeEnum.DEBUG)
// config.setMode(/*if (BuildConfig.DEBUG) TDConfig.ModeEnum.DEBUG else*/ TDConfig.ModeEnum.NORMAL)
mShushuSdk = ThinkingAnalyticsSDK.sharedInstance(config)
configAutoTrack()
sdkReady = true
flushPendingEventsAsync()
} catch (e: Exception) {
initStarted.set(false)
StatisticLogger.e("数数SDK初始化失败", e)
}
}
}
@ -54,16 +80,12 @@ class ShushuManager private constructor() {
* 用户点击按钮浏览页面完成购买等
*/
fun reportEvent(eventKey: String, params: Map<String, Any>?, superProperties: Map<String, Any>) {
try {
TDAnalytics.setSuperProperties(JSONObject(superProperties))
val jsonObj = params?.let {
JSONObject(params)
}
TDAnalytics.track(eventKey, jsonObj)
} catch (e: Exception) {
e.printStackTrace()
if (!sdkReady) {
enqueuePendingEvent(eventKey, params, superProperties)
if (sdkReady) flushPendingEventsAsync()
return
}
reportEventInternal(eventKey, params, superProperties)
}
@ -157,6 +179,55 @@ class ShushuManager private constructor() {
}
}
fun isSdkReady(): Boolean {
return sdkReady && this::mShushuSdk.isInitialized
}
private fun enqueuePendingEvent(eventKey: String, params: Map<String, Any>?, superProperties: Map<String, Any>) {
val safeParams = params?.toMap()
val safeSuper = superProperties.toMap()
synchronized(pendingEventsLock) {
if (pendingEvents.size >= maxPendingEvents) {
if (pendingEvents.isNotEmpty()) {
pendingEvents.removeFirst()
}
}
pendingEvents.addLast(PendingEvent(eventKey, safeParams, safeSuper))
}
}
private fun flushPendingEventsAsync() {
mBgScope.launch {
flushPendingEvents()
}
}
private fun flushPendingEvents() {
if (!sdkReady) return
val batch = ArrayList<PendingEvent>()
synchronized(pendingEventsLock) {
while (pendingEvents.isNotEmpty()) {
batch.add(pendingEvents.removeFirst())
}
}
if (batch.isEmpty()) return
batch.forEach { pending ->
reportEventInternal(pending.eventKey, pending.params, pending.superProperties)
}
}
private fun reportEventInternal(eventKey: String, params: Map<String, Any>?, superProperties: Map<String, Any>) {
try {
synchronized(trackLock) {
TDAnalytics.setSuperProperties(JSONObject(superProperties))
val jsonObj = params?.let { JSONObject(it) }
TDAnalytics.track(eventKey, jsonObj)
StatisticLogger.d("数数SDK事件上报: $eventKey $jsonObj")
}
} catch (e: Exception) {
StatisticLogger.e("数数SDK事件上报失败: $eventKey", e)
}
}
}

View File

@ -8,7 +8,7 @@ plugins {
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
def buildTime = new Date().format('yyyyMMdd_HHmmss')
android {
namespace = "com.viddin.videos.free"
compileSdk libs.versions.compileSdk.get().toInteger()
@ -23,6 +23,11 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
applicationVariants.configureEach { variant ->
variant.outputs.configureEach {
outputFileName = "${variant.applicationId}_${variant.versionName}_${variant.versionCode}_${variant.buildType.name}_${buildTime}.apk"
}
}
buildTypes {
debug {
minifyEnabled false