google-services.json untuk berbagai productFlavours

453

Pembaruan: GCM sudah usang, gunakan FCM

Saya menerapkan Google Cloud Messaging baru mengikuti panduan dari halaman Google Developers di sini

Saya sudah berhasil menjalankan dan mengujinya. Tapi masalah saya sekarang adalah saya memiliki rasa produk yang berbeda dengan applicationId / packageName dan ID Proyek Messaging Google yang berbeda. The google-services.jsonharus diletakkan pada /app/google-services.jsontidak folder rasa.

Apakah ada cara untuk membuat google-services.jsonkonfigurasi berbeda untuk banyak rasa?

Gentra
sumber
Untuk Maven, kami telah menerapkan sesuatu yang serupa menggunakan profil maven dan memisahkan file properti untuk setiap profil
sakis kaliakoudas
1
jika Anda hanya ingin menggunakan sender_id maka hasilkan kunci tanpa nama paket dari google console.
Murtaza Khursheed Hussain
Baris apply plugin: 'com.google.gms.google-services'dalam file gradle tampaknya memasukkan gcmstring ke app/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber
Jawaban terbaik yang saya temukan untuk ini adalah pada pertanyaan ini
Estel
Pastikan untuk membaca ini: firebase.googleblog.com/2016/08/... Ini mencakup setiap kemungkinan dan pengorbanan.
Albert Vila Calvo

Jawaban:

509

Google menyertakan dukungan untuk citarasa dalam versi 2.0 dari plugin layanan putar. Sejak versi inigradle plugin com.google.gms:google-services:2.0.0-alpha3

kamu bisa melakukan ini

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

Versi 3.0.0 dari plugin mencari file json di lokasi-lokasi ini (mengingat Anda memiliki flavorflavor1 dan tipe build debug):

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

Ini bekerja untuk saya bahkan menggunakan flavorDimensions. Saya memiliki gratis & dibayar dalam satu dimensi dan Mock & Prod di dimensi lain. Saya juga memiliki 3 buildTypes: debug, rilis dan pementasan. Ini adalah tampilannya di proyek saya untuk rasa FreeProd:

masukkan deskripsi gambar di sini

Berapa banyak file google-services.json akan tergantung pada karakteristik proyek Anda, tetapi Anda memerlukan setidaknya satu file json untuk setiap proyek Google.

Jika Anda ingin detail lebih lanjut tentang apa yang dilakukan plugin ini dengan file json ini, ini dia: https://github.com/googlesamples/google-services/issues/54#issuecomment-165824720

Tautan ke dokumen resmi: https://developers.google.com/android/guides/google-services-plugin

Posting blog dengan info terbaru: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

Dan buka di sini untuk memeriksa versi terbaru dari plugin ini: https://bintray.com/android/android-tools/com.google.gms.google-services/view

Yair Kukielka
sumber
13
Ini tidak berfungsi untuk saya karena beberapa alasan - saya mendapatkan kesalahan pembuatan gradle - File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.jadi saya akan menyalin file rasa ke folder root setiap kali melalui skrip build.
dodgy_coder
2
Bekerja seperti pesona, terima kasih Tuhan untuk ini. google-services.json dan cara baru ini menggunakan apis mereka sepertinya merupakan langkah mundur. Tidak tahu bagaimana ini seharusnya lebih mudah.
RED_
140
googl-services.json adalah kekejian ... bagaimana mengelola beberapa file json gila lebih mudah daripada hanya memasukkan kunci API dan ID pengirim? Tolong google hentikan omong kosong
Greg Ennis
19
Versi terbaru dari generator file konfigurasi menempatkan banyak properti dalam file konfigurasi yang sama, hanya membutuhkan satu di tingkat aplikasi lagi, bukan yang terpisah di tingkat rasa. Anda hanya perlu memastikan bahwa kedua konfigurasi dihasilkan di bawah bidang "Nama Aplikasi" yang sama.
sroskelley
5
Pada Android Studio 3.1.4, menggunakan /app/src/flavor1/google-services.json tidak lagi berfungsi. File-file tersebut harus berada di /app/src/flavor1/debug/google-services.json dan /app/src/flavor1/release/google-services.json.
nurider
71

UPDATE: Penjelasan berikut adalah untuk satu proyek Android Studio, dengan satu Proyek Firebase dan berbagai aplikasi Firebase di dalam proyek itu. Jika tujuannya adalah untuk memiliki file JSON yang berbeda untuk Aplikasi Firebase yang berbeda di Proyek Firebase yang berbeda di dalam proyek Android Studio yang sama, (atau jika Anda tidak tahu apa bedanya) lihat di sini. .

