Farklı ürünler için google-services.json


453

Güncelleme: GCM kullanımdan kaldırıldı, FCM kullanın

Buradaki Google Geliştiricileri sayfasındaki kılavuzları izleyerek yeni Google Cloud Messaging'i uyguluyorum

Başarıyla çalıştırıyorum ve test ediyorum. Ama şimdi benim sorunum, farklı applicationId / packageName ve farklı Google Cloud Messaging Proje Kimliği ile farklı ürün tatlarım var. google-services.jsonEn koymak lazım /app/google-services.jsondeğil tatlar klasöründe.

google-services.jsonYapılandırmayı birçok lezzet için farklı yapmanın bir yolu var mı ?


Maven için, her profil için maven profillerini ve ayrı özellik dosyalarını kullanarak benzer bir şey uyguladık
sakis kaliakoudas

1
sadece sender_id öğesini kullanmak istiyorsanız, google konsolundan herhangi bir paket adı olmadan anahtar oluşturun.
Murtaza Khursheed Hussain

apply plugin: 'com.google.gms.google-services'Gradle dosyasındaki çizgi gcmdizeleri içeriyor gibi görünüyor app/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber

Bunun için bulduğum en iyi cevap bu soruda
Estel

Bunu mutlaka okuyun: firebase.googleblog.com/2016/08/… Her olasılığı ve ödünleşmeyi kapsar.
Albert Vila Calvo

Yanıtlar:


509

Google, oyun hizmetleri eklentisinin 2.0 sürümüne lezzet desteği verdi. Bu sürümden berigradle plugin com.google.gms:google-services:2.0.0-alpha3

Bunu yapabilirsiniz

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

Eklentinin 3.0.0 sürümü bu konumlardaki json dosyasını arar (bir flavorflavor1 ve bir build türüne sahip olduğunuzu düşünerek debug):

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

Bu flavorDimensions kullanarak bile benim için çalıştı. Bir boyutta ücretsiz ve ücretli, diğer boyutta Mock & Prod var. Ayrıca 3 buildTypes var: hata ayıklama, serbest bırakma ve evreleme. FreeProd lezzeti için projemde şöyle görünüyor:

resim açıklamasını buraya girin

Kaç google-services.json dosyası projenizin özelliklerine bağlı olacaktır, ancak her Google projesi için en az bir json dosyasına ihtiyacınız olacaktır.

Bu eklentinin bu json dosyalarıyla ne yaptığı hakkında daha fazla ayrıntı istiyorsanız, burada: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720

Resmi dokümanlara bağlantı: https://developers.google.com/android/guides/google-services-plugin

Güncellenmiş bilgi içeren blog gönderisi: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

Ve bu eklentinin en son sürümünü kontrol etmek için buraya gidin: https://bintray.com/android/android-tools/com.google.gms.google-services/view


13
Bu nedense benim için çalışmıyor - Ben bir çakıl inşa hatası File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.alıyorum- bu yüzden her zaman bir yapı komut dosyası aracılığıyla lezzet dosyasını kök klasöre kopyalamak için başvurmak olacak.
dodgy_coder

2
Bir cazibe gibi çalıştı, bunun için şükürler olsun. google-services.json ve apislerini kullanmanın bu yeni yolu geriye doğru bir adım gibi görünüyor. Bunun nasıl daha kolay olması gerektiğini bilmiyorum.
RED_

141
googl-services.json bir iğrenç ... bazı deli json dosyasını yönetmek sadece bir API anahtarı ve gönderen kimliği takmaktan daha kolay mı? Lütfen google saçmalık durdurun
Greg Ennis

19
Yapılandırma dosyası oluşturucusunun en yeni sürümü, aynı yapılandırma dosyasına birden çok özellik koyar ve lezzet düzeyinde ayrı olanlar yerine yalnızca uygulama düzeyinde bir tane gerekir. Her iki yapılandırmanın da aynı "Uygulama Adı" alanı altında oluşturulduğundan emin olmanız gerekir.
sroskelley

5
Android Studio 3.1.4'ten itibaren /app/src/flavor1/google-services.json kullanımı artık çalışmıyor. Dosyalar /app/src/flavor1/debug/google-services.json ve /app/src/flavor1/release/google-services.json adresinde bulunmalıdır.
nurider

71

