google-services.json สำหรับผลิตภัณฑ์รสชาติที่แตกต่าง


453

อัปเดต: GCMเลิกใช้แล้วใช้FCM

ฉันกำลังใช้งาน Google Cloud Messaging ใหม่โดยทำตามคำแนะนำจากหน้า Google Developers ที่นี่

ฉันรันและทดสอบเรียบร้อยแล้ว แต่ปัญหาของฉันตอนนี้คือฉันมีรสชาติผลิตภัณฑ์ที่แตกต่างกันด้วย applicationId / packageName และรหัสโครงการ Google Cloud Messaging ที่แตกต่างกัน google-services.jsonจะต้องมีการใส่ที่/app/google-services.jsonไม่โฟลเดอร์รสชาติ

มีวิธีใดบ้างที่จะทำให้การปรับแต่งgoogle-services.jsonแตกต่างกันสำหรับรสชาติต่างๆ


สำหรับ Maven เราได้ดำเนินการบางอย่างที่คล้ายคลึงกันโดยใช้โปรไฟล์ maven และไฟล์คุณสมบัติแยกกันสำหรับทุกโปรไฟล์
sakis kaliakoudas

1
หากคุณต้องการให้คุณใช้ sender_id ให้สร้างรหัสโดยไม่มีชื่อแพ็คเกจจาก google console
Murtaza Khursheed Hussain

บรรทัดapply plugin: 'com.google.gms.google-services'ในไฟล์ gradle ดูเหมือนจะใส่gcmสตริงลงในapp/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber

คำตอบที่ดีที่สุดที่ฉันได้พบนี้คือกับคำถามนี้
Estel

อย่าลืมอ่านนี้: firebase.googleblog.com/2016/08/…มันครอบคลุมทุกความเป็นไปได้และการแลกเปลี่ยน
Albert Vila Calvo

คำตอบ:


509

Google รวมการสนับสนุนรสชาติในปลั๊กอินบริการการเล่นเวอร์ชัน 2.0 ตั้งแต่รุ่นนี้เป็นต้นไปgradle plugin com.google.gms:google-services:2.0.0-alpha3

คุณสามารถทำได้

app/src/
    flavor1/google-services.json
    flavor2/google-services.json

ปลั๊กอินเวอร์ชัน 3.0.0 ค้นหาไฟล์ json ในตำแหน่งเหล่านี้ (พิจารณาว่าคุณมีflavorflavor1 และประเภทบิลด์debug):

/app/src/debug/google-services.json
/app/src/debug/flavor1/google-services.json
/app/google-services.json

สิ่งนี้ใช้ได้ผลสำหรับฉันแม้กระทั่งการใช้ขนาดกลิ่นรส ฉันได้ฟรีและจ่ายเงินในมิติหนึ่งและเยาะเย้ย & แยงในอีกมิติหนึ่ง ฉันยังมี 3 buildTypes: debug, release และ staging นี่คือลักษณะที่ปรากฏในโครงการของฉันสำหรับรสชาติ FreeProd:

ป้อนคำอธิบายรูปภาพที่นี่

จำนวนไฟล์ google-services.json จะขึ้นอยู่กับคุณสมบัติของโครงการของคุณ แต่คุณจะต้องมีไฟล์ json อย่างน้อยหนึ่งไฟล์สำหรับทุกโครงการของ Google

หากคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ปลั๊กอินนี้ทำกับไฟล์ json เหล่านี้นี่คือ: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720

เชื่อมโยงไปยังเอกสารอย่างเป็นทางการ: https://developers.google.com/android/guides/google-services-plugin

บล็อกโพสต์พร้อมข้อมูลที่อัปเดต: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

และไปที่นี่เพื่อตรวจสอบปลั๊กอินรุ่นล่าสุด: https://bintray.com/android/android-tools/com.google.gms.google-services/view


13
สิ่งนี้ไม่ทำงานสำหรับฉันด้วยเหตุผลบางอย่าง - ฉันได้รับข้อผิดพลาดในการสร้าง gradle - File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.ดังนั้นฉันจะใช้วิธีการคัดลอกไฟล์รสไปยังโฟลเดอร์รากทุกครั้งผ่านสคริปต์สร้าง
dodgy_coder

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

141
googl-services.json เป็นสิ่งที่น่าสะอิดสะเอียน ... การจัดการไฟล์ json ที่บ้าคลั่งง่ายกว่าการเสียบคีย์ API และรหัสผู้ส่งอย่างไร ได้โปรด google หยุดเรื่องไร้สาระ
Greg Ennis

19
เวอร์ชันล่าสุดของตัวสร้างไฟล์การกำหนดค่าจะใส่คุณสมบัติหลาย ๆ อย่างไว้ในไฟล์ config เดียวกันโดยจะต้องใช้คุณสมบัติเดียวที่ระดับแอปอีกครั้งแทนที่จะแยกเป็นระดับรสชาติ คุณต้องตรวจสอบให้แน่ใจว่าการกำหนดค่าทั้งสองถูกสร้างขึ้นภายใต้ฟิลด์ "ชื่อแอป" เดียวกัน
sroskelley