Anda memerlukan satu Aplikasi Firebase per ID Aplikasi Android (biasanya nama paket). Adalah umum untuk memiliki satu ID Aplikasi per varian build Gradle (Ini kemungkinan akan terjadi jika Anda menggunakan tipe build Gradle dan rasa build Gradle)


Pada Layanan Google 3.0 dan menggunakan Firebase , tidak perlu membuat file yang berbeda untuk rasa yang berbeda. Membuat file yang berbeda untuk rasa yang berbeda bisa tidak jelas atau langsung jika Anda memiliki jenis produk dan tipe Build yang menyusun satu sama lain.

Dalam file yang sama Anda akan memiliki semua konfigurasi yang Anda butuhkan untuk semua jenis dan rasa build Anda.

Di Firebase console Anda perlu menambahkan satu aplikasi per nama paket. Bayangkan bahwa Anda memiliki 2 rasa (dev dan live) dan 2 tipe build (debug dan rilis). Tergantung pada konfigurasi Anda, tetapi kemungkinan Anda memiliki 4 nama paket yang berbeda seperti:

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

Anda memerlukan 4 Aplikasi Android yang berbeda di Firebase Console. (Pada masing-masing Anda perlu menambahkan SHA-1 untuk debug dan hidup untuk setiap komputer yang Anda gunakan)

Ketika Anda mengunduh file google-services.json, sebenarnya itu tidak masalah dari aplikasi apa yang Anda unduh, semuanya berisi info yang sama terkait dengan semua aplikasi Anda.

Sekarang Anda perlu mencari file ini di level aplikasi (app /).

masukkan deskripsi gambar di sini

Jika Anda membuka file itu, Anda akan melihat bahwa jika berisi semua informasi untuk semua nama paket Anda.

Titik nyeri digunakan untuk menjadi plugin. Untuk membuatnya berfungsi, Anda perlu mencari plugin di bagian bawah file Anda. Jadi baris ini ..

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

... harus ada di bagian bawah file build.gradle aplikasi Anda.

Untuk sebagian besar yang dikatakan di sini, ini juga berlaku untuk versi sebelumnya. Saya tidak pernah memiliki file yang berbeda untuk konfigurasi yang berbeda, tetapi sekarang dengan Firebase console lebih mudah karena mereka menyediakan satu file tunggal dengan semua yang Anda butuhkan untuk semua yang Anda konfigurasi.

Sotti
sumber
Saya menghasilkan milik saya dari developers.google.com/mobile/add dan hanya ada satu peluang untuk memasukkan satu nama paket. Di mana tempat Firebase untuk mengatur ini, atau seperti apa tampilan file google-services.json dengan berbagai rasa
CQM
@CQM Saya sudah memperbarui jawabannya dengan menambahkan beberapa tautan. Anda bisa memeriksa dokumentasi Firebase dan Anda bisa menghasilkan file JSON di Firebase console seperti yang dijelaskan dalam jawaban.
Sotti
7
Ini adalah jawaban yang sangat bagus dan seharusnya menjadi satu-satunya jawaban yang tepat untuk pertanyaan ini.
Nando
1
Saya menemukan ini sendiri ketika saya mengalami masalah yang sama, seperti yang Anda jelaskan di atas. Saya datang ke sini untuk mengirimkan jawaban bagi anak cucu hanya untuk mengetahui bahwa Anda sudah melakukannya. Dengan versi 3.0.0, ini tentu jawaban terbaik.
Tash Pemhiwa
6
Perhatikan bahwa ini hanya berfungsi jika semua rasa Anda berada dalam proyek firebase yang sama. Jika menggunakan banyak proyek (saya cenderung menyimpan dev dan stage dalam satu proyek firebase dan mendorong pro pro prod berdedikasi terpisah di akun google yang berbeda), Anda memerlukan solusi yang diuraikan oleh Yair Kukielka. Sebenarnya plugin ini muncul untuk mendukung berbagai jalur - selama membangun Anda akan mendapatkan petunjuk tentang tempat plugin mencari file google-services.json: "Tidak dapat menemukan google-services.json saat mencari di [src / prod / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH
43

Menulis posting Medium tentang masalah ini.

Punya masalah yang sama (menggunakan BuildTypes bukannya Flavours), dan memperbaikinya seperti itu.