GÜNCELLEME: Aşağıdaki açıklama, bir Firebase Projesi ve bu proje içinde farklı Firebase Uygulamaları ile bir Android Studio projesi içindir. Amaç, aynı Android Studio projesi içindeki farklı Firebase Projelerinde farklı Firebase Uygulamaları için farklı JSON dosyalarına sahip olmaksa (veya farkın ne olduğunu bilmiyorsanız) buraya bakın. .

Android Uygulama Kimliği başına bir Firebase Uygulamasına ihtiyacınız vardır (genellikle paket adı). Gradle derleme varyantı başına bir Application ID'ye sahip olmak yaygındır (Gradle derleme türleri ve Gradle derleme aromaları kullanırsanız bu olasıdır)


Google Services 3.0 ve sonrasında Firebase'i kullanma farklı tatlar için farklı dosyaları oluşturmak için gerekli değildir. Farklı tatlar için farklı dosyalar oluşturmak, ürününüz olması durumunda birbiriyle net ve açık olmayabilir.

Aynı dosyada, tüm yapı türleriniz ve lezzetleriniz için ihtiyacınız olan tüm konfigürasyonlara sahip olacaksınız.

Firebase konsolunda, paket adı başına bir uygulama eklemeniz gerekir. 2 çeşniniz (dev ve live) ve 2 yapı tipiniz (hata ayıklama ve bırakma) olduğunu düşünün. Yapılandırmanıza bağlı olarak, ancak şu gibi 4 farklı paket adınız olabilir:

  • com.stackoverflow.example (canlı - yayın)
  • com.stackoverflow.example.dev (canlı - geliştirici)
  • com.stackoverflow.example.debug (hata ayıklama - serbest bırakma)
  • com.stackoverflow.example.dev.debug (hata ayıklama - geliştirme)

Firebase Konsolunda 4 farklı Android Uygulamasına ihtiyacınız var. (Her birinde hata ayıklamak ve kullandığınız her bilgisayar için canlı olarak SHA-1 eklemeniz gerekir)

Google-services.json dosyasını indirdiğinizde, aslında hangi uygulamayı indirdiğinizden hiçbir önemi yoktur, hepsi tüm uygulamalarınızla ilgili aynı bilgileri içerir.

Şimdi bu dosyayı uygulama düzeyinde (app /) bulmanız gerekiyor.

resim açıklamasını buraya girin

Bu dosyayı açarsanız, tüm paket adlarınız için tüm bilgileri içerdiğini görürsünüz.

Bir acı noktası eklenti olarak kullanılır. Çalışmasını sağlamak için dosyanızın altındaki eklentiyi bulmanız gerekir. Yani bu çizgi ..

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

... uygulama build.gradle dosyanızın altında olması gerekir.

Burada bahsedilenlerin çoğu için, önceki sürümler için de geçerlidir. Farklı yapılandırmalar için hiç farklı dosyam olmadı, ancak şimdi Firebase konsolu ile daha kolay, çünkü tüm yapılandırmalarınız için ihtiyacınız olan her şeyi tek bir dosya sağlıyorlar.


Developers.google.com/mobile/add adresinden mayın üretiyorum ve tek bir paket adı koymak için yalnızca bir fırsat var. Bunu ayarlamak için Firebase yeri nerede veya bir google-services.json dosyası birden çok lezzetle neye benziyor
CQM

@CQM Cevabı bazı bağlantılar ekleyerek güncelledim. Firebase belgelerine bakabilir ve yanıtta açıklandığı gibi Firebase konsolunda JSON dosyasını oluşturabilirsiniz.
Sotti

7
Bu gerçekten iyi bir cevap ve bu soru için tek doğru cevap olmalı.
Nando

1
Bunu, yukarıda tarif ettiğiniz gibi, aynı problemle karşılaştığımda kendim keşfettim. Buraya, yalnızca zaten yapmış olduğunuzu bulmak için gelecek nesillere bir cevap vermeye geldim. 3.0.0 sürümü ile, bu kesinlikle en iyi cevaptır.
Tash Pemhiwa

6
Bunun yalnızca tüm tatlarınız aynı ateş tabanı projesinde olduğunda işe yarar. Birden fazla proje kullanıyorsanız (geliştiriciyi ve bir firebase projesinde sahne tutma eğilimindeyim ve farklı bir google hesabında ayrı bir özel prod projesinde prod yapıyorum) Yair Kukielka tarafından özetlenen çözüme ihtiyacınız var. Aslında eklenti çeşitli yolları destekliyor gibi görünüyor - derleme sırasında eklentinin google-services.json dosyasını aradığı yer hakkında bir ipucu alacaksınız: "[src / prod / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

