अलग-अलग उत्पाद के लिए google-services.json


453

अपडेट: जीसीएम को हटा दिया गया है, एफसीएम का उपयोग करें

मैं यहाँ Google डेवलपर्स पेज के मार्गदर्शकों के बाद नया Google क्लाउड मैसेजिंग लागू कर रहा हूँ

मैंने सफलतापूर्वक इसे चलाया और परीक्षण किया है। लेकिन अब मेरी समस्या यह है कि मेरे पास अलग-अलग एप्लिकेशन के साथ अलग-अलग उत्पाद फ्लेवर हैं / पैकेजनाम और अलग-अलग Google क्लाउड मैसेजिंग प्रोजेक्ट आईडी। google-services.jsonपर रखा जा करने के लिए है /app/google-services.jsonनहीं जायके फ़ोल्डर।

क्या google-services.jsonकई स्वादों के लिए अलग-अलग विन्यास बनाने का कोई तरीका है?


मावेन के लिए, हमने मावेन प्रोफाइल और हर प्रोफाइल के लिए अलग-अलग संपत्ति फ़ाइलों का उपयोग करके कुछ इसी तरह लागू किया है
साकिस कलियाकौदस

1
अगर आप चाहते हैं कि आप प्रेषक_ का उपयोग करें, तो Google कंसोल से किसी भी पैकेज के नाम के बिना कुंजी उत्पन्न करें।
मुर्तजा खुर्शीद हुसैन

apply plugin: 'com.google.gms.google-services'ग्रेड फ़ाइल में लाइन में gcmतार लगाने के लिए लगता है app/build/generated/res/google-services/debug/values/values.xml...
अलेक्जेंडर Farber

इसके लिए मुझे जो सबसे अच्छा उत्तर मिला है, वह इस सवाल पर है
एस्टेल

इसे अवश्य पढ़ें: firebase.googleblog.com/2016/08/… यह हर संभावना और व्यापार को कवर करता है।
अल्बर्ट विला कैल्वो

जवाबों:


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 इन स्थानों में flavorजोंस फाइल के लिए खोज करता है (आप एक स्वाद 1 और एक निर्माण प्रकार पर विचार कर रहे हैं debug):

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

यह मेरे लिए भी स्वाद का उपयोग कर काम किया। मेरे पास एक आयाम में स्वतंत्र और भुगतान किया गया है और दूसरे आयाम में मॉक एंड प्रोडक्ट है। मेरे पास 3 बिल्डटेप भी हैं: डिबग, रिलीज़ और स्टेजिंग। इस तरह यह FreeProd स्वाद के लिए मेरी परियोजना में दिखता है:

यहां छवि विवरण दर्ज करें

आपकी परियोजना की विशेषताओं पर कितनी google-services.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
यह किसी कारण से मेरे लिए काम नहीं कर रहा है - मुझे एक ग्रेड बिल्ड त्रुटि मिलती है- File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.इसलिए मैं बिल्ड स्क्रिप्ट के माध्यम से हर बार रूट फ़ाइल में स्वाद फ़ाइल की प्रतिलिपि बनाने का सहारा ले रहा हूं।
dodgy_coder

2
आकर्षण की तरह काम किया, इसके लिए भगवान का शुक्र है। google-services.json और उनके एप का उपयोग करने का यह पूरा नया तरीका एक कदम पीछे की तरह लगता है। पता नहीं यह कैसे आसान माना जाता है।
17

141
googl-services.json एक घृणा है ... कैसे एक एपीआई कुंजी और प्रेषक आईडी में प्लगिंग की तुलना में कुछ पागल json फ़ाइल को प्रबंधित करना आसान है? कृपया गूगल बकवास बंद करो
ग्रेग

