google-services.json ทำอะไรได้จริง?


120

ฉันเพิ่มบริการ Google Analytics และ GCM ในแอปปัจจุบันของฉัน ในคำแนะนำสำหรับการใช้งานบริการทั้งสอง Google ขอให้นักพัฒนาสร้างไฟล์ json: google-services.json และวางไว้ในไดเรกทอรีรากของแอป

ฉันพบว่าแม้ว่าฉันจะลบไฟล์ json นี้ออกจากแอพของฉัน แต่บริการก็ยังใช้งานได้

แค่อยากรู้แน่ ๆ ว่าไฟล์นี้มีไว้ทำอะไร? การใช้งานคืออะไรและทำงานอย่างไร?

คำตอบ:


197

ฉันตรวจสอบเล็กน้อยเกี่ยวกับปลั๊กอิน Google-services และ json และพบแหล่งที่มาของปลั๊กอินนี้

สิ่งแรกก่อน

gradle-plugin google-services ที่อ้างอิงโดย classpath และใช้เป็นปลั๊กอิน build-time เท่านั้น! ดังนั้นจึงมีผลต่อกระบวนการสร้างของแอปของคุณเท่านั้น แต่ไม่ใช่กระบวนการรันไทม์!

ปลั๊กอินนี้มีไว้เป็นเพียงตัวช่วยในการเริ่มต้นอย่างรวดเร็วในการผสานรวมบริการของ Google ในแอปของคุณอย่างรวดเร็ว เห็นได้ชัดว่ากระบวนการนี้ค่อนข้างซับซ้อนและไม่ได้รับการจัดทำเป็นเอกสารดังนั้น Google ควรระบุให้ชัดเจนว่ากระบวนการนี้ทำอย่างไร

อันที่จริงฉันพบซอร์สโค้ดสำหรับปลั๊กอินเวอร์ชัน com.google.gms: google-services: 1.4.0-beta3 และไม่พบข้อมูลอ้างอิงใด ๆ เกี่ยวกับแอปเชิญและไม่พบ Google API สำหรับ App Invites! (แต่บางทีมันอาจจะใช้โปรเจ็กต์ API ทั่วไปที่มีรหัสโปรเจ็กต์ฉันไม่ได้ลอง)

มันทำอะไร

Google-services gradle-plugin จะค้นหาไฟล์ google-services.json ที่กล่าวถึงในโมดูลแอปของคุณ จากนั้นจะค้นหาการตั้งค่าที่กำหนดค่าไว้เช่น project-id และ tracking-id เป็นต้นซึ่งสร้างโดยคอนโซลนักพัฒนา Google API ลงในไฟล์ google-services.json จากการตั้งค่าที่พบค่าทรัพยากร Android จะถูกสร้างขึ้นในเส้นทางต่อไปนี้:

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

ตัวอย่างเช่นการสร้างดีบักของแอปของคุณ:

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

เช่นถ้าคุณทำตามบทช่วยสอน GCM ไฟล์ JSON จะรวม id ของโครงการ API เป็นทรัพยากร android ต่อไปนี้:

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

ดังนั้นปลั๊กอินและไฟล์ JSON นี้จึงไม่จำเป็นต่อการเรียกใช้หรือเผยแพร่แอปของคุณมันเป็นเพียงผู้ช่วยในการเริ่มต้นอย่างรวดเร็วในการสร้างไฟล์ทรัพยากรพื้นฐานของ Android เพื่อการรวมคุณลักษณะ Google API เฉพาะที่ง่ายขึ้น

โปรดสังเกตในซอร์สโค้ดที่อ้างอิงด้านล่างว่าปลั๊กอินบริการของ Google จะสร้างทรัพยากร Android เหล่านั้นสำหรับทุกตัวแปรของแอปที่กำหนดไว้ใน app / build.gradle ของคุณ

หากคุณไม่ต้องการสิ่งนั้นคุณควรใช้ทรัพยากรที่สร้างขึ้นเหล่านั้นในรูปแบบแอพที่คุณต้องการและลบอื่น ๆ อย่าลืมลบปลั๊กอิน google-services ที่ใช้ออกจาก app / build.gradle มิฉะนั้นจะถูกสร้างใหม่สำหรับแอพทุกรุ่น

สิ่งที่ไม่