Orta mesaj yazdıBu konuda .

Benzer bir sorun vardı (Flavors yerine BuildTypes kullanarak) ve bunu düzelttim.

Gradle'ın bağımlılık yönetim sisteminden yararlanın. İki görev oluşturdum switchToDebugve switchToRelease. Herhangi bir zamanın assembleReleaseçalıştırılmasını, yani switchToReleaseaynı zamanda çalıştırılmasını gerektirir. Hata ayıklama için de aynı şey geçerli.

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
}

DÜZENLEME: kullanımı processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServicesgörev başına lezzet seviyede değiştirmek için.


Ancak bu OP tarafından gönderilen tatlar için değil, buildTypes için çalışır
bryant1410

1
@ bryant1410 Bir lezzet kullanıyorsanız - bunun yerine processDebugFlavorGoogleServices görevine bağlanabileceğinizi tahmin ediyorum.
ZakTaccardi

Bence cevabınızda değiştirmelisiniz, çünkü soru türler değil tatlar hakkındaydı. Bence bu cevabı ikinci seçenek olarak da bırakabilirsiniz
bryant1410

1
@ bryant1410 mantık temel olarak bir lezzet veya buildType için aynıdır. anlamanız gerekir
ZakTaccardi

1
@IgorGanapolsky evet, iki versiyon
ZakTaccardi

13

Aynı problemle karşılaşıyorum ve mükemmel bir çözüm bulamadım. Bu sadece bir çözüm. Google'ın lezzetler hakkında nasıl düşünmediğini merak ediyorum ...? Ve umarım yakında daha iyi bir çözüm önereceklerdir.

Ne yapıyorum ben:

İki çeşidim var, her birinde karşılık gelen google-services.json: src/flavor1/google-services.jsonve src/flavor2/google-services.json.

Sonra derleme sınıfında lezzet bağlı olarak dosyayı app/dizine kopyalayın :

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
}

Sınırlama: Farklı bir lezzet için çalıştırmak istediğiniz her seferinde gradle'da myFlavor manuel olarak değiştirmeniz gerekecektir (çünkü kodlanmıştır).

Şu anki yapı lezzetini afterEvaluateyakın almak için birçok yol denedim ... şimdiye kadar daha iyi bir çözüm bulamadım.

Güncelleme, Başka bir çözüm: tüm tatlar için bir google-services.json:

Ayrıca, her lezzet için farklı paket adlarına sahip olabilirsiniz ve daha sonra google geliştirici konsolunda her lezzet için iki farklı uygulama oluşturmak zorunda kalmazsınız, ancak aynı uygulamada sadece iki farklı istemci oluşturmanız gerekir. Sonra google-services.jsonher iki istemcinizi içeren yalnızca bir tane olacaktır . Tabii ki, bu, tatlarınızın arka ucunu nasıl uyguladığınıza bağlıdır. Ayrılmazlarsa, bu çözüm size yardımcı olmaz.


arka uçlar ayrılırsa, o zaman bu sizin için işe yaramaz, yani inanıyorum
ZakTaccardi

hepsi her iki taraftaki lezzetlerin tanımınıza bağlıdır; istemci ve sunucu. Benim durumumda, farklı paket adları, farklı sunucu URL'leri ve farklı veritabanları. Böylece sunucu ilgili veritabanındaki kullanıcıya bildirimi gönderir. A kullanıcısı, lezzet1 için jeton 1'e ve lezzet2 için jeton2'ye sahiptir. Farklı veritabanı girişleriniz varsa, herhangi bir sorun yaşamayacaksınız.
ahmed_khan_89

Belirli bir hata ayıklama süreci veya serbest bırakma işleminin bunları çağırma ve bu ws daha önce yayınlanan .Wish çalıştı düşünmek sonra kopyalayıp görevleri oluşturma ve çalıştı
humblerookie

1
Birini kullanarak google-services.jsonher ikisi için releaseve debugsizin güncellemesinde belirtildiği gibi, benim için çalıştı. Sanırım sadece debugbenim gibi yapınızı bölmeye çalışıyorsanız, bu en basit çözüm . Referans için dosyayı buradan oluşturabilirsiniz: developers.google.com/mobile/add?platform=android
yuval

12