Manfaatkan sistem manajemen ketergantungan Gradle. Saya membuat dua tugas, switchToDebugdan switchToRelease. Mengharuskan setiap saat assembleReleasedijalankan, itu switchToReleasejuga dijalankan. Sama untuk debug.

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
}

EDIT: gunakan processDebugFlavorGoogleServices/ processReleaseFlavorGoogleServicestugas untuk memodifikasinya pada tingkat per rasa.

ZakTaccardi
sumber
Tapi ini berfungsi untuk buildTypes, bukan untuk citarasa seperti yang diposting oleh OP
bryant1410
1
@ bryant1410 jika Anda menggunakan rasa - Saya menduga Anda dapat menggunakan tugas processDebugFlavorGoogleServices sebagai gantinya.
ZakTaccardi
Saya pikir Anda harus mengubahnya dalam jawaban Anda, karena pertanyaannya adalah tentang rasa, bukan buildTypes. Saya pikir Anda juga bisa meninggalkan jawaban ini sebagai opsi kedua
bryant1410
1
@ bryant1410 logikanya pada dasarnya sama untuk rasa atau buildType. Anda harus bisa mengetahuinya
ZakTaccardi
1
@IgorGanapolsky ya, dua versi
ZakTaccardi
13

Yah saya mengalami masalah yang sama dan tidak bisa mendapatkan solusi yang sempurna. Itu hanya solusi. Saya bertanya-tanya bagaimana Google tidak memikirkan rasa ...? Dan saya berharap mereka akan segera mengusulkan solusi yang lebih baik.

Apa yang saya lakukan:

Saya punya dua rasa, di masing-masing saya menaruh google-services.json yang sesuai: src/flavor1/google-services.jsondan src/flavor2/google-services.json.

Kemudian dalam build gradle saya menyalin file tergantung pada rasa ke app/direktori:

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
}

Batasan: Anda harus mengubah myFlavor secara manual dalam gradle setiap kali Anda ingin menjalankan untuk rasa yang berbeda (karena hardcoded).

Saya mencoba banyak cara untuk mendapatkan cita rasa build seperti afterEvaluateclose ... tidak bisa mendapatkan solusi yang lebih baik sampai sekarang.

Perbarui, solusi lain: satu google-services.json untuk semua rasa:

Anda juga dapat, memiliki nama paket yang berbeda untuk setiap rasa dan kemudian di konsol pengembang google Anda tidak harus membuat dua aplikasi yang berbeda untuk setiap rasa, tetapi hanya dua klien berbeda dalam aplikasi yang sama. Maka Anda hanya akan memiliki satu google-services.jsonyang berisi kedua klien Anda. Tentu saja, ini tergantung pada bagaimana Anda menerapkan backend dari rasa Anda. Jika mereka tidak dipisahkan maka solusi ini tidak akan membantu Anda.

ahmed_khan_89
sumber
maksud Anda jika backend dipisahkan, maka ini tidak akan berhasil untuk Anda, saya percaya
ZakTaccardi
semua tergantung pada bagaimana definisi Anda tentang rasa di kedua sisi; klien dan server. Dalam kasus saya, nama paket berbeda, url server berbeda, dan basis data berbeda. Jadi server akan mengirimkan pemberitahuan kepada pengguna di database yang sesuai. Pengguna A memiliki token 1 untuk flavor1 dan token2 untuk flavor2. Jika Anda memiliki entri database yang berbeda maka Anda tidak akan memiliki masalah.
ahmed_khan_89
Saya mencoba membuat tugas yang menyalin dan kemudian memohonnya pada proses debug atau proses rilis tertentu dan untuk berpikir ini bekerja. Berharap ini diposting sebelumnya
humblerookie
1
Menggunakan satu google-services.jsonuntuk keduanya releasedan debugbekerja untuk saya, sebagaimana disebutkan dalam pembaruan Anda. Saya pikir ini adalah solusi paling sederhana jika Anda hanya mencoba membagi debugbangunan Anda , seperti saya. Untuk referensi, Anda dapat membuat file di sini: developers.google.com/mobile/add?platform=android
yuval
12

Menurut jawaban ahmed_khan_89 , Anda dapat menempatkan "copy code" di dalam rasa produk.

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

Maka Anda tidak perlu beralih pengaturan secara manual.

Kros CS Huang
sumber
2
@ Zakakaccardi tetapi pertanyaannya adalah untuk rasa, bukan untuk tipe build
bryant1410
1
ini tidak sebaik solusi sebagai medium.com/@ZakTaccardi/…
ZakTaccardi
2
Tidak bekerja Ini menjalankan kedua perintah penyalinan terlepas dari rasa pembuatan, sehingga json produksi selalu di direktori aplikasi.
Isaac
Itu bekerja untuk rasa. Tidak perlu beralih variabel secara manual di build.gradle.
Vito Valov
9