5
ในฐานะของ Android Studio 3.1.4 การใช้ /app/src/flavor1/google-services.json ไม่ทำงานอีกต่อไป ไฟล์จะต้องอยู่ใน /app/src/flavor1/debug/google-services.json และ /app/src/flavor1/release/google-services.json
nurider

71

อัปเดต:คำอธิบายต่อไปนี้สำหรับโครงการ Android Studio หนึ่งโครงการที่มี Firebase หนึ่งโครงการและแอป Firebase ที่แตกต่างกันภายในโครงการนั้น หากเป้าหมายคือการมีไฟล์ JSON ที่แตกต่างกันสำหรับแอป Firebase ที่แตกต่างกันในโครงการ Firebase ที่แตกต่างกันในโครงการ Android Studio เดียวกัน (หรือถ้าคุณไม่รู้ว่าอะไรคือความแตกต่าง) ดูที่นี่ .

คุณต้องมี Firebase App หนึ่งตัวต่อหนึ่งรหัสแอปพลิเคชัน Android (โดยปกติจะเป็นชื่อแพ็คเกจ) เป็นเรื่องปกติที่จะมี ID แอปพลิเคชันหนึ่งรายการต่อชุดสร้าง Gradle (นี่จะเป็นไปได้ถ้าคุณใช้ประเภทการสร้าง Gradle และรสชาติการสร้าง Gradle)


ตั้งแต่Google Services 3.0และการใช้Firebaseไม่จำเป็นต้องสร้างไฟล์ที่แตกต่างสำหรับรสชาติที่แตกต่างกัน การสร้างไฟล์ที่แตกต่างกันสำหรับรสชาติที่แตกต่างกันอาจไม่ชัดเจนหรือตรงไปตรงมาในกรณีที่คุณมีผลิตภัณฑ์ประเภท Flavours และ Build ซึ่งประกอบขึ้นด้วยกัน

ในไฟล์เดียวกันคุณจะมีการกำหนดค่าทั้งหมดที่คุณต้องการสำหรับบิลด์ประเภทและรสชาติ

ในคอนโซล Firebase คุณต้องเพิ่มหนึ่งแอปต่อชื่อแพ็คเกจ ลองนึกภาพว่าคุณมี 2 รสชาติ (dev and live) และ 2 build build (debug and release) ขึ้นอยู่กับการกำหนดค่าของคุณ แต่เป็นไปได้ว่าคุณจะมี 4 ชื่อแพ็คเกจที่ต่างกันเช่น:

  • com.stackoverflow.example (live - release)
  • com.stackoverflow.example.dev (live - dev)
  • com.stackoverflow.example.debug (debug - release)
  • com.stackoverflow.example.dev.debug (debug - dev)

คุณต้องมีแอพ Android 4 ตัวใน Firebase Console (ในแต่ละอันคุณต้องเพิ่ม SHA-1 สำหรับการดีบักและใช้งานจริงสำหรับคอมพิวเตอร์แต่ละเครื่องที่คุณใช้งานอยู่)

เมื่อคุณดาวน์โหลดไฟล์ google-services.json จริงๆแล้วมันไม่สำคัญเลยว่าแอพที่คุณดาวน์โหลดมานั้นจะมีข้อมูลเดียวกันที่เกี่ยวข้องกับแอพทั้งหมดของคุณ

ตอนนี้คุณต้องค้นหาไฟล์นี้ในระดับแอพ (แอพ /)

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณเปิดไฟล์นั้นคุณจะเห็นว่าหากมีข้อมูลทั้งหมดสำหรับชื่อแพ็คเกจทั้งหมดของคุณ

จุดปวดใช้เป็นปลั๊กอิน เพื่อให้มันใช้งานได้คุณจะต้องค้นหาปลั๊กอินที่ด้านล่างของไฟล์ของคุณ ดังนั้นสายนี้ ..

apply plugin: 'com.google.gms.google-services'

... ต้องอยู่ที่ด้านล่างของไฟล์ build.gradle แอปของคุณ

สำหรับการกล่าวถึงที่นี่ส่วนใหญ่มันใช้กับรุ่นก่อนหน้าเช่นกัน ฉันไม่เคยมีไฟล์ที่แตกต่างกันสำหรับการกำหนดค่าที่แตกต่างกัน แต่ตอนนี้ด้วยคอนโซล Firebase นั้นง่ายกว่าเพราะพวกเขามีไฟล์เดียวที่มีทุกสิ่งที่คุณต้องการสำหรับการกำหนดค่าทั้งหมด


ฉันสร้างของฉันจากdevelopers.google.com/mobile/addและมีโอกาสเดียวที่จะใส่ชื่อแพ็คเกจหนึ่งชื่อ สถานที่ Firebase อยู่ที่ไหนเพื่อตั้งค่านี้หรือไฟล์ google-services.json มีลักษณะอย่างไรกับหลายรสชาติ
CQM

@CQM ฉันได้อัปเดตคำตอบเพื่อเพิ่มลิงก์แล้ว คุณสามารถตรวจสอบเอกสาร Firebase และคุณสามารถสร้างไฟล์ JSON ในคอนโซล Firebase ดังที่อธิบายไว้ในคำตอบ
Sotti