Göre ahmed_khan_89 'ın cevabı, ürün tatlar içeride size 'kopya kodu' koyabilirsiniz.

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 '.'
        }
    }
}

O zaman ayarları manuel olarak değiştirmeniz gerekmez.


2
@ZakTaccardi ama soru lezzetler için, yapı türleri için değil
bryant1410


2
Çalışmıyor. Bu, yapı lezzetinden bağımsız olarak her iki kopya komutunu da çalıştırır, bu nedenle üretim jsonu her zaman uygulama dizinindedir.
Isaac

Tatlar için çalışır. Build.gradle içinde değişkenleri manuel olarak değiştirmeye gerek yoktur.
Vito Valov

9

Buradan oluşturulan google-services.json dosyasını kullanıyorum: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Fclient ve cntlbl = devam% 20Adding% 20GCM% 20Support ve% 3Fconfigured% 3Dtrue

JSON yapısında istemciler adı verilen bir JSON dizisi vardır. Birden fazla lezzetiniz varsa, farklı özellikleri buraya ekleyin.

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

Projemde aynı proje kimliğini kullanıyorum ve yukarıdaki url'ye ikinci paket adını eklerken, google bana json verilerinde birden fazla istemci içeren bir dosya sağlıyor.

Kompakt JSON verileri için özür dileriz. Doğru biçimlendirilemedi ...


8

google-services.json dosyası bildirim almak için gereksizdir. Build.gradle dosyanızdaki her lezzet için bir değişken ekleyin:

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

Kayıt sırasında getString (R.string.gcm_defaultSenderId) yerine bu BuildConfig.GCM_SENDER_ID değişkenini kullanın:

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

6

1.) google-services.json gerçekten ne yapar?

Bunu takip et: https://stackoverflow.com/a/31598587/2382964

2.) google-services.json dosyası android stüdyo projenizi nasıl etkiler?

Bunu takip et: https://stackoverflow.com/a/33083898/2382964

projenizde google-services.json eklerseniz bu yoldaki varyant google-servicesiçin otomatik olarak oluşturulmuş bir klasör olmalıdır.debug

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

3.) Bunu yapmak için ne yapmalı?

project_levelbuild.gradle'da google-services bağımlılığını ekleyin, version 3.0.0app_compact kütüphanesini kullanıyorsanız da kullanabilirsiniz .

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

Şimdi app_levelbuild.gradle'da altına eklemelisiniz.

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

4.) Yapınıza google-service.json dosyasını nereye koyabilirsiniz.

case 1.) build_flavor'unuz yoksa sadece /app/google-service.jsonklasörün içine koyun .

case 2.) birden fazla build_flavor'unuz varsa ve farklı farklı google_services.json dosyalarınız varsa app/src/build_flavor/google-service.json .

case 3.) birden fazla build_flavor'unuz varsa ve içine tek bir google_services.json dosyanız varsa app/google-service.json.


4

Herhangi bir ek sınıf komut dosyasına gerek yoktur.

Google, 'android_client_info' adına farklı bir paket adı eklemeye başladı. Google-services.json'da aşağıdaki gibi görünüyor

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

bu nedenle, aşağıdaki adımlar farklı google-services.json seçimine sahip olmak için yeterlidir.

  1. 2 çeşidi var
  2. Google Analytics yapılandırma sayfasına yeni bir geliştirme paketi ekleyin ve google-services.json dosyasını indirin.
  3. Yeni yapılandırma dosyasında, lezzetinizin paket kimliklerinin her ikisi de var
  4. Herhangi bir lezzet yapınızı hazırlayın.

İşte bu! ..


1
2) ve 3) 'ün tam olarak neyi ifade ettiğinden emin değilim. Analytics.google.com'da, play store'u bağlamanın yanı sıra paket adları ekleyebileceğim hiçbir yer bulamıyorum. Json'u indirmek için bulduğum tek yer buradaki developers.google.com/mobile/add'dir ve bu, birden fazla paket adı eklenmesine izin vermez. Sadece android_client_info'ya paket adları ekleyerek çalışır mı?
arberg

1
@arberg Aynı projeye birden fazla paket adı ekleyebilir ve ardından dosyayı indirebilirsiniz. Buraya bakın: github.com/googlesamples/google-services/issues/54
Christer Nordvik

4

Hata ayıklama yapıları (* .debug) için farklı bir paket adımız var, bu yüzden lezzetle ilgili bir şey yazmak zorunda kalmadan, lezzet ve buildType'a dayanan bir şey istedim processDebugFlavorGoogleServices.

