目录
前言与总体流程
通用准备(项目、SHA、包名、OAuth)
Google Sign-In 集成(控制台、依赖、Manifest、代码、Firebase 联动)
Facebook Login 集成(开发者平台、依赖、Manifest、代码、Firebase 联动)
Firebase 全家桶接入(项目创建、Analytics、Auth、Firestore、Realtime、Storage、FCM、Crashlytics、Remote Config)
Firebase Auth:用 Google/Facebook Token 登录(示例)
推送(FCM)接入要点与示例
Crashlytics / Performance / Remote Config 快速上手
ProGuard / R8、权限、隐私与合规(GDPR)
调试、常见错误与排查清单
最佳实践与安全建议
总结与发布清单
1. 前言与总体流程
集成 Google、Facebook、Firebase 的常见目标:
提供多种第三方登录方式(Google、Facebook);
使用 Firebase 提供的后端服务:认证(Auth)、实时数据库/Firestore、云存储、Crashlytics、远程配置、云消息(FCM)等;
在客户端通过第三方登录获取凭证(ID Token / Access Token),并交给 Firebase Auth 做联合登录,或者用于自有后端鉴权。
总体步骤(高层):
在各自控制台(Google Cloud / Facebook Developer / Firebase Console)注册应用、配置包名与 SHA-1。
在 Android 项目中配置 Gradle 依赖与 AndroidManifest。
在 Activity/Fragment 中实现登录流程,获取 token。
用 token 调用 FirebaseAuth.signInWithCredential(...) 或你自有后端换取 session。
配置 FCM、Crashlytics 等并在代码中初始化。
下面分项详细说明。
2. 通用准备(包名、SHA、OAuth 重点)
在开始之前请准备:
-
Android 包名(applicationId):如
com.example.app -
Debug/Release 的 SHA-1 和 SHA-256 指纹(用于 OAuth 客户端):
-
Android Studio Terminal:
bash# debug keystore keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android # release keystore keytool -list -v -keystore /path/to/your/release.jks -alias your_alias
-
-
Google Cloud Console / Facebook Developer / Firebase 控制台的账号权限(通常用项目 owner)。
为什么要 SHA-1:Google Sign-In 与 Firebase Auth 的 Android OAuth 依赖 SHA-1 来验证应用签名,Facebook 也会需要 key hashes(类似作用)。
3. Google Sign-In 集成(详)
3.1 Google Cloud / Firebase 控制台配置
向 Google Cloud Project 或 Firebase 项目中添加 Android 应用,填写包名和 SHA-1。
下载
google-services.json(Firebase 控制台)并放入app/目录。
3.2 Gradle 依赖(project & app)
build.gradle (project):
Groovy
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.4.0' // 或最新版
}
}
build.gradle (app):
Groovy
plugins { id 'com.android.application'; id 'kotlin-android' }
android { /* ... */ }
dependencies {
implementation 'com.google.android.gms:play-services-auth:20.6.0' // Google Sign-In SDK
implementation 'com.google.firebase:firebase-auth-ktx:22.1.0' // Firebase Auth
// 如果使用 Firebase 全家桶,别忘了 analytics/others
}
apply plugin: 'com.google.gms.google-services'
版本号请按当前最新稳定版本替换。
3.3 AndroidManifest
需要 INTERNET 权限(通常已加):
Groovy
<uses-permission android:name="android.permission.INTERNET" />
在 Activity 中处理结果无需在 Manifest 声明 Activity 特殊项(Google Sign-In 用 APIs 处理)。
3.4 Kotlin 示例:Google Sign-In(简洁版)
Kotlin
// Step 1: 配置 GoogleSignInOptions(获取 ID Token)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id)) // 从 google-services.json / 控制台获取
.requestEmail()
.build()
val client = GoogleSignIn.getClient(this, gso)
// Step 2: 发起登录
private val RC_SIGN_IN = 1001
fun signInWithGoogle() {
val signInIntent = client.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
// Step 3: 结果回调(Activity)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_SIGN_IN) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
val account = task.getResult(ApiException::class.java)
val idToken = account?.idToken
idToken?.let { firebaseAuthWithGoogle(it) }
} catch (e: ApiException) {
// 登录失败处理
}
}
}
// Step 4: 用 idToken 登录 Firebase(可选)
private fun firebaseAuthWithGoogle(idToken: String) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val user = FirebaseAuth.getInstance().currentUser
// 登录成功,处理 user
} else {
// 失败处理
}
}
}
3.5 注意点与常见坑
default_web_client_id来自google-services.json。如果 OAuth 客户端没配置正确,idToken会为空或验证失败。在 Release 构建时记得在 Firebase 控制台添加 Release keystore 的 SHA-1。
若要只使用 Google 登录而不使用 Firebase,拿到
idToken或accessToken交给自有后端即可。
4. Facebook Login 集成(详)
4.1 在 Facebook Developer 控制台配置
创建 Facebook App,添加 Android 平台:
填写包名(applicationId);
添加 Key Hash(debug/release):
keytool+openssl生成(或 Facebook docs 方法)。配置 OAuth redirect URIs(若使用 web flow)。
4.2 Gradle 依赖
在 app/build.gradle 中:
Groovy
dependencies {
implementation 'com.facebook.android:facebook-android-sdk:19.2.0' // 以最新版为准
implementation 'com.google.firebase:firebase-auth-ktx:22.1.0' // 若与 Firebase 联动
}
4.3 AndroidManifest(必需项)
XML
<manifest>
<application>
<!-- Facebook AppId -->
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<!-- Facebook Activity -->
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
<!-- 如果使用自定义登录回调,添加 -->
<activity android:name="com.facebook.CustomTabActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="@string/fb_login_protocol_scheme"/>
</intent-filter>
</activity>
</application>
</manifest>
在 strings.xml 添加:
XML
<string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string>
<string name="fb_login_protocol_scheme">fbYOUR_FACEBOOK_APP_ID</string>
4.4 Kotlin 示例:Facebook Login
Kotlin
class LoginActivity : AppCompatActivity() {
private lateinit var callbackManager: CallbackManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
FacebookSdk.sdkInitialize(applicationContext) // 有时不需要,官方有自动初始化
setContentView(R.layout.activity_login)
callbackManager = CallbackManager.Factory.create()
val loginButton = findViewById<LoginButton>(R.id.login_button)
loginButton.setPermissions(listOf("email", "public_profile"))
loginButton.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult) {
val accessToken = result.accessToken.token
// 交给 Firebase 登录或自家后端
firebaseAuthWithFacebook(accessToken)
}
override fun onCancel() { /* 取消 */ }
override fun onError(error: FacebookException) { /* 失败 */ }
})
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
callbackManager.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
private fun firebaseAuthWithFacebook(token: String) {
val credential = FacebookAuthProvider.getCredential(token)
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// 登录成功
} else {
// 失败处理
}
}
}
}
4.5 注意点
Facebook 的 Key Hash 必须正确,否则登录会出现
Invalid key hash错误(查看 Logcat 或 Facebook 控制台日志)。若使用自定义按钮而调用
LoginManager, 请确保CallbackManager处理onActivityResult。Android 11+ 与浏览器的 Custom Tab 自动重定向行为要注意:使用最新版 Facebook SDK 可以避免大多数问题。
5. Firebase 全家桶接入(详)
5.1 创建 Firebase 项目并添加 Android 应用
在 Firebase Console 中创建项目,选择或创建 Google Cloud 项目。
添加 Android 应用,填写包名,添加 SHA-1,下载
google-services.json到app/。
5.2 Gradle 配置(project & app)
build.gradle (project):
Groovy
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.4.0'
classpath 'com.google.firebase.crashlytics:firebase-crashlytics-gradle:2.9.6' // Crashlytics plugin
}
}
build.gradle (app):
Groovy
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
}
dependencies {
implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'
implementation 'com.google.firebase:firebase-auth-ktx:22.1.0'
implementation 'com.google.firebase:firebase-firestore-ktx:24.5.0'
implementation 'com.google.firebase:firebase-storage-ktx:20.2.0'
implementation 'com.google.firebase:firebase-messaging-ktx:23.1.0'
implementation 'com.google.firebase:firebase-crashlytics-ktx:18.3.10'
implementation 'com.google.firebase:firebase-perf-ktx:20.3.2'
}
版本请按当前最新稳定版本替换。
5.3 初始化(通常自动)
-
google-servicesplugin 会自动读取google-services.json并注入。 -
Crashlytics/Performance 需要在 Application 中初始化(通常 SDK 自动初始化即可):
Kotlin
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this) // 可选,通常自动
}
}
并在 Manifest 注册 Application。
6. Firebase Auth:用 Google / Facebook Token 登录(示例)
(上面我们已经在 Google/Facebook 部分演示了如何把 token 交给 Firebase)
通用流程:
获取第三方登录 token(Google
idToken/ FacebookaccessToken)。构建 Firebase Credential:
Google:
GoogleAuthProvider.getCredential(idToken, null)Facebook:
FacebookAuthProvider.getCredential(accessToken)
FirebaseAuth.getInstance().signInWithCredential(credential)完成登录。
6.1 Token 过期处理 & 安全
Firebase Auth 会处理 token 刷新与会话保持(client SDK)。
若你在后端使用 token 做验证,应在服务端使用 Firebase Admin SDK 验证 ID token 的有效性(不是在客户端完成)。
7. Firebase Cloud Messaging(FCM)接入要点
7.1 Gradle 依赖(见上)
7.2 Manifest 权限与 Service
AndroidManifest.xml:
XML
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
7.3 实现 Service
Kotlin
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// 将 token 上传到你的后端
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
// 处理通知/透传消息
val data = remoteMessage.data
val notification = remoteMessage.notification
// 构建 Notification 展示给用户(若需要)
}
}
7.4 获取 token 并上传服务器
Kotlin
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
// 上传到后端
}
}
7.5 注意点
在 Android 13 以上,推送不需要额外通知权限(但通知通道需设置)。
在某些厂商手机,需要做额外适配(自启、后台限制)--- 在用户文档中告知如何开启推送相关权限。
FCM 数据消息(透传)在某些系统上被系统杀死时可能收不到,重要数据最好同步到后端并在应用启动时拉取。
8. Crashlytics / Performance / Remote Config 快速上手
8.1 Crashlytics
-
集成依赖并插件(见上),Crashlytics 会自动捕获未捕获异常。
-
在调试时想强制发送崩溃报告,可以手动触发:
Kotlin
Firebase.crashlytics.recordException(Exception("Test exception"))
- 确保在 Firebase Console 中接受隐私合规条款并在 Release 构建打开上传符号(mapping file)。
8.2 Performance Monitoring
- 添加
firebase-perf-ktx,性能监控会自动捕获基本指标;可自定义 trace:
Kotlin
val trace = Firebase.performance.newTrace("load_home")
trace.start()
// do work
trace.stop()
8.3 Remote Config
- 获取默认参数、拉取远程配置:
Kotlin
val remoteConfig = Firebase.remoteConfig
remoteConfig.setDefaultsAsync(mapOf("welcome_msg" to "Hello"))
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
if (task.isSuccessful) {
val message = remoteConfig.getString("welcome_msg")
}
}
9. ProGuard / R8、权限、隐私与合规(GDPR)
9.1 ProGuard / R8 规则(常见)
diff
# Firebase
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**
-keepattributes *Annotation*
# Facebook SDK
-keep class com.facebook.** { *; }
-dontwarn com.facebook.**
# Google Play services
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**
实际情况参考 SDK 文档的最新 ProGuard 规则,把混淆规则放入
proguard-rules.pro。
9.2 权限
最小化权限:只有必要时声明权限(INTERNET、POST_NOTIFICATIONS(Android13+)等)。
若使用相机/相册/位置等,要在运行时申请并说明用途。
9.3 隐私合规(GDPR、CCPA 等)
收集个人信息(邮箱、姓名、照片)需用户明确同意。
提供隐私与数据处理声明(隐私政策)。
支持用户注销 / 删除账户并删除服务器端数据。
Crashlytics、Analytics 等需在隐私策略中声明,并在必要时提供开启/关闭选项。
10. 调试、常见错误与排查清单
常见错误与解决办法
idToken == null(Google Sign-In)
- 确认
requestIdToken()使用的 web client id 与 Firebase 项目一致;检查google-services.json与 OAuth 客户端配置和 SHA-1。
Invalid key hash(Facebook)
- 在 Logcat 或 Facebook 控制台查看 key hash,使用
keytool/openssl生成,并添加到 Facebook 开发者设置。Firebase Auth
ERROR_INVALID_CREDENTIAL
- token 过期或不匹配,重新获取第三方 token 并重试。
FCM 无法收到通知
- 检查
google-services.json、包名、SHA 是否一致;确保 Service 注册正确、系统通知权限与厂商限制。Crashlytics 不上报崩溃
- 确保 release build 上传 mapping(在 CI 中配置
uploadMapping),并未关闭 Crashlytics。在 debug 模式 Crashlytics 有延迟或不自动上传。
调试小贴士
使用真实设备测试 third-party login(部分 emulator 没有 Google Play 或浏览器 behavior)。
在 Firebase Console 的 Authentication -> Sign-in method 中启用 Google / Facebook。
在 Facebook App 下的 "App Review" 中,测试帐号才能使用未审核权限。
使用
adb logcat获取 SDK 报错信息(Facebook/Google SDK 都会打印详细日志)。
11. 最佳实践与安全建议
不在客户端保存敏感 token(长期) :短期凭证可以保存在
EncryptedSharedPreferences,长期凭证应由服务器管理并下发会话 token。后台校验 token:后端使用 Firebase Admin SDK 或 Google APIs 验证 ID Token。
CI/CD 自动化:在 CI 中自动化上传 mapping 文件和构建产物,确保 Crashlytics 的符号表可用。
按需初始化 SDK:避免在 Application 中初始化不必要的 SDK,按需延迟加载可提高冷启动速度。
监控与埋点:使用 Firebase Analytics 或自建埋点监控登录、推送 token 注册、关键错误等。
测试账户管理:在 Facebook 上添加测试用户,在 Google OAuth 客户端上配置测试用户 / 测试域。
12. 发布前检查清单(Release checklist)
在 Firebase 控制台添加 Release SHA-1(确保 Auth 在 release 下工作)
在 Facebook 设置好 release key hash 和 app review(或在 review 前使用测试用户)
google-services.json为正确环境(prod vs staging)Crashlytics、Perf 的 Gradle plugin 已配置并 mapping 上传自动化
ProGuard / R8 规则已验证(release build 测试)
隐私政策与用户同意(登录与数据收集)已实现并可追踪
FCM 推送在主要机型上验证(小米、华为等特殊厂商)
参考示例代码仓库结构(建议)
/app /src/main /java/com/example/app /auth GoogleAuthManager.kt FacebookAuthManager.kt FirebaseAuthRepository.kt MyFirebaseMessagingService.kt MainActivity.kt AndroidManifest.xml google-services.json build.gradle proguard-rules.pro
下面是一个 Demo 项目结构 + 核心代码 ,以及一个 分步骤教程的文字说明:
一、Demo 项目结构(目录示例)
FirebaseGoogleFacebookDemo/ ├── app/ │ ├── src/ │ │ ├── main/ │ │ │ ├── java/com/example/demo/ │ │ │ │ ├── auth/ │ │ │ │ │ GoogleAuthManager.kt │ │ │ │ │ FacebookAuthManager.kt │ │ │ │ │ FirebaseAuthRepository.kt │ │ │ │ ├── messaging/ │ │ │ │ │ MyFirebaseMessagingService.kt │ │ │ │ ├── ui/ │ │ │ │ │ MainActivity.kt │ │ │ │ │ LoginActivity.kt │ │ │ │ └── DemoApplication.kt │ │ │ ├── AndroidManifest.xml │ │ │ └── res/ │ │ │ ├── layout/ │ │ │ │ activity_main.xml │ │ │ │ activity_login.xml │ │ │ └── values/ │ │ │ strings.xml │ ├── build.gradle │ └── proguard-rules.pro ├── build.gradle └── settings.gradle
二、核心代码示例
下面是 Demo 项目中几个关键文件的示例代码,可复制入项目中并调试。
2.1 DemoApplication.kt
Kotlin
package com.example.demo
import android.app.Application
import com.google.firebase.FirebaseApp
class DemoApplication : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
// 其他 SDK 如 Facebook 初始化如果必要
}
}
记得在 AndroidManifest.xml 中设置 android:name=".DemoApplication"。
2.2 GoogleAuthManager.kt
Kotlin
package com.example.demo.auth
import android.app.Activity
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.FirebaseAuth
object GoogleAuthManager {
private const val RC_GOOGLE_SIGN_IN = 1001
fun makeSignInIntent(activity: Activity): android.content.Intent {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(activity.getString(R.string.default_web_client_id))
.requestEmail()
.build()
return GoogleSignIn.getClient(activity, gso).signInIntent
}
fun handleSignInResult(
activity: Activity,
data: android.content.Intent?,
onSuccess: (uid: String) -> Unit,
onFailure: (Exception) -> Unit
) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
val account = task.getResult(com.google.android.gms.common.api.ApiException::class.java)
val idToken = account?.idToken
if (idToken != null) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener(activity) { task2 ->
if (task2.isSuccessful) {
val user = FirebaseAuth.getInstance().currentUser
user?.uid?.let { onSuccess(it) }
} else {
task2.exception?.let { onFailure(it) }
}
}
} else {
onFailure(Exception("ID Token is null"))
}
} catch (e: Exception) {
onFailure(e)
}
}
}
2.3 FacebookAuthManager.kt
Kotlin
package com.example.demo.auth
import android.app.Activity
import com.facebook.AccessToken
import com.facebook.login.LoginManager
import com.facebook.login.LoginResult
import com.facebook.CallbackManager
import com.facebook.FacebookCallback
import com.facebook.FacebookException
import com.google.firebase.auth.FacebookAuthProvider
import com.google.firebase.auth.FirebaseAuth
class FacebookAuthManager(private val activity: Activity) {
val callbackManager = CallbackManager.Factory.create()
fun loginWithFacebook(onSuccess: (uid: String) -> Unit, onFailure: (Exception) -> Unit) {
LoginManager.getInstance().logInWithReadPermissions(activity, listOf("email", "public_profile"))
LoginManager.getInstance().registerCallback(callbackManager,
object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult) {
handleAccessToken(result.accessToken, onSuccess, onFailure)
}
override fun onCancel() {
onFailure(Exception("Facebook login canceled"))
}
override fun onError(error: FacebookException) {
onFailure(error)
}
})
}
private fun handleAccessToken(token: AccessToken, onSuccess: (String) -> Unit, onFailure: (Exception) -> Unit) {
val credential = FacebookAuthProvider.getCredential(token.token)
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener(activity) { task ->
if (task.isSuccessful) {
FirebaseAuth.getInstance().currentUser?.uid?.let { onSuccess(it) }
} else {
task.exception?.let { onFailure(it) }
}
}
}
}
在 Activity 的 onActivityResult 中调用 callbackManager.onActivityResult(...)。
2.4 MyFirebaseMessagingService.kt
Kotlin
package com.example.demo.messaging
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// 上传 token 给你后端或者关联用户
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
// 处理消息、通知显示
}
}
2.5 LoginActivity.kt
Kotlin
package com.example.demo.ui
import android.os.Bundle
import android.app.Activity
import android.content.Intent
import com.example.demo.R
import com.example.demo.auth.GoogleAuthManager
import com.example.demo.auth.FacebookAuthManager
class LoginActivity : Activity() {
private lateinit var facebookAuthManager: FacebookAuthManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
facebookAuthManager = FacebookAuthManager(this)
findViewById<android.view.View>(R.id.btn_google).setOnClickListener {
startActivityForResult(GoogleAuthManager.makeSignInIntent(this), 1001)
}
findViewById<android.view.View>(R.id.btn_facebook).setOnClickListener {
facebookAuthManager.loginWithFacebook(
onSuccess = { uid ->
// 登录成功
}, onFailure = { e ->
e.printStackTrace()
}
)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1001) {
GoogleAuthManager.handleSignInResult(this, data,
onSuccess = { uid -> /* 登录成功 */ },
onFailure = { e -> e.printStackTrace() }
)
}
facebookAuthManager.callbackManager.onActivityResult(requestCode, resultCode, data)
}
}
III. 步骤截图版教程(文字 + 拍摄提示)
下面是你在写博客教程时可以搭配截图的步骤说明。你可以在每一步操作时截控制台、控制面板、Android Studio UI 来丰富教程。
步骤 1:创建 Firebase 项目 & 添加 Android 应用
在 Firebase Console → "项目设置" → "添加应用" → 选择 Android → 填写包名、SHA-1 → 下载
google-services.json截图:Firebase 控制台添加应用界面 + 下载
google-services.json
步骤 2:在 Google Cloud Console 创建 OAuth 客户端
在 Google Cloud → API & Services → 凭据 → 创建 OAuth 2.0 客户端 ID → 类型为 Android → 填包名和 SHA-1
启用 Google Sign-In API
截图:创建 OAuth 客户端界面 + 包名 / SHA-1 填写界面
步骤 3:在 Facebook Developer 控制台配置 Android 平台
登录 Facebook Developer → 选择你的 App → 设置 → 加平台 → Android → 填包名 + key hash
获取 key hash:在本地
keytool | openssl生成,复制粘贴截图:Facebook 控制台 Android 平台配置界面 + Key Hash 填写界面
步骤 4:配置 Android 项目的 Gradle 和 Manifest
将
google-services.json放到app/目录修改
settings.gradle/build.gradle(project & app)加入 Firebase / Google / Facebook plugin 与 SDK 依赖在
AndroidManifest.xml添加 Facebook 相关<meta-data>与 Activity截图:Gradle 文件(project & app)代码片段 + AndroidManifest 中关键部分
步骤 5:启动 Demo 应用,测试 Google 登录
启动 APP → 点击 "Google 登录" 按钮 → 弹出 Google 登录界面 → 选择账号 → 返回并登录成功
截图:Google 登录界面 / 登录后用户页面
步骤 6:测试 Facebook 登录
启动 APP → 点击 "Facebook 登录" → 弹出 Facebook 授权界面 → 同意登录 → 返回应用
截图:Facebook 登录授权界面 / 登录后用户页面
步骤 7:Firebase 控制台验证 Authentication
在 Firebase Console → Authentication → 用户页,查看是否有刚才登录的用户 UID
截图:Firebase Authentication 控制台用户列表,展示 UID / email
步骤 8:测试推送功能(FCM)
在 Firebase Console → Cloud Messaging → 发送测试通知到该设备
观察手机收到通知 / 在
onMessageReceived的打印截图:Firebase 控制台发送通知界面 + 手机收到通知界面
步骤 9:测试崩溃日志(Crashlytics)
在 APP 中抛出一个未捕获异常(比如
throw RuntimeException("Test Crash"))等待一段时间,在 Firebase Console → Crashlytics 查看受影响版本、堆栈信息
截图:APP 崩溃界面 + Crashlytics 控制台崩溃日志界面
步骤 10:业务流程整合说明与截图
在你博客里,可以给出一张整体流程图(Google 登录 → Firebase Auth → 后端 Session / Token,Facebook 登录流程类似),搭配每一步操作的截图说明。
IV. 补充建议
在博客中把这些截图高亮关键字段(包名、SHA、OAuth 客户端 ID、Key Hash 等)
对于调试错误(如 key hash 错误、idToken null 错误)要给出常见报错信息截图 + 解决方案
如果你用 CI/CD 自动化发布,还可以补充 mapping 上报、自动构建脚本截图
结语
集成 Google、Facebook 与 Firebase 看似繁杂,但按"控制台配置 → Gradle 依赖 → Manifest 权限 → 代码集成 → 后端验证"的步骤系统化操作,就能稳妥完成。
务必把安全与隐私放在优先考量:签名(SHA)、token 校验、用户同意与删除数据能力是上生产线前的关键。