7
นี่เป็นคำตอบที่ดีมากและควรเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้
Nando

1
ฉันค้นพบสิ่งนี้ด้วยตัวเองเมื่อพบปัญหาเดียวกันกับที่คุณอธิบายไว้ข้างต้น ฉันมาที่นี่เพื่อส่งคำตอบสำหรับคนรุ่นหลังเท่านั้นที่พบว่าคุณได้ทำไปแล้ว ด้วยรุ่น 3.0.0 นี่เป็นคำตอบที่ดีที่สุดอย่างแน่นอน
Tash Pemhiwa

6
โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะในกรณีที่รสชาติของคุณทั้งหมดอยู่ในโครงการ firebase เดียวกัน หากใช้หลายโครงการ (ฉันมักจะเก็บ dev และขั้นตอนในโครงการ firebase หนึ่งและแยงใน prod projet แยกต่างหากในบัญชี google อื่น) คุณต้องการโซลูชันที่อธิบายโดย Yair Kukielka ที่จริงแล้วปลั๊กอินดูเหมือนจะสนับสนุนเส้นทางที่หลากหลาย - ในระหว่างการสร้างคุณจะได้รับคำแนะนำว่าปลั๊กอินนั้นค้นหาไฟล์ google-services.json: "ไม่พบ google-services.json ในขณะที่กำลังค้นหา [src / prod / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

เขียนโพสต์ขนาดกลางเกี่ยวกับปัญหานี้

มีปัญหาที่คล้ายกัน (ใช้ BuildTypes แทน Flavours) และแก้ไขได้เช่นนั้น

ใช้ประโยชน์จากระบบการจัดการที่พึ่งพาของ Gradle ฉันสร้างงานสองอย่างswitchToDebugและswitchToRelease. ต้องการให้assembleReleaseเรียกใช้ทุกครั้งที่switchToReleaseเรียกใช้เช่นกัน เหมือนกันสำหรับการแก้ปัญหา

def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'