Her bir lezzette "google-services" adlı bir klasör oluşturdum, hem hata ayıklama sürümünü hem de json dosyasının yayın sürümünü içerir:

resim açıklamasını buraya girin

Gradle dosyanızın buildTypes bölümüne şunu ekleyin:

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

Oluşturma varyantını değiştirdiğinizde, uygulama modülünüzün kökündeki doğru json dosyasını otomatik olarak kopyalar.

Derlemenizin kök dizinine geçerli lezzet ve geçerli derleme türünü almak için çağrılan iki yöntemi ekleyin.

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

İşte bu, gradle dosyanızdan lezzetleri kaldırma / ekleme / değiştirme konusunda endişelenmenize gerek yoktur ve hata ayıklama veya google-services.json sürümünü otomatik olarak alır.


4

Firebase artık bir google-services.json dosyasıyla birden fazla uygulama kimliğini destekliyor.

Bu blog yazısında ayrıntılı olarak açıklanmaktadır.

Firebase'de tüm varyantlarınız için kullanacağınız bir üst proje oluşturacaksınız. Ardından, sahip olduğunuz her uygulama kimliği için Firebase'de o proje altında ayrı Android uygulamaları oluşturursunuz.

Tüm varyantlarınızı oluşturduğunuzda, tüm uygulama kimliklerinizi destekleyen bir google-services.json indirebilirsiniz. Verileri ayrı ayrı görmek uygun olduğunda (ör. Kilitlenme Raporlaması) bir açılır menü ile değiştirebilirsiniz.


4

Firebase belgelerine göre , google-services.json yerine dize kaynaklarını da kullanabilirsiniz .

Bu sağlayıcı yalnızca bilinen adlara sahip kaynakları okuduğundan, başka bir seçenek de dize kaynaklarını Google Hizmetleri sınıflandırma eklentisini kullanmak yerine doğrudan uygulamanıza eklemektir. Bunu şu şekilde yapabilirsiniz:

  • Çıkarma google-servicesKök build.gradle eklentiyi
  • google-services.jsonProjenizden silinmesi
  • Dize kaynaklarını doğrudan ekleme
  • 'com.google.gms.google-services'Uygulama eklentisini silme: uygulama derlemenizden.

Örnek 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 dosyasında hangi anahtarın değerinin uygun dize eşdeğeriyle eşleştiğinde zorluk yaşadım, ancak daha sonra yardımcı olanı buldum: developers.google.com/android/guides/… Başka birinin aynı sorunu olması durumunda gönderildi.
Saifur Rahman Mohsin

3

@ ZakTaccardi'nin cevabına dayanarak ve her iki lezzet için de tek bir proje istemediğinizi varsayarak, bunu build.gradledosyanızın sonuna ekleyin :

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
}

Dosyalara sahip olmanız src/staging/google-services.jsonve src/production/google-services.json. Kullandıklarınız için lezzet adlarını değiştirin.


3

Google-Services eklentisinin GCM eklemek isteyen projeler için oldukça işe yaramaz olduğunu buldum . Yalnızca proje kimliğinizi bir dize kaynağı olarak ekleyen aşağıdaki dosyayı oluşturur:

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

Yalnızca, örnek kod kelimesini doğrudan Android için Cloud Messaging kılavuzundan kopyaladıysanız ihtiyacınız olduğu görülmektedir . İşte örnek çizgi:

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

Çözüm

Farklı yapı türleri veya ürün lezzetleri için API projelerini değiştirebilmek istiyorsanız, sadece kendi sabitlerinizi tanımlayabilir ve getToken()API'yı çağırırken uygun olanı seçebilirsiniz .

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

Ürün Aromaları için

Yukarıdaki kod, hata ayıklama ve sürüm derlemeleri arasında geçiş yapmak için çalışır. Ürün aromaları için bir java kaynak dosyasında farklı API anahtarları tanımlar ve dosyaları ilgili ürün aroması dizinine yerleştirirsiniz. Referans için: Gradle Build Varyantları


@swimmingtomars Google hizmeti eklentisini gereksiz yere uyguluyor olabilirsiniz. Bu yöntemi kullanırsanız google-services eklentisini uygulayamazsınız. GCM dışında bir hizmet için bu eklentiye ihtiyacınız varsa kabul edilen cevaba bakın.
Ocak

3

GÜNCELLENMİŞ:

