Expo SDK42安卓应用更新广告后Google Play上架包启动崩溃求助
问题排查与修复方案
1. 优先检查app.json的AdMob配置
Expo Go调试环境内置了AdMob基础配置,生产构建必须手动补充配置才可以正常运行:
- 确认你已经在app.json的
expo.android.config节点下添加了AdMob应用ID,示例:
{ "expo": { "android": { "config": { "googleMobileAdsAppId": "你的正式AdMob应用ID" } } } }
注意:这里不能用测试ID,必须填写你在AdMob后台申请的对应应用的正式应用ID,不是广告位ID
2. 给广告调用逻辑添加错误捕获
你当前的adFunction是异步函数,没有任何错误捕获逻辑,只要广告请求失败、广告无填充、重复调用等任意异常出现,都会直接触发应用崩溃,本地调试网络环境稳定、测试广告填充率100%所以不会触发,生产环境很容易遇到异常,修改代码如下:
const adFunction = async() => { try { // 先判断是否已经有广告在加载/展示,避免重复调用 if (await AdMobInterstitial.isLoadedAsync() || await AdMobInterstitial.isShowingAsync()) { return } await AdMobInterstitial.setAdUnitID('上线时替换为正式插屏广告位ID'); await AdMobInterstitial.requestAdAsync({ servePersonalizedAds: true}); // 加载成功后再展示 if (await AdMobInterstitial.isLoadedAsync()) { await AdMobInterstitial.showAdAsync(); } } catch (e) { // 此处可添加自定义日志逻辑,不会导致应用崩溃 console.log('广告加载失败', e) } }
3. 修复定时器的不合理调用
你当前在useEffect里直接用setInterval每隔45秒触发一次广告调用,完全没有判断上一次广告的执行状态,插屏广告是单例模式,重复调用请求/展示方法极容易导致状态冲突崩溃,建议调整为:
- 不要用固定间隔触发,改为用户完成某个操作(比如返回页面、点击按钮)时触发
- 如果必须用间隔,需要在回调里加状态判断,或者把setInterval替换为setTimeout,每次广告执行完成后再调度下一次
4. 检查混淆和权限配置
- 如果你的构建开启了代码混淆,需要在app.json里添加AdMob的混淆规则,避免相关类被误删
- 确认安卓权限配置已经添加了
INTERNET、ACCESS_NETWORK_STATE,如果你的targetSdkVersion >=31,还需要添加com.google.android.gms.permission.AD_ID权限
5. 测试验证建议
不要直接上传到Google Play测试,可以先本地打生产环境的apk包安装测试,生产apk的表现和Google Play上架的包完全一致,能直接复现问题排查,不需要等Google Play审核。
内容的提问来源于stack exchange,提问作者vagabondzero
相关产品推荐
相关产品推荐