task switchToDebug(type: Copy) {
    def buildType = 'debug'
    description = 'Switches to DEBUG google-services.json'
    from "${srcDir}/${buildType}"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

task switchToRelease(type: Copy) {
    def buildType = 'release'
    description = 'Switches to RELEASE google-services.json'
    from "${srcDir}/${buildType}/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease
}

แก้ไข:ใช้processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServicesงานเพื่อแก้ไขในระดับต่อรสชาติ


แต่วิธีนี้ใช้สำหรับ buildTypes ไม่ใช่เพื่อรสชาติที่โพสต์โดย OP
bryant1410

1
@ bryant1410 ถ้าคุณใช้รสชาติ - ฉันคาดเดาว่าคุณสามารถขอเข้าสู่กระบวนการทำภารกิจ FlugGoGoogleServices แทน
ZakTaccardi

ฉันคิดว่าคุณควรเปลี่ยนมันในคำตอบของคุณเนื่องจากคำถามเกี่ยวกับรสชาติไม่ใช่การสร้างประเภท ฉันคิดว่าคุณสามารถปล่อยให้คำตอบนี้เป็นตัวเลือกที่สอง
bryant1410

1
@ bryant1410 ตรรกะนั้นเหมือนกันสำหรับทั้งรสชาติหรือ buildType คุณน่าจะสามารถเข้าใจได้
ZakTaccardi

1
@IgorGanapolsky ใช่สองเวอร์ชั่น
ZakTaccardi

13

ฉันกำลังเจอปัญหาเดียวกันและไม่สามารถหาทางออกที่สมบูรณ์แบบได้ มันเป็นเพียงวิธีแก้ปัญหา ฉันสงสัยว่า Google ไม่คิดเกี่ยวกับรสชาติ ... หรือไม่ และฉันหวังว่าพวกเขาจะเสนอทางออกที่ดีกว่าในไม่ช้า

สิ่งที่ฉันทำ:

ฉันมีสองรสชาติในแต่ละคนผมใส่ที่สอดคล้อง google-services.json: และsrc/flavor1/google-services.jsonsrc/flavor2/google-services.json

จากนั้นในการสร้าง gradle ฉันจะคัดลอกไฟล์โดยขึ้นอยู่กับรสของapp/สารบบ:

android {

// set build flavor here to get the right gcm configuration.
//def myFlavor = "flavor1"
def myFlavor = "flavor2"

if (myFlavor.equals("flavor1")) {
    println "--> flavor1 copy!"
    copy {
        from 'src/flavor1/'
        include '*.json'
        into '.'
    }
} else {
    println "--> flavor2 copy!"
    copy {
        from 'src/flavor2/'
        include '*.json'
        into '.'
    }
}

// other stuff
}

ข้อ จำกัด :คุณจะต้องเปลี่ยนmyFlavor ด้วยตนเองในการไล่ระดับทุกครั้งที่คุณต้องการเรียกใช้เพื่อรสชาติที่แตกต่าง (เพราะมันเป็นฮาร์ดโค้ด)

ฉันพยายามหลายวิธีเพื่อให้ได้รสชาติของการสร้างในปัจจุบันอย่างafterEvaluateใกล้ชิด ... ไม่สามารถแก้ปัญหาที่ดีกว่านี้ได้จนถึงตอนนี้

อัปเดตอีกโซลูชันหนึ่ง google-services.json สำหรับรสชาติทั้งหมด:

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


คุณหมายถึงว่าถ้าแบ็กเอนด์ถูกแยกจากกันแล้วนี่จะไม่เหมาะกับคุณฉันเชื่อว่า
ZakTaccardi

ทั้งหมดขึ้นอยู่กับความหมายของรสชาติในทั้งสองด้าน ไคลเอนต์และเซิร์ฟเวอร์ ในกรณีของฉันชื่อแพคเกจที่แตกต่างกัน URL ของเซิร์ฟเวอร์ที่แตกต่างกันและฐานข้อมูลที่แตกต่างกัน ดังนั้นเซิร์ฟเวอร์จะส่งการแจ้งเตือนไปยังผู้ใช้ในฐานข้อมูลที่เกี่ยวข้อง ผู้ใช้ A มีโทเค็น 1 สำหรับรส 1 และโทเค็น 2 สำหรับรส 2 หากคุณมีรายการฐานข้อมูลที่แตกต่างกันคุณจะไม่มีปัญหา
ahmed_khan_89

ฉันพยายามสร้างงานที่คัดลอกแล้วเรียกใช้พวกเขาในกระบวนการแก้ปัญหาเฉพาะหรือกระบวนการปล่อยและคิดว่ามันทำงาน. สิ่งนี้ ws โพสต์ก่อนหน้านี้
humblerookie

1
ใช้อย่างใดอย่างหนึ่งgoogle-services.jsonสำหรับทั้งสองreleaseและdebugทำงานให้ฉันตามที่ระบุไว้ในการปรับปรุงของคุณ ฉันคิดว่านี่เป็นทางออกที่ง่ายที่สุดถ้าคุณแค่พยายามแบ่งงานdebugสร้างของคุณเหมือนฉัน สำหรับการอ้างอิงคุณสามารถสร้างไฟล์ได้ที่นี่: developers.google.com/mobile/add?platform=android
yuval

12

ตามคำตอบของahmed_khan_89คุณสามารถใส่ "คัดลอกรหัส" ภายในรสชาติของผลิตภัณฑ์

productFlavors {
    staging {
        applicationId = "com.demo.staging"

        println "Using Staging google-service.json"
        copy {
            from 'src/staging/'
            include '*.json'
            into '.'
        }
    }
    production {
        applicationId = "com.demo.production"

        println "Using Production google-service.json"
        copy {
            from 'src/production/'
            include '*.json'
            into '.'
        }
    }
}

จากนั้นคุณไม่ต้องสลับการตั้งค่าด้วยตนเอง


2
@ZakTaccardi แต่คำถามสำหรับรสชาติไม่ใช่สำหรับประเภทการสร้าง
bryant1410

1
นี่ไม่ใช่วิธีแก้ปัญหาที่ดีพอ ๆ กับmedium.com/@ZakTaccardi/ …
ZakTaccardi

2
ใช้งานไม่ได้ สิ่งนี้จะรันทั้งคำสั่งคัดลอกโดยไม่คำนึงถึงรสชาติของการสร้างดังนั้น json ที่ใช้งานจริงจะอยู่ในไดเรกทอรีแอปเสมอ
ไอแซค

มันใช้ได้กับรสชาติ ไม่จำเป็นต้องสลับตัวแปรใน build.gradle ด้วยตนเอง
Vito Valov

9

ฉันใช้ไฟล์ google-services.json สร้างขึ้นจากที่นี่: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient & cntlbl = Continue% 20Adding% 20GCM% 20Support &% 3Fconfigured% 3Dtrue

ในโครงสร้าง JSON นั้นมี JSON-array ที่เรียกว่าไคลเอนต์ หากคุณมีหลายรสชาติให้เพิ่มคุณสมบัติที่แตกต่างที่นี่

{
  "project_info": {
    "project_id": "PRODJECT-ID",
    "project_number": "PROJECT-NUMBER",
    "name": "APPLICATION-NAME"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR1",
        "client_id": "android:PACKAGE-NAME-1",
        "client_type": 1,
        "android_client_info": {
          "package_name": "PACKAGE-NAME-1"
        }
      },
      "oauth_client": [],
      "api_key": [],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "cloud_messaging_service": {
          "status": 2,
          "apns_config": []
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "google_signin_service": {
          "status": 1
        },
        "ads_service": {
          "status": 1
        }
      }
    },
    {
      "client_info": {
        "mobilesdk_app_id": "1:PROJECT-NUMBER:android:HASH-FOR-FLAVOR2",
        "client_id": "android:PACKAGE-NAME-2",
        "client_type": 1,
        "android_client_info": {
          "package_name": "PACKAGE-NAME-2"
        }
      },
      "oauth_client": [],
      "api_key": [],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "cloud_messaging_service": {
          "status": 2,
          "apns_config": []
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "google_signin_service": {
          "status": 1
        },
        "ads_service": {
          "status": 1
        }
      }
    }
  ],
  "client_info": [],
  "ARTIFACT_VERSION": "1"
}

