关于Release版本中google-services.json处理及SHA-1指纹移除问题
1. 构建Android应用Release版本时,如何确保google-services.json不会被打包进APK?
先给你吃个定心丸:默认情况下,google-services.json根本不会被打包进APK。Google Services插件只是读取这个文件里的配置,自动生成对应的资源文件、Manifest配置,原文件本身不会被包含到最终的APK包中。
不过如果你还是想彻底排除它(比如你不小心把它放到了资源目录里),可以在Android模块的build.gradle(Flutter项目里是android/app/build.gradle)中添加打包排除规则:
android { // ... 其他现有配置 packagingOptions { exclude 'google-services.json' } }
另外要注意:正确存放google-services.json的位置是Android模块的根目录(也就是android/app/google-services.json),别把它放到src/main/assets或者其他会被打包的资源文件夹里,这样插件只会读取它,不会打包。
2. Flutter集成Firebase后,如何在Release版本中移除google-services.json里的SHA-1指纹避免泄露?
首先得澄清一个关键点:SHA-1指纹是Firebase用来验证你的应用身份的,Release版本其实需要配置正确的Release指纹才能让Firebase功能正常工作(比如登录、推送消息)。如果你直接删掉它,可能会导致Firebase服务无法和你的应用交互。不过如果是担心代码仓库泄露指纹,或者有特殊需求,这里有几个可行的方案:
方案1:用Firebase控制台管理指纹(最推荐)
你完全不需要在google-services.json里硬编码指纹,Firebase控制台会帮你存储所有允许的应用指纹:
- 编辑你的google-services.json,删掉
client[0].sha1字段 - 登录Firebase控制台,进入你的项目 → 项目设置 → 对应应用 → 添加你的Release版本SHA-1指纹到应用配置里
- 这样Firebase依然能正常验证你的应用,而google-services.json里不会有任何指纹信息,就算提交到仓库也不用担心泄露
方案2:按构建变体分离配置
给Debug和Release版本分别用不同的google-services.json:
- 在Android模块下创建
src/debug和src/release两个目录 - 把带Debug指纹的google-services.json放在
src/debug,把移除了指纹(或者只保留Release必要配置)的google-services.json放在src/release - Google Services插件会自动根据你当前的构建变体(Debug/Release)加载对应的配置文件,完美隔离两种环境的配置
方案3:手动配置Firebase,彻底抛弃google-services.json
如果你不想依赖google-services.json,可以手动在项目里配置Firebase所需的参数:
- 从Firebase控制台获取你的项目ID、API密钥、应用ID等核心配置
- 在
res/values/strings.xml里添加这些值(记得设置translatable="false"):<string name="firebase_project_id" translatable="false">你的项目ID</string> <string name="firebase_api_key" translatable="false">你的API密钥</string> <string name="firebase_app_id" translatable="false">你的应用ID</string> - 在
AndroidManifest.xml的<application>标签里添加对应的meta-data:<meta-data android:name="com.google.firebase.project_id" android:value="@string/firebase_project_id" /> <meta-data android:name="com.google.firebase.api_key" android:value="@string/firebase_api_key" /> <meta-data android:name="com.google.firebase.app_id" android:value="@string/firebase_app_id" /> - 这种方式完全不需要google-services.json,自然也不存在指纹泄露的问题,但需要你手动维护配置,适合有特殊定制需求的场景
最后再提个小提醒:就算google-services.json里有SHA-1指纹,它也不会被打包进APK——插件只是读取信息生成配置,APK里不会包含原文件。但如果你的代码仓库是公开的,一定要把google-services.json加入.gitignore,别把它提交上去,这才是最根本的防护措施。
内容的提问来源于stack exchange,提问作者Rafael

