הפלאגין של Google Services Gradle

מבוא

כחלק מהפעלת Google APIs או שירותי Firebase באפליקציית Android, יכול להיות שתצטרכו להוסיף את הפלאגין google-services לקובץ build.gradle:

dependencies {
    classpath 'com.google.gms:google-services:4.4.3'
    // ...
}

לתוסף google-services יש שתי פונקציות עיקריות:

  1. מעבדים את קובץ google-services.json ומפיקים משאבי Android שאפשר להשתמש בהם בקוד של האפליקציה. לקבלת מידע נוסף, אפשר לעיין במאמר בנושא הוספת קובץ JSON.
  2. מוסיפים תלות בספריות בסיסיות שנדרשות לשירותים שהפעלתם. בשלב הזה צריך להחיל את הפלאגין Google Services Gradle בקובץ app/build.gradle, כך:
    apply plugin: 'com.google.gms.google-services'

    כדי לראות את התוצאה של השלב הזה, מריצים את הפקודה ./gradlew :app:dependencies.

הוספת קובץ ה-JSON

קובץ google-services.json ממוקם בדרך כלל בספרייה app/ (בשורש של מודול האפליקציה ב-Android Studio). החל מגרסה 2.2.0, הפלאגין תומך בקובצי JSON ספציפיים לסוג הבנייה ולטעם המוצר. מבני הספריות הבאים הם תקינים:

// dogfood and release are build types.
app/
    google-services.json
    src/dogfood/google-services.json
    src/release/google-services.json
    ...

הערה: אם מספקים קובץ google-services.json בספריית הגרסה, אפשר לשמור פרויקט נפרד ב-Firebase לקובצי ה-APK של הייצור.

כשמשתמשים בגרסאות שונות של מוצרים, גם מבני ספריות מורכבים יותר הם תקינים.

// free and paid are product flavors.
app/
    google-services.json
    src/dogfood/paid/google-services.json
    src/release/free/google-services.json
    ...

עיבוד קובץ ה-JSON

לקובץ google-services.json יש את המבנה הבסיסי הבא:

{
  "project_info": {...},
  "client": [...],
}

האובייקט project_info מכיל מידע כללי על הפרויקט, ואילו כל איבר במערך client מכיל מידע על הלקוחות (אפליקציות ל-Android) שהוספתם לפרויקט.

כשמעבדים את קובץ ה-JSON של אפליקציית Android, הפלאגין משתמש רק באובייקט client שתואם לשם החבילה (עבור סוג הבנייה הנוכחי) על סמך הלוגיקה הבאה:

  • לכל רכיב במערך client:
    • בודקים את הערך של client_info/android_client_info/package_name
    • אם שם החבילה תואם לערך הזה, הפונקציה מחזירה את אובייקט החבר.
  • אם אף אחד מהחברים ב-client לא תואם לשם החבילה, נוצר חריג.

בהמשך המסמך הזה נשתמש בסימון {YOUR_CLIENT} כדי להתייחס לאיבר במערך client שנקבע לפי התהליך שלמעלה.

התוצאה העיקרית של עיבוד ה-JSON היא יצירה של שני קובצי XML שאפשר להפנות אליהם כמשאבי Android בקוד Java. דוגמה לכל קובץ:

app/build/generated/res/google-services/{build_type}/values/values.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <! -- Present in all applications -->
    <string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>

    <! -- Present in applications with the appropriate services configured -->
    <string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
    <string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
    <string name="ga_trackingId" translatable="false">UA-65557217-3</string>
    <string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
    <string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="project_id" translatable="false">mydemoapp</string>

</resources>

app/build/generated/res/google-services/{flavor}/{build_type}/xml/global_tracker.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="ga_trackingId" translatable="false">UA-65557218-3</string>
</resources>

כל ערך בקובצי ה-XML מופיע בקובץ google-services.json במיקומים שמופיעים בהמשך. אם בפרויקט Android שלכם יש הגדרה שמונעת מכם להשתמש בפלאגין google-services, אתם יכולים ליצור מחדש את קובצי ה-XML באופן ידני באמצעות הערכים הבאים:

google_app_id:

{YOUR_CLIENT}/client_info/mobilesdk_app_id

gcm_defaultSenderId:

project_info/project_number

default_web_client_id:

{YOUR_CLIENT}/oauth_client/client_id (client_type == 3)

ga_trackingId:

{YOUR_CLIENT}/services/analytics-service/analytics_property/tracking_id

firebase_database_url:

project_info/firebase_url

google_api_key:

{YOUR_CLIENT}/api_key/current_key

google_crash_reporting_api_key:

{YOUR_CLIENT}/api_key/current_key

project_id:

project_info/project_id

פתרון בעיות

ש': במהלך הבנייה מופיעה לי הודעת השגיאה הבאה: "הקובץ google-services.json חסר בתיקיית השורש של המודול. התוסף Google Services לא יכול לפעול בלי זה".

תשובה: מסוף Firebase יעזור לכם להוריד את google-services.json. בנוסף, במדריכי ההתחלה המהירה של רוב ממשקי ה-API יש הוראות ליצירת הקובץ הזה. אחרי שמורידים את הקובץ google-services.json, מעתיקים אותו לתיקייה app/ של פרויקט Android Studio, או לתיקייה app/src/{build_type} אם משתמשים בכמה סוגי build.

ש: לא הצלחתי למצוא את הסמל R.string.gcm_defaultSenderId,‏ R.xml.global_tracker וכו'.

תשובה: צריך לוודא ששם החבילה בקובץ build.gradle זהה לשם החבילה שהזנתם כשנוצר קובץ google-services.json. אם אתם לא בטוחים, כדאי שתפעילו שוב את תהליך תחילת העבודה ותקבלו קובץ JSON חדש.