ในโครงการของฉันฉันใช้รหัสโครงการเดียวกันและเมื่อฉันเพิ่มชื่อแพ็คเกจที่สองใน URL ข้างต้น Google จะให้ไฟล์ที่มีไคลเอ็นต์หลายรายการใน json-data แก่ฉัน

ขออภัยสำหรับ JSON-data ขนาดกะทัดรัด ฉันจัดรูปแบบไม่ถูกต้อง ...


8

ไฟล์ google-services.json ไม่จำเป็นสำหรับการรับการแจ้งเตือน เพียงเพิ่มตัวแปรสำหรับแต่ละรสชาติในไฟล์ build.gradle ของคุณ:

buildConfigField "String", "GCM_SENDER_ID", "\"111111111111\""

ใช้ตัวแปรนี้ BuildConfig.GCM_SENDER_ID แทน getString (R.string.gcm_defaultSenderId) ขณะลงทะเบียน:

instanceID.getToken(BuildConfig.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

6

1. ) google-services.json ทำอะไรจริงๆ

ทำตามนี้: https://stackoverflow.com/a/31598587/2382964

2. ) ไฟล์ google-services.json ส่งผลต่อโครงการสตูดิโอ android ของคุณอย่างไร

ทำตามนี้: https://stackoverflow.com/a/33083898/2382964

ย่อมาจาก URL ที่สองหากคุณเพิ่ม google-services.json ในโครงการของคุณจะต้องมีgoogle-servicesโฟลเดอร์ที่สร้างขึ้นโดยอัตโนมัติสำหรับdebugตัวแปรในเส้นทางนี้

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

3. ) จะทำอย่างไรให้เสร็จ?

เพิ่มการพึ่งพา google-services ในproject_levelbuild.gradle คุณสามารถใช้version 3.0.0หากคุณใช้ไลบรารี app_compact

// Top-level build.gradle file
classpath 'com.google.gms:google-services:2.1.2'

ตอนนี้ในapp_levelbuild.gradle คุณต้องเพิ่มที่ด้านล่าง

// app-level build.gradle file
apply plugin: 'com.google.gms.google-services'

4. ) จะใส่ไฟล์ google-service.json ในโครงสร้างของคุณได้ที่ไหน

กรณีที่ 1. ) ถ้าคุณไม่มี build_flavor เพียงแค่ใส่ไว้ใน/app/google-service.jsonโฟลเดอร์

กรณีที่ 2. ) ถ้าคุณมี build_flavour หลายไฟล์และคุณมีไฟล์ google_services.json ที่แตกต่างกันอยู่ข้างใน app/src/build_flavor/google-service.jsonที่แตกต่างกันที่แตกต่างกันใส่ใน

กรณีที่ 3) ถ้าคุณมี build_flavor หลายและคุณมี google_services.json app/google-service.jsonเดียวแฟ้มใส่ภายใน


4

ไม่จำเป็นต้องมีสคริปต์การไล่ระดับสีเพิ่มเติมใด ๆ

Google เริ่มเพิ่มชื่อแพ็คเกจอื่นในชื่อ 'android_client_info' ดูเหมือนว่าด้านล่างใน google-services.json

"android_client_info": {
      "package_name": "com.android.app.companion.dev"
    }

ดังนั้นขั้นตอนต่อไปนี้เพียงพอที่จะมีการเลือก google-services.json ที่แตกต่างกัน

  1. มี 2 ​​รสชาติ
  2. เพิ่มแพ็คเกจของ dev flavour ใหม่ลงในหน้าการกำหนดค่าของ Google analyics และดาวน์โหลด google-services.json
  3. แจ้งให้ทราบในไฟล์การกำหนดค่าใหม่รหัสแพ็คเกจทั้งสองของคุณมี
  4. เตรียมการสร้างรสชาติของคุณ

อย่างนั้นแหละ!..


1
ฉันไม่แน่ใจว่าสิ่งที่ 2) และ 3) หมายถึงอะไรกันแน่ ฉันไม่พบที่ใดก็ได้ใน analytics.google.com ซึ่งฉันสามารถเพิ่มแพ็กเกจเกมนอกเหนือจากการเชื่อมโยง play store ที่เดียวที่ฉันพบว่าดาวน์โหลด json มาจากที่นี่developers.google.com/mobile/addและที่ไม่อนุญาตให้เพิ่มหลายแพคเกจเกม มันจะใช้งานได้เพียงแค่เพิ่มชื่อแพ็กเกจใน android_client_info ด้วยตนเองหรือไม่
arberg

1
@arberg คุณสามารถเพิ่มชื่อแพ็คเกจได้หลายชื่อในโครงการเดียวกันจากนั้นดาวน์โหลดไฟล์ ตรวจสอบที่นี่: github.com/googlesamples/google-services/issues/54
Christer Nordvik

4

เรามีชื่อแพคเกจที่แตกต่างกันสำหรับการแก้ปัญหาสร้าง (* .debug) ดังนั้นฉันต้องการบางสิ่งบางอย่างที่ทำงานอยู่บนพื้นฐานของรสชาติและ buildType processDebugFlavorGoogleServicesโดยไม่ต้องเขียนอะไรรสชาติที่เกี่ยวข้องในรูปแบบของ