ปลั๊กอินและไฟล์ JSON นี้ไม่ได้ส่งผลโดยตรงต่อการทำงานภายในของคุณสมบัติ Google ดังกล่าวสำหรับแอปของคุณ! หากคุณได้ทำตามบทช่วยสอนที่เก่ากว่าใน developer.android.com เกี่ยวกับวิธีการผสานรวมเช่น GCM หรือ Google Analytics แล้วคุณไม่จำเป็นต้องรวม Google-services gradle-plugin หรือไฟล์ google-services.json ด้วยซ้ำ!

แจ้งให้ทราบว่าฉันพบแหล่งที่มาที่ใด

หลังจากที่คุณรวม Google-services gradle-plugin และเมื่อซิงค์โปรเจ็กต์ของคุณ Gradle จะดาวน์โหลดการพึ่งพาบริการของ Google ไปยังเส้นทางที่คล้ายกันโดยอัตโนมัติ (บน Windows คุณอาจต้องดูที่บ้าน / .gradle สำหรับ 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

หากคุณแตกไฟล์ jar นี้คุณจะพบสองไฟล์:

GoogleServicesPlugin.groovy
GoogleServicesTask.java

ซึ่งมีซอร์สโค้ดธรรมดาของปลั๊กอิน gradle

GoogleServicesPlugin.groovy

ประกอบด้วยการจัดการตัวแปรของแอปและคำจำกัดความพื้นฐานของเส้นทางเป็นต้น

GoogleServicesTask.java

มีข้อกำหนดงานจริงให้มองหาวิธีการต่อไปนี้เพื่อดูว่ามันทำอะไรได้บ้าง:

@TaskAction
public void action() throws IOException { 

2
คำตอบที่ดีกว่ามาก แต่ดูเหมือนจะมีปัญหาเมื่อพยายามทำตามแนวทางที่แนะนำ ( developers.google.com/analytics/devguides/collection/android/v4 ) "คำตอบที่ยอมรับ" เป็นแนวคิด SO ที่ไร้สาระซึ่งทั้งหมดขึ้นอยู่กับความอดทนของบุคคลที่สามารถทำได้ ตัดสินใจเลย ...
axd

7
หมายเหตุติดตามผลเนื่องจากอาจมีการเปลี่ยนแปลงตั้งแต่คุณโพสต์สิ่งนี้ คู่มือGoogle Services Gradle Pluginระบุฟังก์ชันที่ 2 ของปลั๊กอิน นอกจากนี้ยังอ้างว่าจะเพิ่มการอ้างอิงบางอย่างสำหรับ "ไลบรารีพื้นฐานที่จำเป็นสำหรับบริการที่คุณเปิดใช้งาน" รวมถึงการตรวจสอบการชนกันของการอ้างอิง (จากการผสมเวอร์ชัน) ฉันขุดลงไปในแหล่งที่มาและดูเหมือนว่าจะฉีด "compile com.google.android.gms: play-services-measure" เพียงแค่ FYI ในกรณีที่ใครเห็นป๊อปอัปและไม่แน่ใจว่าทำไม
Android3000

3
เมื่อพิจารณาว่าไฟล์มีคีย์สองสามคีย์การเพิ่มลงในการควบคุมเวอร์ชันจะปลอดภัยหรือไม่ เท่าที่ฉันสามารถบอกได้ว่ามันเป็นเพียงลายนิ้วมือดังนั้นฉันคิดว่ามันปลอดภัย แต่ฉันไม่แน่ใจอย่างสมบูรณ์
exhuma

1
@exhuma ในความเห็นส่วนตัวของฉันหากคุณกำลังทำงานในโครงการส่วนตัวหรือภายใน บริษัท คุณสามารถตรวจสอบการควบคุมเวอร์ชันได้ ในทางกลับกันฉันจะไม่ตรวจสอบไฟล์ json ในการควบคุมเวอร์ชันสำหรับโครงการโอเพ่นซอร์สอย่างชัดเจน
arne.jans

1
@ arne.jans คุณสามารถตั้งค่า senderId แบบไดนามิกได้หรือเพียงแค่ฮาร์ดโค้ดใน values.xml ฉันต้องการดึงข้อมูล senderId แบบไดนามิกจากเซิร์ฟเวอร์และกว่าจะลงทะเบียนกับ FCM
Bresiu

37

ไฟล์นี้มีไว้เพื่ออะไร:

google-services.jsonมีข้อมูลรับรองของนักพัฒนาและการตั้งค่าการกำหนดค่าซึ่งจำเป็นในการตรวจสอบขณะเชื่อมต่อกับ GoogleApiClient แม้ว่าบริการของคุณจะทำงานได้ดีกับอุปกรณ์ทดสอบของคุณเนื่องจากตรวจพบบัญชีนักพัฒนาของคุณ แต่หลังจากปล่อยแอปของคุณในที่สาธารณะแล้วจะไม่สามารถใช้งานได้หากไม่มีไฟล์ json ดังนั้นอย่าลบทิ้ง

เอกสารอย่างเป็นทางการกล่าวว่า:

แอปพลิเคชันสร้าง GoogleApiClient โดยระบุขอบเขตและ API ที่แอปพลิเคชันจะเข้าถึง เมื่อ GoogleApiClient เชื่อมต่อผู้ใช้จะลงชื่อเข้าใช้

ดูวิธีการทำงานส่วน


3
ขอบคุณสำหรับคำตอบ. เพียงแค่มีคำถาม แต่สงสัยว่าคุณยินดีที่จะช่วยหรือไม่ ฉันเห็นลิงก์ของคุณถูกโพสต์ไปที่บริการลงชื่อเข้าใช้ แต่ถ้าฉันใช้เฉพาะบริการ Google Analytics และ GCM ในแอปของฉันไม่จำเป็นต้องลงชื่อเข้าใช้ฉันยังต้องเก็บไฟล์นี้ไว้หรือไม่ ขอบคุณ!
Arthur Wang

3
ใช่สำหรับการวิเคราะห์หรือ GCM คุณต้องใช้ไฟล์การกำหนดค่านี้ด้วย ในขั้นตอนที่ 2 ของเอกสารคุณต้องไปที่ลิงก์รับไฟล์การกำหนดค่า คุณต้องเลือกว่าคุณกำลังใช้ไฟล์ conf นี้สำหรับ GCM หรือการวิเคราะห์ ไฟล์นี้มีเพียงรหัสประจำตัวนักพัฒนาของคุณ (เช่นคีย์ api แฮช SHA1 ของพีซีสำหรับการพัฒนาของคุณเป็นต้น)
Mohammad Arman

2
@androidGuy ขออภัยที่ตอบช้า ฉันคิดว่าคุณต้องสร้างไฟล์ google-services.json การกำหนดค่าใหม่ด้วยคีย์แฮช SHA1 รุ่นล่าสุด คุณสมบัติบางอย่างที่ชาญฉลาดอื่น ๆ อาจไม่ทำงานหลังจากเผยแพร่บน play store ขออภัยสำหรับความสับสนก่อนหน้านี้ฉันจะลบความคิดเห็นก่อนหน้าของฉันเนื่องจากจะทำให้ใครบางคนไปผิดทาง
Mohammad Arman

1
หากคุณคัดลอกคำพูดของบุคคลอื่นคุณต้องปิดกั้นคำพูดเหล่านั้นอย่างถูกต้องและระบุแหล่งที่มาอย่างครบถ้วน ฉันได้ยกเลิกการแก้ไขของคุณแล้วเนื่องจากถือว่าเป็นการลอกเลียนคำตอบด้านล่างนี้
Brad Larson

6
ความปลอดภัยล่ะ google-services.json สามารถสร้างขึ้นใหม่และอ่านจาก apk ได้หรือไม่ ฉันเห็นนักพัฒนาและคีย์ API อยู่ข้างใน ฉันไม่อยากให้คนอื่นรู้จัก ...
Tino

4

เพิ่ม google-services.json ลงในโมดูลของคุณและทำการ CLEAN และ A REBUILD ไฟล์ xml จะถูกสร้างขึ้นใน app / build / created / res / google-services / debug / values ​​/ values.xml พร้อมคุณสมบัติโปรเจ็กต์ของคุณและคุณสามารถเข้าถึงได้ง่ายเช่นเดียวกับสตริง xml ปกติ ตัวอย่าง:

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

มีรายการที่มีสตริงทั้งหมดและข้อมูลเพิ่มเติมในgoogle-service.json doc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.