Saya menggunakan file google-services.json, dibuat dari sini: https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging % 2Fandroid% 2Flient & cntlbl = Lanjutkan% 20Tambahkan% 20GCM% 20Dukungan &% 3Konfigurasi%% 3Dtrue

Dalam struktur JSON ada array JSON yang disebut klien. Jika Anda memiliki banyak rasa, tambahkan saja properti yang berbeda di sini.

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

Dalam proyek saya, saya menggunakan id proyek yang sama dan ketika saya menambahkan nama paket kedua di url di atas, google memberi saya file yang berisi banyak klien di data json.

Maaf untuk data JSON yang ringkas. Saya tidak bisa memformatnya dengan benar ...

Mark Martinsson
sumber
8

File google-services.json tidak perlu menerima pemberitahuan. Cukup tambahkan variabel untuk setiap rasa dalam file build.gradle Anda:

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

Gunakan variabel ini BuildConfig.GCM_SENDER_ID alih-alih getString (R.string.gcm_defaultSenderId) saat mendaftar:

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

1.) Apa yang sebenarnya dilakukan google-services.json?

Ikuti ini: https://stackoverflow.com/a/31598587/2382964

2.) Bagaimana file google-services.json memengaruhi proyek studio android Anda?

Ikuti ini: https://stackoverflow.com/a/33083898/2382964

singkatnya untuk url kedua, jika Anda menambahkan google-services.json di proyek Anda harus ada google-servicesfolder yang dibuat secara otomatis untuk debugvarian di jalur ini

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

3.) Apa yang harus dilakukan, untuk membuatnya selesai?

tambahkan ketergantungan layanan Google di project_levelbuild.gradle, Anda juga dapat menggunakan version 3.0.0jika Anda menggunakan pustaka app_compact.

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

sekarang di app_levelbuild.gradle Anda harus menambahkan di bagian bawah.

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

4.) Tempat meletakkan file google-service.json di struktur Anda.

kasus 1.) jika Anda tidak memiliki build_flavour, taruh saja di dalam /app/google-service.jsonfolder.

kasus 2.) jika Anda memiliki beberapa build_flavor dan Anda memiliki file google_services.json yang berbeda-beda app/src/build_flavor/google-service.json.

kasus 3.) jika Anda memiliki beberapa build_flavor dan Anda memiliki satu file google_services.json dimasukkan ke dalam app/google-service.json.

Tushar Pandey
sumber
4

Tidak perlu skrip gradle tambahan.

Google mulai menambahkan nama paket berbeda dengan nama 'android_client_info'. Sepertinya di bawah ini di google-services.json

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

jadi, langkah-langkah berikut cukup untuk memiliki pilihan google-services.json yang berbeda.

  1. Memiliki 2 rasa
  2. Tambahkan paket dev flavour baru ke halaman konfigurasi analis google dan unduh google-services.json.
  3. Perhatikan di file konfigurasi baru, kedua id paket flavour Anda ada di sana
  4. Persiapkan semua cita rasa Anda.

Hanya itu saja!..

Rames Palanisamy
sumber
1
Saya tidak yakin apa yang 2) dan 3) merujuk tepatnya. Saya tidak dapat menemukan mana pun di analytics.google.com tempat saya dapat menambahkan nama paket, selain menautkan play store. Satu-satunya tempat yang saya temukan untuk mengunduh json adalah dari sini developers.google.com/mobile/add dan itu tidak mengizinkan penambahan beberapa nama paket. Apakah ini akan berhasil hanya dengan menambahkan nama paket secara manual ke android_client_info?
arberg
1
@arberg Anda dapat menambahkan beberapa nama paket ke proyek yang sama lalu mengunduh file. Periksa di sini: github.com/googlesamples/google-services/issues/54
Christer Nordvik
4

Kami memiliki nama paket yang berbeda untuk debug build (* .debug) jadi saya menginginkan sesuatu yang bekerja berdasarkan rasa dan buildType, tanpa harus menulis apa pun yang terkait dengan rasa dalam pola processDebugFlavorGoogleServices.

Saya membuat folder bernama "google-services" di setiap rasa, yang berisi versi debug dan versi rilis file json:

masukkan deskripsi gambar di sini