ฉันสร้างโฟลเดอร์ชื่อ "google-services" ในแต่ละรสซึ่งมีทั้งรุ่น debug และรุ่นวางจำหน่ายของไฟล์ json:

ป้อนคำอธิบายรูปภาพที่นี่

ในส่วน buildTypes ของไฟล์ gradle ของคุณเพิ่มสิ่งนี้:

    applicationVariants.all { variant ->
            def buildTypeName = variant.buildType.name
            def flavorName = variant.productFlavors[0].name;

            def googleServicesJson = 'google-services.json'
            def originalPath = "src/$flavorName/google-services/$buildTypeName/$googleServicesJson"
            def destPath = "."

            copy {
                if (flavorName.equals(getCurrentFlavor()) && buildTypeName.equals(getCurrentBuildType())) {
                    println originalPath
                    from originalPath
                    println destPath
                    into destPath
                }
            }
    }

มันจะคัดลอกไฟล์ json ที่ถูกต้องที่รูทของโมดูลแอปของคุณโดยอัตโนมัติเมื่อคุณจะเปลี่ยนชุดตัวสร้าง

เพิ่มสองวิธีที่เรียกว่ารับรสชาติปัจจุบันและประเภทบิลด์ปัจจุบันที่รูทของบิลด์ของคุณ

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if( tskReqStr.contains( "assemble" ) )
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher( tskReqStr )

    if( matcher.find() ) {
        println matcher.group(1).toLowerCase()
        return matcher.group(1).toLowerCase()
    }
    else
    {
        println "NO MATCH FOUND"
        return "";
    }
}

def getCurrentBuildType() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

        if (tskReqStr.contains("Release")) {
            println "getCurrentBuildType release"
            return "release"
        }
        else if (tskReqStr.contains("Debug")) {
            println "getCurrentBuildType debug"
            return "debug"
        }

    println "NO MATCH FOUND"
    return "";
}

เพียงเท่านี้คุณไม่ต้องกังวลกับการลบ / เพิ่ม / แก้ไขรสชาติจากไฟล์ gradle ของคุณและมันจะได้รับการดีบั๊กหรือรีลีส google-services.json โดยอัตโนมัติ


4

Firebase รองรับ id แอปพลิเคชั่นหลายตัวพร้อมไฟล์ google-services.json เพียงไฟล์เดียว

โพสต์บล็อกนี้อธิบายรายละเอียด

คุณจะสร้างโครงการหลักหนึ่งโครงการใน Firebase ที่คุณจะใช้สำหรับตัวแปรทั้งหมดของคุณ จากนั้นคุณสร้างแอปพลิเคชัน Android แยกต่างหากใน Firebase ภายใต้โครงการนั้นสำหรับแต่ละรหัสแอปพลิเคชันที่คุณมี

เมื่อคุณสร้างตัวแปรทั้งหมดของคุณคุณสามารถดาวน์โหลด google-services.json ที่รองรับรหัสแอปพลิเคชันทั้งหมดของคุณ เมื่อมีความเกี่ยวข้องเพื่อดูข้อมูลแยกต่างหาก (เช่นการรายงานการชน) คุณสามารถสลับด้วยการเลื่อนลง


4

ตามเอกสาร Firebaseคุณยังสามารถใช้ทรัพยากรสตริงแทนgoogle-services.json

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

  • การถอด google-servicesปลั๊กอินออกจาก root build.gradle ของคุณ
  • กำลังลบ google-services.jsonจากโครงการของคุณ
  • การเพิ่มทรัพยากรสตริงโดยตรง
  • การลบใช้ปลั๊กอิน: 'com.google.gms.google-services'จากแอพ build.gradle ของคุณ

ตัวอย่างstrings.xml:

<string name="google_client_id">XXXXXXXXX.apps.googleusercontent.com</string>
<string name="default_web_client_id">XXXX-XXXXXX.apps.googleusercontent.com</string>
<string name="gcm_defaultSenderId">XXXXXX</string>
<string name="google_api_key">AIzaXXXXXX</string>
<string name="google_app_id">1:XXXXXX:android:XXXXX</string>
<string name="google_crash_reporting_api_key">AIzaXXXXXXX</string>
<string name="project_id">XXXXXXX</string>

2
ฉันมีปัญหาในการจับคู่ค่าของคีย์ในไฟล์ google-services.json ที่ตรงกับสตริงที่เหมาะสม แต่จากนั้นฉันพบสิ่งนี้ที่ช่วย: developers.google.com/android/guides/… โพสต์ในกรณีที่คนอื่นมีปัญหาเดียวกัน
Saifur Rahman Mohsin

3

จากคำตอบของ @ ZakTaccardi และสมมติว่าคุณไม่ต้องการโครงการเดียวสำหรับทั้งสองรสชาติให้เพิ่มเข้าไปในส่วนท้ายของbuild.gradleไฟล์:

def appModuleRootFolder = '.'
def srcDir = 'src'
def googleServicesJson = 'google-services.json'