19
कॉन्फ़िगरेशन फ़ाइल जनरेटर का नवीनतम संस्करण एक ही कॉन्फ़िगरेशन फ़ाइल में कई गुण डालता है, केवल स्वाद स्तर पर अलग-अलग लोगों के बजाय ऐप स्तर पर फिर से एक की आवश्यकता होती है। आपको बस यह सुनिश्चित करने की आवश्यकता है कि दोनों कॉन्फ़िगरेशन एक ही "ऐप नाम" फ़ील्ड के तहत उत्पन्न होते हैं।
सरोसकेल्ली

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 में स्थित होनी चाहिए।
नर्सरी

71

अद्यतन: निम्नलिखित स्पष्टीकरण एक Android स्टूडियो परियोजना के लिए है, एक Firebase परियोजना और उस परियोजना के अंदर विभिन्न Firebase Apps के साथ। यदि उद्देश्य एक ही एंड्रॉइड स्टूडियो प्रोजेक्ट के अंदर अलग-अलग फायरबेस प्रोजेक्ट्स में अलग-अलग फायरबेस ऐप्स के लिए अलग-अलग JSON फाइल रखना है, (या यदि आपको नहीं पता कि क्या अंतर है) तो यहां देखें।

आपको Android एप्लिकेशन आईडी (आमतौर पर पैकेज का नाम) प्रति एक फायरबेस ऐप की आवश्यकता होती है। ग्रैड बिल्ड वेरिएंट के लिए एक एप्लीकेशन आईडी होना आम है (यदि आप ग्रैड बिल्ड प्रकार और ग्रैडल फ्लो का उपयोग करते हैं तो यह संभावना है)


Google सेवा 3.0 के रूप में और फायरबेस का उपयोग करके विभिन्न स्वादों के लिए अलग-अलग फाइल बनाने के लिए आवश्यक नहीं है। अलग-अलग स्वादों के लिए अलग-अलग फाइलें बनाना स्पष्ट या सीधा नहीं हो सकता है जब आपके पास उत्पाद होते हैं और बिल्ड प्रकार होते हैं जो एक दूसरे के साथ रचना करते हैं।

उसी फ़ाइल में आपके पास आपके सभी बिल्ड प्रकारों और स्वादों के लिए आवश्यक सभी कॉन्फ़िगरेशन होंगे।

Firebase कंसोल में आपको प्रति पैकेज नाम से एक ऐप जोड़ना होगा। कल्पना कीजिए कि आपके पास 2 स्वाद (देव और जीवित) और 2 बिल्ड प्रकार (डिबग और रिलीज़) हैं। आपके कॉन्फिगरेशन के आधार पर लेकिन यह संभव है कि आपके पास 4 अलग-अलग पैकेज नाम हों जैसे:

  • com.stackoverflow.example (लाइव - रिलीज़)
  • com.stackoverflow.example.dev (लाइव - देव)
  • com.stackoverflow.example.debug (डिबग - रिलीज़)
  • com.stackoverflow.example.dev.debug (डीबग - देव)

Firebase Console में आपको 4 अलग-अलग Android Apps चाहिए। (प्रत्येक एक पर आपको डीबग के लिए SHA-1 जोड़ना होगा और आपके द्वारा उपयोग किए जा रहे प्रत्येक कंप्यूटर के लिए जीना होगा)

जब आप google-services.json फ़ाइल डाउनलोड करते हैं, तो वास्तव में यह मायने नहीं रखता कि आप इसे किस ऐप से डाउनलोड करते हैं, इन सभी में आपके सभी ऐप से संबंधित समान जानकारी होती है।

अब आपको इस फाइल को ऐप लेवल (ऐप /) में ढूंढना होगा।

यहां छवि विवरण दर्ज करें

यदि आप उस फ़ाइल को खोलते हैं, तो आप देखेंगे कि यदि आपके सभी पैकेज नामों के लिए सभी जानकारी है।

एक दर्द बिंदु प्लगइन होने के लिए उपयोग करें। इसे काम करने के लिए आपको अपनी फ़ाइल के निचले भाग में प्लगइन का पता लगाना होगा। तो यह पंक्ति ।।

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

