Wtyczka Gradle usług Google

Wprowadzenie

Aby włączyć interfejsy API Google lub usługi Firebase w aplikacji na Androida, konieczne może być dodanie do pliku build.gradle wtyczki google-services:

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

Wtyczka google-services ma 2 główne funkcje:

  1. Przetwarzanie pliku google-services.json i tworzenie zasobów Androida, których można używać w kodzie aplikacji. Więcej informacji znajdziesz w sekcji Dodawanie pliku JSON.
  2. Dodaj zależności dla podstawowych bibliotek wymaganych przez włączone usługi. W tym celu musisz zastosować wtyczkę usług Google w pliku app/build.gradle w ten sposób:
    apply plugin: 'com.google.gms.google-services'

    Wynik tego kroku możesz zobaczyć, wykonując polecenie ./gradlew :app:dependencies.

Dodawanie pliku JSON

Plik google-services.json jest zwykle umieszczany w katalogu app/ (w katalogu głównym modułu aplikacji w Android Studio). Od wersji 2.2.0 wtyczka obsługuje pliki JSON związane z typami kompilacji i wersjami produktów. Wszystkie te struktury katalogów są prawidłowe:

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

Uwaga: podanie pliku google-services.json w katalogu wersji umożliwia prowadzenie osobnego projektu Firebase na potrzeby produkcyjnych plików APK.

Gdy używasz wersji produktu, te bardziej skomplikowane struktury katalogów są również prawidłowe.

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

Przetwarzanie pliku JSON

Plik google-services.json ma taką podstawową strukturę:

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

Obiekt project_info zawiera ogólne informacje o projekcie, a każdy element tablicy client zawiera informacje o klientach (aplikacje na Androida) dodanych do projektu.

Podczas przetwarzania pliku JSON aplikacji na Androida wtyczka używa tylko obiektu client, który pasuje do nazwy pakietu (dla bieżącego typu kompilacji) na podstawie tej logiki:

  • Dla każdego elementu tablicy client:
    • Sprawdź wartość client_info/android_client_info/package_name.
    • Jeśli nazwa pakietu pasuje do tej wartości, zwraca obiekt członka.
  • Jeśli żaden z elementów w grupie client nie pasuje do nazwy pakietu, zostanie rzucony wyjątek.

W dalszej części tego dokumentu użyjemy symbolu {YOUR_CLIENT}, aby odwoływać się do elementu tablicy client określonego przez powyższą procedurę.

Głównym rezultatem przetwarzania pliku JSON jest wygenerowanie 2 plików XML, do których możesz się odwoływać w kodzie Java jako do zasobów Androida. Poniżej znajdziesz przykład każdego pliku:

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>

Wszystkie wartości w plikach XML znajdują się w pliku google-services.json w miejscach podanych poniżej. Jeśli Twój projekt na Androida ma konfigurację, która uniemożliwia korzystanie z wtyczki google-services, możesz ręcznie ponownie utworzyć pliki XML, używając tych wartości:

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

Rozwiązywanie problemów

Pytanie: podczas kompilowania pojawia się komunikat o błędzie „Plik google-services.json nie istnieje w katalogu głównym modułu. Bez tego interfejsu API usług Google wtyczka nie będzie działać.

Odp.: google-services.json możesz pobrać w konsoli Firebase. Ponadto w przewodnikach Krótkie wprowadzenie do większości interfejsów API znajdziesz instrukcje generowania tego pliku. Po pobraniu pliku google-services.json skopiuj go do folderu app/ w projekcie w Android Studio lub do folderu app/src/{build_type}, jeśli używasz wielu typów kompilacji.

Pytanie: nie mogę znaleźć symbolu „R.string.gcm_defaultSenderId”, „R.xml.global_tracker” itp.

Odp.: upewnij się, że nazwa pakietu w pliku build.gradle odpowiada nazwie pakietu podanej podczas tworzenia pliku google-services.json. Jeśli nie masz pewności, ponownie przejdź przez proces uruchamiania i uzyskaj nowy plik JSON.