task switchToStaging(type: Copy) {
    outputs.upToDateWhen { false }
    def flavor = 'staging'
    description = "Switches to $flavor $googleServicesJson"
    delete "$appModuleRootFolder/$googleServicesJson"
    from "${srcDir}/$flavor/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

task switchToProduction(type: Copy) {
    outputs.upToDateWhen { false }
    def flavor = 'production'
    description = "Switches to $flavor $googleServicesJson"
    from "${srcDir}/$flavor/"
    include "$googleServicesJson"
    into "$appModuleRootFolder"
}

afterEvaluate {
    processStagingDebugGoogleServices.dependsOn switchToStaging
    processStagingReleaseGoogleServices.dependsOn switchToStaging
    processProductionDebugGoogleServices.dependsOn switchToProduction
    processProductionReleaseGoogleServices.dependsOn switchToProduction
}

คุณจำเป็นต้องมีไฟล์และsrc/staging/google-services.json src/production/google-services.jsonแทนที่ชื่อรสชาติสำหรับชื่อที่คุณใช้


3

ฉันพบว่าปลั๊กอินgoogle-servicesค่อนข้างไร้ประโยชน์สำหรับโครงการที่ต้องการเพิ่ม GCM มันจะสร้างไฟล์ต่อไปนี้ซึ่งเพียงแค่เพิ่ม ID โครงการของคุณเป็นทรัพยากรสตริง:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Your API key would be on the following line -->
    <string name="gcm_defaultSenderId">111111111111</string>
</resources>

ปรากฏว่าคุณจะต้องได้ถ้าคุณคัดลอกโค้ดตัวอย่างคำต่อคำโดยตรงจากCloud Messaging สำหรับ Androidคู่มือ นี่คือตัวอย่างบรรทัด:

String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),              GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

สารละลาย

หากคุณต้องการสลับโครงการ API สำหรับประเภทบิลด์หรือรสชาติผลิตภัณฑ์ที่แตกต่างกันคุณสามารถกำหนดค่าคงที่ของคุณเองและเลือกค่าคงที่ที่เหมาะสมเมื่อเรียกgetToken()API

private static final String SENDER_ID = "111111111111";
private static final String SANDBOX_SENDER_ID = "222222222222";

String token = instanceID.getToken(
        BuildConfig.DEBUG ? SENDER_ID : SANDBOX_SENDER_ID,
        GoogleCloudMessaging.INSTANCE_ID_SCOPE,
        null);

สำหรับรสชาติผลิตภัณฑ์

รหัสข้างต้นใช้งานได้สำหรับการสลับระหว่างการดีบักและการสร้างการปล่อย สำหรับรสชาติผลิตภัณฑ์คุณจะต้องกำหนดคีย์ API ที่แตกต่างกันในซอร์สไฟล์ java และวางไฟล์ในไดเร็กทอรีรสผลิตภัณฑ์ที่สอดคล้องกัน สำหรับการอ้างอิง: Gradle Build Variants


@swimmingtomars คุณอาจกำลังใช้ปลั๊กอิน Google-service โดยไม่จำเป็น หากคุณใช้วิธีนี้คุณจะไม่สามารถใช้ปลั๊กอิน google-services ดูคำตอบที่ยอมรับได้หากคุณต้องการปลั๊กอินนี้เพื่อรับบริการอื่นที่ไม่ใช่ GCM
kjones


2

จุดประสงค์ของปลั๊กอินของ Google-services คือการทำให้การรวมคุณสมบัติของ Google ง่ายขึ้น

เนื่องจากมันสร้างเฉพาะทรัพยากร Android จากไฟล์ google-services.json การไล่ระดับตรรกะที่ซับซ้อนเกินกว่าจะทำให้จุดนี้ไม่ได้

ดังนั้นหาก Google-docs ไม่ได้บอกว่าทรัพยากรใดที่จำเป็นสำหรับคุณลักษณะเฉพาะของ Google ฉันขอแนะนำให้สร้างไฟล์ JSON สำหรับ buildtype / รสชาติที่เกี่ยวข้องแต่ละรายการดูว่าปลั๊กอินใดที่สร้างโดยปลั๊กอินจากนั้นนำทรัพยากรเหล่านั้นมาด้วยตนเอง ลงในไดเร็กทอรี src / buildtypeORflavor / res ตามลำดับ

ลบการอ้างอิงไปยังปลั๊กอินของ google-services และไฟล์ JSON หลังจากนั้นและเสร็จสิ้น

สำหรับข้อมูลโดยละเอียดเกี่ยวกับผลงานภายในของ google-services gradle-plugin ดูคำตอบอื่น ๆ ของฉัน:

https://stackoverflow.com/a/33083898/433421


ฉันไม่เข้าใจวิธีการใช้คำตอบของคุณฉันสามารถรวม 2 google-service.json 1 สำหรับการดีบักและอีกรุ่นสำหรับการเผยแพร่
penduDev

2

ลดความซับซ้อนของสิ่งที่ @Scotti พูด คุณต้องสร้างแอปหลายรายการที่มีชื่อแพคเกจที่แตกต่างกันสำหรับโครงการเฉพาะขึ้นอยู่กับรสชาติของผลิตภัณฑ์