... आपके एप्लिकेशन build.gradle फ़ाइल के नीचे होना चाहिए।

यहाँ पर अधिकांश कहा गया है, यह पिछले संस्करणों पर भी लागू होता है। मैंने अलग-अलग कॉन्फिग के लिए कभी भी अलग-अलग फाइल नहीं की है, लेकिन अब फायरबेस कंसोल के साथ आसान है क्योंकि वे आपके द्वारा कॉन्फ़िगर किए गए सभी चीजों के लिए एक सिंगल फाइल प्रदान करते हैं।


मैं Developers.google.com/mobile/add से मेरा उत्पादन करता हूं और एक पैकेज नाम में रखने का केवल एक अवसर है। यह स्थापित करने के लिए फायरबेस जगह कहां है, या क्या एक google-services.json फ़ाइल कई स्वादों के साथ दिखती है
CQM

@CQM मैंने कुछ लिंक जोड़कर उत्तर को अपडेट किया है। आप फायरबेस डॉक्यूमेंट की जांच कर सकते हैं और जवाब में बताए अनुसार आप फायरबेस कंसोल में JSON फाइल जेनरेट कर सकते हैं।
सोती 7

7
यह वास्तव में अच्छा उत्तर है और इस प्रश्न का एकमात्र सही उत्तर होना चाहिए।
नंदो

1
मुझे यह स्वयं पता चला जब मैं उसी समस्या में भाग गया था, जैसा आपने ऊपर वर्णित किया था। मैं यहां केवल पोस्टरिटी के लिए एक उत्तर प्रस्तुत करने के लिए आया हूं ताकि आप इसे पहले ही कर सकें। संस्करण 3.0.0 के साथ, यह निश्चित रूप से सबसे अच्छा जवाब है।
ताश पेमहिवा

6
ध्यान दें कि यह केवल तभी काम करता है जब आपके सभी फ्लेवर एक ही फायरबेस प्रोजेक्ट के भीतर हों। यदि कई प्रोजेक्ट्स का उपयोग किया जाता है (मैं एक फायरबेस प्रोजेक्ट में देव और मंच को रखने और एक अलग गूगल अकाउंट में एक अलग समर्पित ठेस प्रोजेट में लगाता हूं), तो आपको यैर कुकिल्का द्वारा उल्लिखित समाधान की आवश्यकता है। वास्तव में प्लगइन विभिन्न रास्तों का समर्थन करता हुआ दिखाई देता है - निर्माण के दौरान आपको इस बारे में संकेत मिल जाएगा कि प्लगइन google-services.json फ़ाइल की तलाश में कहां गया था: "[src / prod] में देखते हुए google-services.json नहीं खोज सका। / डिबग, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

इस मुद्दे पर एक मध्यम पोस्ट लिखा ।

इसी तरह की समस्या थी (जायके के बजाय BuildTypes का उपयोग करके), और इसे इस तरह तय किया।

ग्रैडल की निर्भरता प्रबंधन प्रणाली का लाभ उठाएं। मैंने दो कार्य बनाए, 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कार्य।


लेकिन यह बिल्ड के लिए काम करता है, ओपी द्वारा पोस्ट किए गए फ्लेवर के लिए नहीं
bryant1410

1
@ bryant1410 यदि आप एक स्वाद का उपयोग कर रहे हैं - मैं अनुमान लगा रहा हूं कि आप इसके बजाय processDebugFlavorGoogleServices कार्य में हुक कर सकते हैं।
ज़ैकटकार्डि

मुझे लगता है कि आपको इसे अपने उत्तर में बदलना चाहिए, क्योंकि सवाल जायके के बारे में था, बिल्डटाइप्स पर नहीं। मुझे लगता है कि आप इस उत्तर को दूसरे विकल्प के रूप में भी छोड़ सकते हैं
bryant1410

