Co tak naprawdę robi google-services.json?

120

Pracuję nad dodaniem usług Google Analytics i GCM do mojej obecnej aplikacji. W przewodniku dotyczącym wdrażania obu usług Google prosi programistę o wygenerowanie pliku json: google-services.json i umieszczenie go w katalogu głównym aplikacji.

Zauważyłem, że nawet jeśli usunę ten plik json z mojej aplikacji, usługi nadal będą działać.

Po prostu chcesz wiedzieć na pewno, do czego naprawdę służy ten plik? Jakie jest zastosowanie i jak działa?

Arthur Wang
źródło

Odpowiedzi:

197

Zbadałem trochę w sprawie wtyczki Google-services i json i znalazłem źródła tej wtyczki.

Po pierwsze

Gradle-plugin google-services, do którego odwołuje się ścieżka klasy i ma zastosowanie, jest wtyczką tylko do kompilacji! Więc ma to wpływ tylko na proces tworzenia aplikacji, ale nie na proces wykonywania!

Ta wtyczka jest pomyślana tylko jako pomoc w szybkiej integracji usług Google w Twojej aplikacji. Oczywiście proces ten jest nieco zawiły i nie jest udokumentowany, więc Google powinien był wyjaśnić, co robi ten proces.

W rzeczywistości znalazłem kod źródłowy wtyczki w wersji com.google.gms: google-services: 1.4.0-beta3 i nie znalazłem w nim żadnego konkretnego odniesienia dotyczącego zaproszeń do aplikacji, ani nie znalazłem żadnego interfejsu API Google dla zaproszeń do aplikacji! (Ale może po prostu używa ogólnego projektu API z identyfikatorem projektu, nie próbowałem tego)

Co to robi

Wtyczka gradle-service google-services szuka wspomnianego pliku google-services.json w module aplikacji. Następnie szuka skonfigurowanych ustawień, takich jak identyfikator projektu, identyfikator śledzenia itp., Wygenerowany przez konsolę programisty Google API w pliku google-services.json. Na podstawie znalezionych ustawień wartości zasobów systemu Android są generowane w następującej ścieżce:

$project.buildDir/generated/res/google-services/$variant.dirName/values/values.xml

Na przykład w przypadku kompilacji do debugowania aplikacji:

app/build/generated/res/google-services/debug/values/values.xml

Np. Jeśli postępujesz zgodnie z samouczkiem GCM, plik JSON będzie zawierał identyfikator projektu interfejsu API jako następujący zasób androida:

<string name="gcm_defaultSenderId">project-id</string>

Więc ta wtyczka i plik JSON nie są niezbędne do uruchamiania lub publikowania aplikacji, jest to tylko pomocnik szybkiego startu do generowania podstawowych plików zasobów Androida w celu łatwiejszej integracji określonych funkcji Google API.

Zauważ w kodzie źródłowym, o którym mowa poniżej, że wtyczka Google-Services zawsze generuje te zasoby Androida dla każdego wariantu aplikacji zdefiniowanego w pliku app / build.gradle.

Jeśli tego nie chcesz, użyj tych wygenerowanych zasobów w wybranych wariantach aplikacji i usuń pozostałe. Nie zapomnij usunąć wtyczki Google-services stosowanej z app / build.gradle, w przeciwnym razie zostanie ona ponownie wygenerowana dla wszystkich wariantów aplikacji.

Czego to nie robi

Ta wtyczka i plik JSON NIE wpływają bezpośrednio na wewnętrzne działanie wspomnianych funkcji Google w Twojej aplikacji! Jeśli korzystałeś już ze starszych tutoriali na developer.android.com, jak zintegrować np. GCM lub Google Analytics, to nie musisz nawet integrować ani gradle-plugin google-services, ani pliku google-services.json!

Zwróć uwagę, gdzie znalazłem źródła

Po zintegrowaniu wtyczki gradle-plugin usług Google i zsynchronizowaniu projektu, Gradle automatycznie pobiera zależność usług Google do ścieżki podobnej do tej (w systemie Windows może być konieczne zajrzenie do katalogu głównego / .gradle dla systemu Linux):

C:\Users\user\.gradle\caches\modules-2\files-2.1\com.google.gms\google-services\1.4.0-beta3\f1580f62e3be313eba041ce19b64fd3f44cf8951\google-services-1.4.0-beta3-sources.jar

Jeśli rozpakujesz ten plik jar, znajdziesz dwa pliki:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

które zawierają zwykły kod źródłowy wtyczki gradle.

GoogleServicesPlugin.groovy

zawiera obsługę wariantów aplikacji i podstawowe definicje ścieżek itp.

GoogleServicesTask.java

zawiera rzeczywistą definicję zadania, poszukaj następującej metody, aby zobaczyć, co tak naprawdę robi:

