You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用发布后Firebase Analytics中GAID显示‘未设置’或默认值求助

问题:Play商店发布后GAID获取异常,调试正常

在应用启动页(Splash Activity)获取并上报GAID时,调试模式(物理设备+Firebase调试工具)下能正常获取并上报正确的GAID作为自定义用户属性,但Play商店正式发布后,大部分用户设备上报的GAID要么显示not set,要么是默认值00000000-0000-0000-000000000000,问题已持续一个多月。

现有实现代码

CoroutineScope(Dispatchers.IO).launch {
        var idInfo: AdvertisingIdClient.Info? = null
        try {
            idInfo = AdvertisingIdClient.getAdvertisingIdInfo(context.applicationContext)
        } catch (e: GooglePlayServicesNotAvailableException) {
            e.printStackTrace()
        } catch (e: GooglePlayServicesRepairableException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        var advertId: String? = null
        try {
            advertId = idInfo?.id
        } catch (e: NullPointerException) {
            e.printStackTrace()
        }
        Log.d(TAG, "onCreate:AD ID $advertId")
        dispatchUserProperty(FbUserProperty.DEVICE_AD_ID, advertId)
}

/**
 * Method to dispatch user property
 */
private fun dispatchUserProperty(key: String, value: String?) {
    if (!CommonUtilsOld.isFirebaseAppInitialized()) return
    Log.d(TAG, "dispatchUserProperty() called with: key = [$key], value = [$value]")
    FbaController.setUserProperty(key, value)
}

/**
 * Method to check if firebase app has been initialized
 */
public static boolean isFirebaseAppInitialized(){
    return !FirebaseApp.getApps(MainApplication.getInstance()).isEmpty();
}

已配置的依赖与权限

  • 应用级gradle依赖:
    implementation 'com.google.android.gms:play-services-ads:22.1.0'
    
  • 清单文件权限:
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
    

问题原因及解决方案

1. 未处理用户广告跟踪限制设置

Android 13+用户可在系统设置中关闭广告跟踪,此时AdvertisingIdClient.Info.getId()会返回默认的00000000-0000-0000-000000000000,同时isLimitAdTrackingEnabled()返回true。你的代码直接上报空值或默认值,未区分用户主动限制的场景。

解决:
先判断限制广告跟踪状态,根据业务需求处理上报逻辑:

val idInfo = AdvertisingIdClient.getAdvertisingIdInfo(context)
val isLimitAdTracking = idInfo.isLimitAdTrackingEnabled
val finalAdId = if (isLimitAdTracking) "LIMITED_AD_TRACKING" else idInfo.id

2. Firebase初始化时机滞后

启动页冷启动时,Firebase初始化可能晚于协程执行,导致dispatchUserProperty因isFirebaseAppInitialized()返回false而直接跳过上报。调试环境下初始化速度更快,不会触发该问题。

解决:

  • 在Application类的onCreate中提前完成Firebase初始化,确保启动页执行时已初始化完成;
  • 若无法提前初始化,可监听Firebase初始化回调,或延迟执行GAID上报:
    // 等待Firebase初始化完成
    FirebaseApp.initializeApp(context).addOnCompleteListener {
        if (it.isSuccessful) {
            FbaController.setUserProperty(FbUserProperty.DEVICE_AD_ID, advertId)
        }
    }
    

3. 启动页生命周期导致协程被取消

正式发布后启动页可能快速跳转到主页面,协程因页面销毁被取消,导致GAID获取或上报逻辑未执行完成。调试模式下启动页停留时间长,协程能完整执行。

解决:

  • 将GAID获取逻辑移至Application类中,脱离页面生命周期限制;
  • 使用与启动页生命周期绑定的协程,如viewModelScope,确保任务能完成:
    // 在SplashViewModel中执行
    viewModelScope.launch(Dispatchers.IO) {
        // GAID获取及上报逻辑
    }
    

4. ProGuard/R8混淆破坏了GAID相关类

正式发布开启混淆后,若未保留AdvertisingIdClient相关类,会导致反射调用失败,无法获取GAID。

解决:
在proguard-rules.pro中添加混淆规则:

-keep class com.google.android.gms.ads.identifier.** { *; }
-keep interface com.google.android.gms.ads.identifier.** { *; }

5. 异常捕获范围不足

你的代码仅捕获3种异常,但AdvertisingIdClient.getAdvertisingIdInfo()还可能抛出SecurityException、IllegalStateException等,导致idInfo为null,最终上报空值。

解决:
扩大异常捕获范围,记录详细日志便于排查:

try {
    idInfo = AdvertisingIdClient.getAdvertisingIdInfo(context.applicationContext)
} catch (e: Exception) {
    Log.e(TAG, "Failed to retrieve GAID", e)
}

内容的提问来源于stack exchange,提问作者M. Arabi Hasan Sakib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:12:50