1
@ bryant1410 तर्क मूल रूप से एक स्वाद या buildType के लिए समान है। आपको इसका पता लगाने में सक्षम होना चाहिए
ZakTaccardi

1
@IgorGanapolsky हाँ, दो संस्करण
ZakTaccardi

13

वैसे मैं एक ही समस्या में चल रहा हूँ और कोई भी सही समाधान नहीं निकाल सका। यह सिर्फ एक वर्कअराउंड है। मैं सोच रहा हूँ कि Google ने जायके के बारे में कैसे नहीं सोचा ...? और मुझे उम्मीद है कि वे जल्द ही एक बेहतर समाधान का प्रस्ताव करेंगे।

मैं क्या कर रहा हूं:

मेरे पास दो फ्लेवर हैं, प्रत्येक में मैंने संबंधित google-services.json डाला: src/flavor1/google-services.jsonऔर src/flavor2/google-services.json

फिर निर्माण ग्रेडल में मैं 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जिसमें आपके दोनों ग्राहक होंगे। बेशक, यह इस बात पर निर्भर करता है कि आप अपने स्वाद के बैकएंड को कैसे लागू कर रहे हैं। यदि वे अलग नहीं हुए हैं तो यह समाधान आपकी मदद नहीं करेगा।


आपका मतलब है कि अगर बैकएंड अलग हो गए हैं, तो यह आपके लिए काम नहीं करेगा, मेरा मानना ​​है
ZakTcardcardi

सभी इस बात पर निर्भर करता है कि दोनों पक्षों में स्वादों की आपकी परिभाषा कैसी है; क्लाइंट और सर्वर। मेरे मामले में, विभिन्न पैकेज नाम, अलग सर्वर यूआरएल और अलग डेटाबेस। इसलिए सर्वर संबंधित डेटाबेस में उपयोगकर्ता को सूचना भेजेगा। उपयोगकर्ता 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
काम नहीं करता है। यह बिल्ड स्वाद की परवाह किए बिना दोनों कॉपी कमांड चलाता है, इसलिए प्रोडक्शन जसन हमेशा ऐप डायरेक्टरी में होता है।
इसहाक

यह जायके के लिए काम करता है। Build.gradle में चर को मैन्युअल रूप से स्विच करने की कोई आवश्यकता नहीं है।
वीटो वालोव

9

मैं यहां से बनाई गई google-services.json फ़ाइल का उपयोग कर रहा हूं: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Flvelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient और cntlbl = जारी रखें% 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- डेटा के लिए क्षमा करें। मैं इसे सही ढंग से स्वरूपित नहीं कर सका ...


8

सूचनाएं प्राप्त करने के लिए google-services.json फ़ाइल अनावश्यक है। बस अपनी build.gradle फ़ाइल में प्रत्येक स्वाद के लिए एक चर जोड़ें:

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

पंजीकरण करते समय getString (R.string.gcm_defaultSenderId) के बजाय इस चर BuildConfig.GCM_SENDER_ID का उपयोग करें:

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 फ़ाइल आपके एंड्रॉइड स्टूडियो प्रोजेक्ट को कैसे प्रभावित करती है?

इसका पालन करें: https://stackoverflow.com/a/33083898/2382964

यदि आप google-services.json को अपने प्रोजेक्ट में शामिल करते हैं, तो बस दूसरे url के लिए संक्षेप में, इस रास्ते में वेरिएंट के google-servicesलिए एक ऑटो-जेनरेट किया गया फ़ोल्डर होना चाहिएdebug

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

3.) इसे करने के लिए क्या करना है?

project_levelbuild.gradle में google-services की निर्भरता जोड़ें , 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.) यदि आपके पास कई बिल्ड_फ्लावर हैं और आपके पास अलग-अलग google_services.json फाइलें हैं app/src/build_flavor/google-service.json