สมมติว่าโปรเจคของคุณคือ ABC ที่มีรสชาติของผลิตภัณฑ์ที่แตกต่างกัน X, Y โดยที่ X มีชื่อแพ็คเกจ com.x และ Y มีชื่อแพ็คเกจ com.y จากนั้นในคอนโซล Firebase คุณต้องสร้างโครงการ ABC ซึ่งคุณต้องสร้าง 2 แอป ด้วยชื่อแพ็กเกจ com.x และ com.y จากนั้นคุณต้องดาวน์โหลดไฟล์ google-services.json ซึ่งจะมีออบเจ็กต์ข้อมูลลูกค้า 2 รายการซึ่งจะมี pacakges เหล่านั้นและคุณจะไปได้ดี

ตัวอย่างของ json จะเป็นอะไรแบบนี้

{
  "client": [
    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.x"
        }

    {
      "client_info": {
        "android_client_info": {
          "package_name": "com.y"
        }
      ]

    }

2

อันที่จริงเพียงแค่ google-services.json ในMyApp/app/ไดเรกทอรีก็ดีไม่จำเป็นต้องใช้สคริปต์com.google.gms:google-services:3.0.0เพิ่มเติม แต่ต้องระมัดระวังในการลบไฟล์google-services.jsonออกจากไดเรกทอรีแอพMyApp/app/src/flavor1/res/เพื่อหลีกเลี่ยงประเภทข้อผิดพลาดExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package


2

ดังนั้นหากคุณต้องการคัดลอกgoogle-services.jsonไฟล์จากโปรแกรมของคุณทั้งหมดลงในโฟลเดอร์รูท เมื่อคุณเปลี่ยนไปใช้ชุดตัวเลือกเฉพาะนี่คือทางออกสำหรับคุณ

android {
  applicationVariants.all { variant ->
    copy {
        println "Switches to $variant google-services.json"
        from "src/$variant"
        include "google-services.json"
        into "."
    }
  }
}

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


1

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

ฉัน verry ขี้เกียจที่จะโพสต์ภาพตอนนี้ แต่โดยทั่วไป:

  • ไปที่ https://developers.google.com/mobile/add
  • เลือกแพลตฟอร์ม
  • เลือกแอปของคุณ
  • สำคัญ : พิมพ์ชื่อแพ็คเกจกลิ่นของคุณไปที่ฟิลด์ "ชื่อแพคเกจ Android"
  • ... รับไฟล์การกำหนดค่าของคุณต่อไป ดาวน์โหลดได้!

เมื่อกำหนดค่าไฟล์คุณจะเห็นว่า Google แสดงรหัส API ของเซิร์ฟเวอร์ + รหัสผู้ส่ง และมันก็เหมือนกันสำหรับทุกแพ็คเกจ (รสชาติ)

ในตอนท้ายคุณต้องใช้ไฟล์ json เพียงไฟล์เดียวเท่านั้นสำหรับทุกรสชาติ

อีกคำถามหนึ่งที่คุณต้องทดสอบเมื่อคุณลงทะเบียนเพื่อรับโทเค็นการลงทะเบียนตรวจสอบว่ามีความแตกต่างสำหรับแต่ละรสชาติหรือไม่ ฉันไม่ได้แตะต้องมัน แต่มันคิดว่ามันควรจะแตกต่างกัน สายเกินไปและฉันง่วงมาก :) หวังว่ามันจะช่วยได้!


1

เฮ้เพื่อน ๆ ยังมองหาชื่อที่ใช้ตัวพิมพ์เล็กเท่านั้นจากนั้นคุณจะไม่ได้รับข้อผิดพลาดนี้


0

ขณะนี้ฉันกำลังใช้รหัสโครงการ GCM สองรายการในแพ็คเกจแอปเดียวกัน ฉันใส่ google-service.json ของโครงการ GCM แรกของฉัน แต่ฉันเปลี่ยนจากโครงการแรกเป็นโครงการที่สองเท่านั้นที่เปลี่ยน SENDER_ID:

    String token = instanceID.getToken(SENDER_ID,GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

(ณ จุดนี้ฉันคิดว่า google-services.json ไม่ได้บังคับ)


0

แรงบันดาลใจจาก @ ahmed_khan_89 คำตอบด้านบน เราสามารถเก็บสิ่งนี้ไว้ในไฟล์ gradle ได้โดยตรง

android{

// set build flavor here to get the right Google-services configuration(Google Analytics).
    def currentFlavor = "free" //This should match with Build Variant selection. free/paidFull/paidBasic

    println "--> $currentFlavor copy!"
    copy {
        from "src/$currentFlavor/"
        include 'google-services.json'
        into '.'
    }
//other stuff
}

0

วางไฟล์ "google-services.json" ของคุณใต้ app / src / flavor ตามลำดับจากนั้นใน build.gradle ของ app ภายใต้ android เพิ่มโค้ดด้านล่าง

gradle.taskGraph.beforeTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
                    copy {
                        from "/src/${variant.flavorName}"
                        into '.'
                        include 'google-services.json'
                    }
                }
            }
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.