Di bagian buildTypes dari file gradle Anda, tambahkan ini:

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

Ini akan menyalin file json kanan di root modul aplikasi Anda secara otomatis ketika Anda akan beralih varian build.

Tambahkan dua metode yang dipanggil untuk mendapatkan rasa saat ini dan tipe build saat ini di root build.gradle Anda

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

Itu saja, Anda tidak perlu khawatir tentang menghapus / menambahkan / memodifikasi rasa dari file gradle Anda, dan itu mendapatkan debug atau rilis google-services.json secara otomatis.

FallasB
sumber
4

Firebase sekarang mendukung beberapa id aplikasi dengan satu file google-services.json.

Posting blog ini menjelaskannya secara rinci.

Anda akan membuat satu proyek induk di Firebase yang akan Anda gunakan untuk semua varian Anda. Anda kemudian membuat aplikasi Android terpisah di Firebase di bawah proyek itu untuk setiap id aplikasi yang Anda miliki.

Ketika Anda membuat semua varian Anda, Anda dapat mengunduh google-services.json yang mendukung semua id aplikasi Anda. Ketika relevan untuk melihat data secara terpisah (yaitu Pelaporan Kecelakaan) Anda dapat mengubahnya dengan dropdown.

bMcNees
sumber
4

Menurut Firebase docs, Anda juga dapat menggunakan sumber daya string alih-alih google-services.json .

Karena penyedia ini hanya membaca sumber daya dengan nama-nama yang dikenal, opsi lain adalah menambahkan sumber daya string langsung ke aplikasi Anda alih-alih menggunakan plugin Google Services gradle. Anda dapat melakukannya dengan:

  • Menghapus google-servicesplugin dari root build.gradle Anda
  • Menghapus google-services.jsondari proyek Anda
  • Menambahkan sumber daya string secara langsung
  • Menghapus plugin yang berlaku: 'com.google.gms.google-services'dari build.gradle aplikasi Anda

Contoh 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>
David P
sumber
2
Saya mengalami kesulitan untuk mencocokkan nilai kunci mana di file google-services.json yang cocok dengan string yang sesuai, tetapi kemudian saya menemukan ini yang membantu: developers.google.com/android/guides/... Diposting jika ada orang lain yang memiliki masalah yang sama.
Saifur Rahman Mohsin
3

Berdasarkan jawaban @ ZakTaccardi, dan dengan asumsi Anda tidak ingin satu proyek untuk kedua rasa, tambahkan ini ke akhir build.gradlefile Anda :

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
}

Anda harus memiliki file src/staging/google-services.jsondan src/production/google-services.json. Ganti nama rasa dengan yang Anda gunakan.

bryant1410
sumber
3

Saya telah menemukan bahwa plugin google-services tidak berguna untuk proyek yang ingin menambahkan GCM. Ini hanya menghasilkan file berikut yang hanya menambahkan ID proyek Anda sebagai sumber daya string:

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

Tampaknya Anda hanya memerlukannya jika Anda menyalin kode sampel kata demi kata langsung dari panduan Cloud Messaging untuk Android . Berikut ini contohnya:

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

Larutan

Jika Anda ingin dapat beralih proyek API untuk berbagai jenis bangunan atau citarasa produk, Anda bisa menentukan konstanta Anda sendiri dan memilih yang sesuai saat memanggil 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);

Untuk Rasa Produk

Kode di atas berfungsi untuk beralih antara debug dan rilis build. Untuk citarasa produk, Anda akan mendefinisikan kunci API yang berbeda dalam file sumber java dan menempatkan file dalam direktori rasa produk yang sesuai. Untuk referensi: Gradle Build Variants

kjones
sumber
@swimmingtomars Anda mungkin tidak perlu menerapkan plugin layanan google. Jika Anda menggunakan metode ini, Anda tidak dapat menerapkan plugin layanan google. Lihat jawaban yang diterima jika Anda memerlukan plugin ini untuk layanan selain GCM.
kjones
3

DIPERBARUI:

Dalam hal pengaturan Firebase dengan varian build, silakan merujuk ke blog ini yang memiliki instruksi terperinci.

KayAnn
sumber
2

Maksud dari plugin google-services adalah menyederhanakan integrasi fitur Google.

Karena hanya menghasilkan sumber daya android dari file google-services.json, logika gradle yang terlalu rumit meniadakan hal ini, saya pikir.