मामला 3.) यदि आपके पास कई बिल्ड_फ्लॉवर हैं और आपके पास एकल 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. Google एनालिस्टिक्स कॉन्फ़िगरेशन पेज पर एक नया देव फ्लेवर का पैकेज जोड़ें और google-services.json डाउनलोड करें।
  3. नई कॉन्फ़िगरेशन फ़ाइल में सूचना, आपके फ़्लेवर के पैकेज आईडी दोनों हैं
  4. अपने किसी भी फ्लेवर बिल्ड को तैयार करें।

बस इतना ही!..


1
मुझे यकीन नहीं है कि 2) और 3) वास्तव में क्या संदर्भित करते हैं। मुझे Analyticsics.google.com कहीं भी नहीं मिल सकता है, जहां मैं प्ले स्टोर को लिंक करने के अलावा, पैकेज़नेम भी जोड़ सकता हूं। एकमात्र स्थान जो मैंने डाउनलोड करने के लिए पाया है, वह यहाँ से है। Developers.google.com/mobile/add और जो कई पैकवेगन को जोड़ने की अनुमति नहीं देता है। क्या यह सिर्फ android_client_info के लिए packagenames को जोड़ने का काम करेगा?
एरबर्ग

1
@ हर्बर्ग आप एक ही प्रोजेक्ट में कई पैकेज नाम जोड़ सकते हैं और फिर फ़ाइल डाउनलोड कर सकते हैं। यहां देखें: github.com/googlesamples/google-services/issues/54
क्रिस्टर नॉर्डविक

4

हमारे पास डिबग बिल्ड (* .debug) के लिए एक अलग पैकेज का नाम है, इसलिए मुझे कुछ ऐसा चाहिए था जो स्वाद और बिल्ड टाइप के आधार पर काम करता हो, बिना पैटर्न के कुछ भी लिखने के लिए processDebugFlavorGoogleServices

मैंने प्रत्येक स्वाद में "google-services" नामक एक फ़ोल्डर बनाया, जिसमें डेब्यू संस्करण और json फाइल का रिलीज़ संस्करण दोनों शामिल हैं:

यहां छवि विवरण दर्ज करें

अपनी ग्रेड फ़ाइल के buildTypes अनुभाग में, इसे जोड़ें:

    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 फ़ाइल की प्रतिलिपि बना देगा।

अपने build.gradle की जड़ में वर्तमान स्वाद और वर्तमान बिल्ड प्रकार प्राप्त करने के लिए बुलाए गए दो तरीकों को जोड़ें

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 "";
}

यह है, आपको अपने ग्रेड फ़ाइल से फ्लेवर को हटाने / जोड़ने / संशोधित करने के बारे में चिंता करने की ज़रूरत नहीं है, और यह डिबग या रिलीज़ google-services.json को स्वचालित रूप से प्राप्त करता है।


4

Firebase अब एक google-services.json फ़ाइल के साथ कई एप्लिकेशन आईडी का समर्थन करता है।

इस ब्लॉग पोस्ट में इसका विस्तार से वर्णन है।

आप फायरबेस में एक पेरेंट प्रोजेक्ट बनाएंगे जिसका उपयोग आप अपने सभी वेरिएंट के लिए करेंगे। फिर आप प्रत्येक एप्लिकेशन आईडी के लिए उस प्रोजेक्ट के तहत Firebase में अलग से Android एप्लिकेशन बनाते हैं।

जब आप अपने सभी वेरिएंट बनाते हैं, तो आप एक google-services.json डाउनलोड कर सकते हैं जो आपके सभी एप्लिकेशन आईडी का समर्थन करता है। जब डेटा को अलग से देखना प्रासंगिक हो (यानी क्रैश रिपोर्टिंग) तो आप ड्रॉपडाउन के साथ टॉगल कर सकते हैं।


4

Firebase डॉक्स के अनुसार आप google-services.json के बजाय स्ट्रिंग संसाधनों का भी उपयोग कर सकते हैं ।

