使用Firebase的App在真机正常运行,却无法在Genymotion模拟器工作
嘿,我之前开发时也碰到过一模一样的糟心事!Firebase在Genymotion里各种罢工,但装到真机上就丝滑运行,多半是这几个常见的坑,给你挨个梳理下:
Google Play服务版本不兼容
Firebase核心功能严重依赖Google Play Services,而Genymotion默认镜像很多时候要么没预装Google Apps,要么预装的版本和你的项目要求不匹配——真机的Play服务一般都是自动更新到适配版本的。解决办法很简单:在Genymotion里给你的模拟器镜像安装对应API等级的OpenGApps包(Genymotion自带了安装入口,记得选和模拟器系统版本一致的包),安装后重启模拟器再试试。网络配置拦截了Firebase请求
Genymotion的默认NAT网络模式有时候会被本地防火墙或者路由器拦截,导致模拟器无法正常连接Firebase的服务器。你可以试试切换到桥接模式(在模拟器设置的网络选项里改),或者手动检查模拟器能不能访问firebase.googleapis.com——比如在模拟器的浏览器里打开这个域名,看能不能正常加载。另外,也可以检查下模拟器的DNS设置,改成公共DNS(比如8.8.8.8)试试。SHA-1指纹未添加模拟器调试密钥
你在Firebase控制台里添加的SHA-1指纹可能只有真机的(比如发布密钥的指纹),但Genymotion用的是本地的调试密钥指纹(默认路径是~/.android/debug.keystore)。Firebase会验证SHA-1指纹来授权App访问,没加模拟器的指纹自然会被拒绝。你可以用这个命令获取调试密钥的SHA-1:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android把得到的指纹添加到Firebase控制台的项目设置里,然后重新下载
google-services.json替换到项目中。模拟器API等级与项目Target不匹配
如果你的App的targetSdkVersion是较高版本(比如Android 13/14),但Genymotion模拟器用的是低版本系统(比如Android 10),可能会出现Firebase API的兼容性问题,或者某些权限在旧系统上的行为不一样。尽量让模拟器的系统API等级和项目的targetSdkVersion保持一致或接近,避免不必要的兼容问题。模拟器缓存导致初始化异常
有时候模拟器里的App缓存或者Firebase初始化缓存会出问题,导致即使配置正确也无法正常工作。你可以彻底卸载模拟器里的App,然后进入模拟器的设置清除缓存,再重新编译安装。或者用ADB命令强制卸载:adb uninstall com.your.package.name之后再重新运行项目试试。
我当时是因为Google Play服务版本太老,装了对应版本的GApps就解决了,你可以挨个排查下这些点,应该能找到问题所在!
内容的提问来源于stack exchange,提问作者ali shibli