Jadi jika Google-docs tidak mengatakan sumber daya mana yang diperlukan untuk fitur-fitur Google tertentu, saya sarankan untuk membuat file JSON untuk setiap buildtype / flavour yang relevan, lihat sumber daya apa yang dihasilkan oleh plugin dan kemudian masukkan sumber daya tersebut secara manual ke direktori src / buildtypeORflavor / res masing-masing.

Hapus referensi untuk plugin google-services dan file JSON setelah itu, dan Anda selesai.

Untuk informasi rinci tentang cara kerja google-services gradle-plugin lihat jawaban saya yang lain:

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

arne.jans
sumber
Saya tidak mengerti bagaimana menggunakan jawaban Anda, saya bisa memasukkan 2 google-service.json. 1 untuk debug dan satu lagi untuk rilis
penduDev
2

Menyederhanakan apa yang dikatakan @Scotti. Anda perlu membuat aplikasi Multiples dengan nama paket berbeda untuk Proyek tertentu tergantung pada rasa produk.

Misalkan Proyek Anda adalah ABC yang memiliki rasa produk yang berbeda X, Y di mana X memiliki nama paket com.x dan Y memiliki nama paket com.y maka di konsol firebase Anda perlu membuat proyek ABC di mana Anda perlu membuat 2 aplikasi dengan nama paket com.x dan com.y. Maka Anda perlu mengunduh file google-services.json di mana akan ada 2 objek klien-info yang akan berisi pacakges dan Anda akan baik-baik saja.

Potongan json akan menjadi seperti ini

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

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

    }
Sagar Devanga
sumber
2

Memang, hanya satu google-services.json dalam MyApp/app/direktori yang baik, tidak perlu script tambahan com.google.gms:google-services:3.0.0. Tapi hati-hati menghapus file google-services.jsondari direktori aplikasi MyApp/app/src/flavor1/res/untuk menghindari jenis kesalahanExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package

gigeos
sumber
2

Jadi, jika Anda ingin menyalin google-services.jsonfile dari semua varian Anda secara terprogram ke dalam folder root Anda. Saat Anda beralih ke varian tertentu, inilah solusi untuk Anda

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

Ada peringatan untuk pendekatan ini yaitu Anda perlu memiliki google-service.jsonfile di setiap folder varian Anda di sini sebagai contoh.gambar varian

pratham kesarkar
sumber
1

Anda memiliki banyak rasa, jadi itu berarti Anda akan memiliki banyak paket id berbeda, bukan? Jadi, pergi saja ke halaman di mana Anda mengatur / menghasilkan file json Anda dan mengkonfigurasi untuk setiap nama paket. Semua itu akan menambah file json.

Saya sangat malas untuk mengirim gambar sekarang, tetapi pada dasarnya:

  • buka https://developers.google.com/mobile/add
  • pilih platform
  • pilih aplikasi Anda
  • PENTING : ketik nama paket rasa Anda ke bidang "nama paket android"
  • ... lanjutkan untuk mendapatkan file konfigurasi Anda. Unduh itu!

Saat mengkonfigurasi file, Anda dapat melihat bahwa google menunjukkan kepada Anda Server API Key + ID Pengirim. Dan itu sama untuk semua paket (rasa)

Pada akhirnya, Anda hanya perlu satu file json untuk semua rasa.

Satu lagi pertanyaan di sini yang harus Anda uji ketika Anda mendaftar untuk mendapatkan Token Registrasi, periksa apakah ada perbedaan untuk setiap rasa. Saya tidak menyentuhnya tetapi berpikir itu harus menjadi perbedaan. Terlambat sekarang dan aku sangat ngantuk :) Semoga bisa membantu!

L Hong Hoàng
sumber
1

Hai Teman juga mencari nama hanya menggunakan huruf kecil maka Anda tidak mendapatkan kesalahan ini

Divyesh Jani
sumber
0

Saat ini saya menggunakan dua Id Proyek GCM dalam paket aplikasi yang sama. Saya meletakkan google-service.json dari proyek GCM pertama saya tetapi saya beralih dari yang pertama ke yang kedua hanya mengubah SENDER_ID:

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

(Pada titik ini saya berpikir bahwa google-services.json tidak wajib)

ariostoi
sumber
0

Terinspirasi oleh @ ahmed_khan_89 jawaban di atas. Kita dapat langsung menyimpan seperti ini di file 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
}
Noundla Sandeep
sumber
0

Tempatkan file "google-services.json" Anda di app / src / flavours masing-masing kemudian di build.gradle app, di bawah Android tambahkan kode di bawah ini

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'
                    }
                }
            }
        }
    }
Sameer Khader
sumber