चूँकि यह प्रदाता केवल ज्ञात नामों के साथ संसाधनों को पढ़ रहा है, इसलिए एक अन्य विकल्प Google सेवा ग्रेडल प्लगइन का उपयोग करने के बजाय सीधे स्ट्रिंग को अपने ऐप में जोड़ना है। आप यह कर सकते हैं:

  • निकाला जा रहा है google-servicesअपने जड़ 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/… प्रकाशित किया गया था, जबकि किसी और के पास एक ही समस्या है।
सैफुर रहमान मोहसिन

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

मैंने पाया है कि उन परियोजनाओं के लिए, जो GCM जोड़ना चाहते हैं, उनके लिए google-services प्लगइन काफी बेकार है। यह केवल निम्न फ़ाइल उत्पन्न करता है जो एक स्ट्रिंग संसाधन के रूप में आपकी प्रोजेक्ट आईडी जोड़ता है:

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

ऐसा लगता है कि आपको केवल इसकी आवश्यकता है यदि आपने एंड्रॉइड गाइड के लिए क्लाउड मैसेजिंग से सीधे नमूना कोड वर्बेटिम की प्रतिलिपि बनाई है । यहाँ उदाहरण पंक्ति है:

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

समाधान

यदि आप अलग-अलग बिल्ड प्रकार या उत्पाद जायके के लिए एपीआई परियोजनाओं को स्विच करने में सक्षम होना चाहते हैं, तो आप बस अपने स्वयं के स्थिरांक को परिभाषित कर सकते हैं और getToken()एपीआई कॉल करते समय उपयुक्त एक का चयन कर सकते हैं ।

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);

उत्पाद जायके के लिए

उपरोक्त कोड डिबग और रिलीज़ बिल्ड के बीच स्विच करने के लिए काम करता है। उत्पाद के जायके के लिए आप एक जावा स्रोत फ़ाइल में विभिन्न एपीआई कुंजियों को परिभाषित करेंगे और फाइलों को उनकी संबंधित उत्पाद स्वाद निर्देशिका में रखेंगे। संदर्भ के लिए: ग्रेडल बिल्ड वेरिएंट


@swimmingtomars आप अनावश्यक रूप से Google-सेवा प्लगइन को लागू कर सकते हैं। यदि आप इस पद्धति का उपयोग करते हैं, तो आप Google- सेवाओं के प्लगइन को लागू नहीं कर सकते। यदि आपको GCM के अलावा सेवा के लिए इस प्लगइन की आवश्यकता है, तो स्वीकृत उत्तर देखें।
kjones

3

अपडेट:

बिल्ड वेरिएंट के साथ फायरबेस सेटअप के संदर्भ में, कृपया इस ब्लॉग को देखें जिसमें विस्तृत निर्देश हैं।


2

Google- सेवाओं के प्लगइन का उद्देश्य Google सुविधाओं के एकीकरण को आसान बनाना है।

चूँकि यह केवल google-services.json फ़ाइल से android-resource उत्पन्न करता है, इसलिए अधिक जटिल-श्रेणी-तर्क इस बिंदु को नकारता है, मुझे लगता है।

इसलिए यदि Google-डॉक्स यह नहीं कहते हैं कि विशिष्ट Google-सुविधाओं के लिए कौन से संसाधनों की आवश्यकता है, तो मैं प्रत्येक प्रासंगिक बिल्डअप / फ्लेवर के लिए JSON- फाइल जेनरेट करने का सुझाव दूंगा, देखें कि प्लगइन द्वारा क्या संसाधन प्राप्त होते हैं और फिर उन संसाधनों को मैन्युअल रूप से डालते हैं। उनके संबंधित src / buildtypeORflavor / res निर्देशिकाओं में।

Google-Services प्लगइन और उसके बाद JSON- फ़ाइल के संदर्भ हटाएं, और आप कर रहे हैं।

