应用发布后Firebase Analytics中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