@TaskAction
public void action() throws IOException { 
arne.jans
źródło
2
dużo lepsza odpowiedź. wydaje się jednak, że podczas próby zastosowania zalecanego podejścia pojawiają się problemy ( developers.google.com/analytics/devguides/collection/android/v4 ) „zaakceptowana odpowiedź” to absurdalna koncepcja SO, która całkowicie zależy od cierpliwości osoby, która potrafi zdecyduj o tym ...
axd
7
Dodatkowa uwaga na ten temat, ponieważ mogła się zmienić od czasu opublikowania tego. Przewodnik po wtyczkach Gradle usług Google określa drugą funkcję wtyczki. Twierdzi również, że dodaje pewne zależności dla „podstawowych bibliotek wymaganych dla włączonych usług”, a także sprawdza kolizje zależności (na podstawie mieszania wersji). Zagłębiłem się w źródłach i wydaje się, że wstrzykuje „kompiluj com.google.android.gms: pomiary usług-odtwarzania”. Tylko do Twojej wiadomości na wypadek, gdyby ktoś to zobaczył i nie był pewien, dlaczego.
Android3000,
3
Biorąc pod uwagę, że plik zawiera kilka kluczy, czy można bezpiecznie dodać go do kontroli wersji? O ile wiem, to tylko odciski palców, więc uważam, że jest to bezpieczne. Ale nie jestem całkowicie pewien.
ekshuma
1
@exhuma moim zdaniem, jeśli pracujesz nad projektem prywatnym lub firmowym, byłoby w porządku, aby sprawdzić go w kontroli wersji. Z drugiej strony, oczywiście, nigdy nie sprawdziłbym pliku json pod kątem kontroli wersji dla projektów open source.
arne.jans
1
@ arne.jans Czy możesz ustawić senderId dynamicznie, czy po prostu zakodowałeś go na stałe w values.xml? Muszę dynamicznie pobrać senderId z serwera, a następnie zarejestrować się w FCM.
Bresiu,
37

Do czego tak naprawdę służy ten plik:

google-services.json zawiera dane logowania programisty i ustawienia konfiguracji, które są potrzebne do weryfikacji podczas łączenia się z GoogleApiClient. Chociaż Twoja usługa działa dobrze z urządzeniem testowym, ponieważ wykrywa konto programisty, ale po publicznym udostępnieniu aplikacji nie będzie działać bez pliku json. Więc nie usuwaj go.

Oficjalna dokumentacja mówi:

Aplikacja tworzy GoogleApiClient, określając zakresy i interfejsy API, do których aplikacja będzie miała dostęp. Gdy GoogleApiClient łączy się, użytkownik jest zalogowany.

Zobacz sekcję, jak to działa .

Mohammad Arman
źródło
3
Dziękuję za Twoją odpowiedź. Mam tylko pytania, ale zastanawiam się, czy chcesz pomóc. Widziałem, że Twój link jest publikowany w usługach logowania. Ale jeśli używam tylko Google Analytics i usługi GCM w mojej aplikacji, nie muszę się logować, czy nadal muszę zachować ten plik? Dzięki!
Arthur Wang
3
Tak, do analityki lub GCM potrzebny jest również ten plik konfiguracyjny. W kroku 2 dokumentacji należało przejść do odsyłacza POBIERZ PLIK KONFIGURACYJNY . Tam musisz wybrać, czy używasz tego pliku konfiguracyjnego dla GCM czy analityki. Ten plik zawiera tylko tożsamość programisty (np. Klucz API, skrót SHA1 komputera programistycznego itp.)
Mohammad Arman
2
@androidGuy Przepraszamy za spóźnioną odpowiedź. Myślę, że musisz utworzyć nowy plik konfiguracyjny google-services.json z kluczem SHA1 najnowszej wersji. Poza tym niektóre funkcje mogą nie działać po opublikowaniu w Sklepie Play. Przepraszam za poprzednie zamieszanie, usunę mój poprzedni komentarz, ponieważ pozwoli to komuś na zły kierunek.
Mohammad Arman
1
Jeśli kopiujesz słowa innej osoby, to należy je odpowiednio blockquote oraz pełnego przypisania. Wycofałem twoją edycję, ponieważ uważam, że jest to plagiat odpowiedzi poniżej.
Brad Larson
6
A co z bezpieczeństwem? Czy można odtworzyć plik google-services.json i czytać go z poziomu apk? Widzę programistę i klucz API w środku. Nie lubię, gdy inni o tym wiedzą ...
Tino
4

Dodaj google-services.json do swojego modułu i zrób CZYSZCZENIE i ODBUDOWANIE. Plik xml zostanie wygenerowany w app / build / generated / res / google-services / debug / values ​​/ values.xml z właściwościami projektu i będzie można łatwo uzyskać do niego dostęp, tak jak zwykły ciąg xml. Przykład:

String serverClientId = getString(R.string.default_web_client_id);

lista ze wszystkimi ciągami i więcej informacji znajduje się w dokumencie google-service.json

Beto Caldas
źródło