Google-सेवाओं के आंतरिक कामकाज के बारे में विस्तृत जानकारी के लिए, मेरे अन्य जवाब को देखें

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


मुझे समझ नहीं आ रहा है कि आपके उत्तर का उपयोग करते हुए, मैं 2 google-service.json शामिल कर सकता हूं। डिबग के लिए 1 और रिलीज़ के लिए दूसरा
penduDev

2

@Scotti ने जो कहा उसे सरल बनाना। आपको उत्पाद स्वाद के आधार पर किसी विशेष प्रोजेक्ट के लिए अलग पैकेज के नाम के साथ कई ऐप बनाने की आवश्यकता है।

मान लीजिए कि आपका प्रोजेक्ट एबीसी अलग-अलग उत्पाद का स्वाद है, एक्स, वाई जहां एक्स का पैकेज नाम कॉम है। एक्स और वाई का पैकेज का नाम कॉम है। तब फायरबेस कंसोल में आपको एक प्रोजेक्ट एबीसी बनाने की आवश्यकता होती है जिसमें आपको 2 एप्लिकेशन बनाने की आवश्यकता होती है पैकेज के नाम के साथ com.x और com.y. फिर आपको google-services.json फ़ाइल डाउनलोड करने की आवश्यकता है जिसमें 2 क्लाइंट-जानकारी ऑब्जेक्ट होंगे जिसमें उन pacakges होंगे और आप जाने के लिए अच्छा होगा।

जोंस का स्निपेट कुछ इस तरह होगा

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

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

    }

2

वास्तव में, juste one 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 फ़ाइल में जोड़ देगा।

मैं अब तस्वीर पोस्ट करने के लिए आलसी हूं, लेकिन मूल रूप से:

  • के लिए जाओ https://developers.google.com/mobile/add जाएं
  • मंच का चयन करें
  • अपना ऐप चुनें
  • जरूरी : "एंड्रॉइड पैकेज नाम" फ़ील्ड में अपना स्वाद पैकेज नाम टाइप करें
  • ... अपनी कॉन्फ़िगरेशन फ़ाइल प्राप्त करना जारी रखें। डाउनलोड करो!

फ़ाइल को कॉन्फ़िगर करते समय, आप देख सकते हैं कि Google आपको सर्वर एपीआई कुंजी + प्रेषक आईडी दिखाता है। और यह सभी पैकेज (स्वादों) के लिए समान है

अंत में, आपको केवल सभी जायके के लिए केवल एक जोंस फ़ाइल की आवश्यकता है।

यहां एक और प्रश्न जो आपको पंजीकरण टोकन प्राप्त करने के लिए पंजीकरण करते समय परीक्षण करना होगा, जांचें कि क्या प्रत्येक स्वाद के लिए अंतर है। मैं इस पर हाथ नहीं लगाता हूं लेकिन लगता है कि यह अंतर होना चाहिए। अब बहुत देर हो चुकी है और मुझे नींद आ रही है :) उम्मीद है कि यह मदद करेगा!


1

अरे दोस्त भी नाम का उपयोग केवल लोअरकेस के लिए दिखता है तो यू को यह त्रुटि नहीं मिलती है


0

मैं वर्तमान में एक ही ऐप पैकेज में दो GCM प्रोजेक्ट आईडी का उपयोग कर रहा हूं। मैंने अपने पहले GCM प्रोजेक्ट की google-service.json लगाई लेकिन मैं पहले से दूसरे में स्विच करता हूँ केवल SENDERERID बदल रहा है:

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

(इस बिंदु पर मुझे लगता है कि google-services.json अनिवार्य नहीं है)


0

ऊपर @ ahmed_khan_89 उत्तर से प्रेरित। हम सीधे इस तरह के ग्रेड फ़ाइल में रख सकते हैं।

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" फ़ाइल को क्रमशः ऐप / src / flavours के नीचे रखें फिर build.gradle of 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'
                    }
                }
            }
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.