Wtyczka Gradle usług Google

Wstęp

Podczas włączania interfejsów API Google lub usług Firebase w aplikacji na Androida może być konieczne dodanie wtyczki google-services do pliku build.gradle:

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

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

  1. Przetwarzanie pliku google-services.json i tworzenie zasobów Androida, których można użyć w kodzie aplikacji. Więcej informacji znajdziesz w artykule Dodawanie pliku JSON.
  2. Dodaj zależności podstawowych bibliotek wymaganych do włączonych usług. Ten krok wymaga zastosowania wtyczki Gradle usług Google w pliku app/build.gradle w taki sposób:
    apply plugin: 'com.google.gms.google-services'

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

Dodawanie pliku JSON

Plik google-services.json zwykle znajduje się 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 konkretnym typem kompilacji i smaku produktu. 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: umieszczenie pliku google-services.json w katalogu wersji umożliwia utrzymanie osobnego projektu Firebase dla produkcyjnych plików APK.

Gdy używane są różne rodzaje usług, również obowiązują te bardziej złożone struktury katalogów.

// 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 (aplikacjach na Androida) dodanych do projektu.

Podczas przetwarzania pliku JSON na potrzeby aplikacji na Androida wtyczka używa tylko obiektu client pasującego do nazwy pakietu (w przypadku bieżącego typu kompilacji) zgodnie z tą logiką:

  • Dla każdego elementu tablicy client:
    • Sprawdź wartość client_info/android_client_info/package_name
    • Jeśli nazwa pakietu jest zgodna z tą wartością, zwróć obiekt użytkownika.
  • Jeśli żaden z elementów client nie pasuje do nazwy pakietu, zostanie zgłoszony wyjątek.

W pozostałej części tego dokumentu użyjemy właściwości {YOUR_CLIENT}, aby odwoływać się do elementu tablicy client określonej w podanej wyżej procedurze.

Głównym wynikiem przetwarzania JSON jest utworzenie 2 plików XML, do których można się odwoływać w kodzie Java jako zasobów Androida. Oto 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 z plików XML znajdują się w pliku google-services.json w poniższych lokalizacjach. Jeśli w Twoim projekcie na Androida skonfigurowano konfigurację, która uniemożliwia korzystanie z wtyczki google-services, możesz bezpiecznie odtworzyć pliki XML ręcznie, 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

P. Podczas kompilacji pojawia się komunikat o błędzie: „W folderze głównym modułu brakuje pliku google-services.json. Bez niej wtyczka usług Google nie będzie działać”.

Odp.: Konsola Firebase pomoże Ci pobrać google-services.json. Ponadto w krótkich przewodnikach po większości interfejsów API znajdują się instrukcje generowania tego pliku. Po pobraniu pliku google-services.json skopiuj go do folderu app/ projektu w Android Studio lub do folderu app/src/{build_type}, jeśli korzystasz z wielu typów kompilacji.

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

O: Upewnij się, że nazwa pakietu w pliku build.gradle jest taka sama jak nazwa pakietu wpisana podczas tworzenia pliku google-services.json. Jeśli nie masz pewności, wykonaj ponownie procedurę rozpoczynania i pobierz nowy plik json.