Derleme varyantlarına sahip Firebase kurulumu açısından, lütfen ayrıntılı talimatları içeren bu bloga bakın .


2

Google-services eklentisinin amacı Google özelliklerinin entegrasyonunu basitleştirmektir.

Sadece google-services.json dosyasından android kaynakları oluşturduğundan, aşırı karmaşık gradle-logic bu noktayı reddediyor.

Google dokümanları, belirli Google özellikleri için hangi kaynaklara ihtiyaç olduğunu söylemezse, ilgili her yapı türü / lezzet için JSON dosyası oluşturmanızı, eklenti tarafından hangi kaynakların üretildiğini görüp bu kaynakları manuel olarak koymanızı öneririm. kendi src / buildtypeORflavor / res dizinlerine.

Bundan sonra google-services eklentisi ve JSON dosyasına yapılan referansları silin ve işiniz bitti.

Google-services gradle-plugin'in iç işleri hakkında ayrıntılı bilgi için diğer cevabıma bakın:

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


Cevabınızı nasıl kullandığınızı anlamıyorum, 2 google-service.json ekleyebilirim. Hata ayıklama için 1 ve serbest bırakma için başka
penduDev

2

@Scotti'nin söylediklerini basitleştirmek. Ürün aromasına bağlı olarak belirli bir Proje için farklı paket adıyla Multiples uygulamaları oluşturmanız gerekir.

Projenizin farklı ürün lezzetleri olan ABC olduğunu varsayalım, burada X'in com.x paket adı var ve Y'nin com paket adı var. Y sonra firebase konsolunda 2 uygulama oluşturmanız gereken bir proje ABC oluşturmanız gerekir. com.x ve com.y paket adları ile. Ardından, bu pacakları içerecek 2 istemci-bilgi nesnesi olacak ve gitmek için iyi olacak google-services.json dosyasını indirmeniz gerekir.

Json snippet'i böyle bir şey olurdu

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

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

    }

2

Gerçekten, MyApp/app/dizinde bir google-services.json juste iyidir, ek komut dosyası ile gerek yok com.google.gms:google-services:3.0.0. Ancak hata türünü önlemek için dosyayı google-services.jsonuygulama dizininden silmeye dikkat edinMyApp/app/src/flavor1/res/Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package


2

Bu nedenle google-services.json, tüm değişkenlerinizden programlı olarak kök klasörünüze dosya kopyalamak istiyorsanız . Belirli bir varyasyona geçtiğinizde size bir çözüm

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

Bu yaklaşımda, google-service.jsonvaryant klasörünüzün her birinde dosyaya sahip olmanız gereken bir uyarı var .varyant görüntüsü


1

Birçok lezzetiniz var, bu yüzden birçok fark paketi kimliğiniz olacak, değil mi? Yani, json dosyanızı ayarladığınız / oluşturduğunuz sayfaya gidin ve her paket adı için yapılandırın. Hepsi json dosyasına eklenecek.

Resim göndermek için çok tembelim ama temelde:

Dosyayı yapılandırırken, google'ın size Sunucu API Anahtarı + Gönderen Kimliğini gösterdiğini görebilirsiniz. Ve tüm paket için aynıdır (tatlar)

Sonunda, tüm tatlar için sadece bir json dosyasına ihtiyacınız var.

Kayıt Jetonu almak için kaydolduğunuzda test etmeniz gereken bir soru daha var, her lezzet için fark olup olmadığını kontrol edin. Buna değinmiyorum ama fark olması gerektiğini düşünüyorum. Şimdi çok geç ve ben çok uykulu :) Umarım yardımcı olur!


1

Hey Arkadaşlar da sadece küçük harf kullanın sonra u bu hatayı alamadım


0

Şu anda aynı uygulama paketinde iki GCM Proje Kimliği kullanıyorum. İlk GCM projemin google-service.json'unu koydum, ancak yalnızca SENDER_ID değerini değiştirerek ilkinden ikinci projeye geçiyorum:

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

(Bu noktada google-services.json'un zorunlu olmadığını düşünüyorum)


0

Yukarıdaki @ ahmed_khan_89 yanıtından esinlenmiştir. Doğrudan gradle dosyasında böyle tutabiliriz.

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" dosyanızı sırasıyla app / src / flavors altına yerleştirin, ardından uygulamanın build.gradle dosyasına, android altında aşağıdaki kodu ekleyin

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'
                    }
                }
            }
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.