さまざまなproductFlavorsのgoogle-services.json


453

アップデート: GCMが廃止されて、使用FCM

こちらの Googleデベロッパーページのガイドに従って、新しいGoogleクラウドメッセージングを実装しています

正常に実行してテストしました。しかし今私の問題は、異なるapplicationId / packageNameと異なるGoogle Cloud Messaging Project Idを持つ異なる製品フレーバーを持っていることです。google-services.json置かれなければなら/app/google-services.jsonない味フォルダ。

google-services.json多くのフレーバーで設定を変える方法はありますか?


Mavenのために、私たちはすべてのプロファイルのためにMavenのプロファイルと個別のプロパティファイルを使用して、類似した何かを実装しました
sakis kaliakoudas

1
あなただけがsender_idを使用したい場合は、Googleコンソールからパッケージ名なしでキーを生成します。
Murtaza Khursheed Hussain 2015

apply plugin: 'com.google.gms.google-services'Gradleファイルの行はgcm文字列をapp/build/generated/res/google-services/debug/values/values.xml... に入れているようです
Alexander Farber


これを必ずお読みください:firebase.googleblog.com/2016/08/…あらゆる可能性とトレードオフをカバーしています。
Albert Vila Calvo

回答:


509

Googleは、play servicesプラグインのバージョン2.0にフレーバーのサポートを含めました。このバージョンのgradle plugin com.google.gms:google-services:2.0.0-alpha3

あなたはこれを行うことができます

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

プラグインのバージョン3.0.0は、次の場所でjsonファイルを検索します(flavorflavor1とビルドタイプがあることを考慮してくださいdebug)。

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

これは、flavorDimensionsを使用しても機能しました。私は1つの次元で無料と有料を、もう1つの次元でモックと製品を持っています。また、3つのbuildTypeがあります。デバッグ、リリース、ステージングです。これは、私のプロジェクトでFreeProdフレーバーがどのように見えるかです。

ここに画像の説明を入力してください

google-services.jsonファイルの数はプロジェクトの特性によって異なりますが、Googleプロジェクトごとに少なくとも1つのjsonファイルが必要です。

このプラグインがこれらのjsonファイルをどのように処理するかについて詳しく知りたい場合は、https//github.com/googlesamples/google-services/issues/54#issuecomment-165824720をご覧ください。

公式ドキュメントへのリンク:https : //developers.google.com/android/guides/google-services-plugin

情報が更新されたブログ投稿:https : //firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

そして、このプラグインの最新バージョンを確認するには、こちらにアクセスしてくださいhttps : //bintray.com/android/android-tools/com.google.gms.google-services/view


13
これは私にとって何らかの理由で機能しません-Gradleビルドエラーが発生するFile google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.ので、ビルドスクリプトを介して毎回ルートフォルダーにフレーバーファイルをコピーすることにします。
dodgy_coder

2
魅力のように働きました、これを神に感謝します。google-services.jsonとAPIを使用するこのまったく新しい方法は、一歩後ろのように見えます。これがどのように簡単になると思われるかわからない。
RED_ 2016年

140
googl-services.jsonは嫌なものです... APIキーと送信者IDをプラグインするよりも、いくつかのクレイジーjsonファイルを管理する方が簡単ですか?ナンセンスをグーグルで止めてください
グレッグエニス2016年

19
最新バージョンの構成ファイルジェネレーターは、同じ構成ファイルに複数のプロパティを配置します。フレーバーレベルで個別のプロパティではなく、アプリレベルで1つだけ必要です。両方の設定が同じ「アプリ名」フィールドで生成されていることを確認する必要があるだけです。
sroskelley、2016年

5
Android Studio 3.1.4以降、/ app / src / flavor1 / google-services.jsonの使用は機能しなくなりました。ファイルは/app/src/flavor1/debug/google-services.jsonおよび/app/src/flavor1/release/google-services.jsonに配置する必要があります。
nurider '26

71

更新:次の説明は、1つのFirebaseプロジェクトとそのプロジェクト内の異なるFirebaseアプリを含む1つのAndroid Studioプロジェクトに関するものです。同じAndroid Studioプロジェクト内の異なるFirebaseプロジェクト内の異なるFirebaseアプリ用に異なるJSONファイルを作成することを目的とする場合(または、違いがわからない場合)は、こちらをご覧ください。

AndroidアプリケーションID(通常はパッケージ名)ごとに1つのFirebaseアプリが必要です。Gradleビルドバリアントごとに1つのアプリケーションIDを持つのが一般的です(これは、GradleビルドタイプとGradleビルドフレーバーを使用している場合に起こりそうです)。


通りGoogleのサービス3.0および使用Firebaseを、異なる味のために別のファイルを作成する必要はありません。互いに構成するproductFlavoursとBuildタイプがある場合、異なるフレーバーに異なるファイルを作成することは、明確ではないか、簡単ではありません。

同じファイルには、すべてのビルドタイプとフレーバーに必要なすべての構成が含まれています。

Firebaseコンソールでは、パッケージ名ごとに1つのアプリを追加する必要があります。2つのフレーバー(開発とライブ)と2つのビルドタイプ(デバッグとリリース)があるとします。設定によって異なりますが、次のような4つの異なるパッケージ名がある可能性があります。

  • com.stackoverflow.example(ライブ-リリース)
  • com.stackoverflow.example.dev(ライブ-開発)
  • com.stackoverflow.example.debug(デバッグ-リリース)
  • com.stackoverflow.example.dev.debug(debug-dev)

Firebaseコンソールには4つの異なるAndroidアプリが必要です。(それぞれに、デバッグ用にSHA-1を追加し、使用している各コンピューターでライブにする必要があります)

google-services.jsonファイルをダウンロードする場合、実際にはどのアプリをダウンロードしてもかまいません。すべてのアプリには、すべてのアプリに関連する同じ情報が含まれています。

次に、このファイルをアプリレベル(app /)で見つける必要があります。

ここに画像の説明を入力してください

そのファイルを開くと、すべてのパッケージ名のすべての情報が含まれていることがわかります。

課題はプラグインでした。これを機能させるには、ファイルの下部にプラグインを配置する必要があります。だからこの線

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

...アプリのbuild.gradleファイルの下部に配置する必要があります。

ここで述べたほとんどの場合、それは以前のバージョンにも適用されます。構成ごとに異なるファイルを使用したことはありませんでしたが、Firebaseコンソールを使用すると、すべての構成に必要なすべてを1つのファイルにまとめることができるため、簡単になりました。


私はdevelopers.google.com/mobile/addから自分のものを生成し、1つのパッケージ名を入力する機会は1つしかありません。これを設定するFirebaseの場所、または複数のフレーバーでgoogle-services.jsonファイルがどのように見えるか
CQM

@CQMいくつかのリンクを追加して回答を更新しました。回答に記載されているように、Firebaseのドキュメントをチェックアウトし、FirebaseコンソールでJSONファイルを生成できます。
Sotti

7
これは本当に良い答えであり、この質問に対する唯一の正しい答えになるはずです。
Nando

1
あなたが上でそれを説明したように、私が非常に同じ問題に遭遇したときに私はこれを自分で発見しました。私はここに来て、後世のための答えを提出しました。バージョン3.0.0では、これが確かに最良の答えです。
Tash Pemhiwa 2017年

6
これは、すべてのフレーバーが同じfirebaseプロジェクト内にある場合にのみ機能することに注意してください。複数のプロジェクトを使用している場合(私は開発とステージを1つのFirebaseプロジェクトで維持し、別のGoogleアカウントの別の専用製品プロジェクトで製品を作成する傾向があります)、Yair Kukielkaによって概説されているソリューションが必要です。実際、プラグインはさまざまなパスをサポートしているようです-ビルド中に、プラグインがgoogle-services.jsonファイルを探しに行った場所についてのヒントが表示されます。「[src / prod / debug、src / debug / prod、src / prod、src / debug、src / prodDebug] "
JHH

43

この問題に関するミディアムポストを書いた。

同様の問題(フレーバーの代わりにBuildTypesを使用)があり、そのように修正しました。

Gradleの依存関係管理システムを活用してください。私は2つのタスクを作成し、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タスクを使用して、フレーバーごとのレベルで変更します。


しかし、これは、OPによって投稿されたフレーバーではなく、buildTypesで機能します
bryant1410

1
@ bryant1410フレーバーを使用している場合-代わりにprocessDebugFlavorGoogleServicesタスクにフックできると思います。
ZakTaccardi 2015

質問はbuildTypesではなくフレーバーに関するものだったので、答えを変更する必要があると思います。この答えを2番目の選択肢として残すこともできると思います
bryant1410

1
@ bryant1410ロジックは、フレーバーでもbuildTypeでも基本的に同じです。あなたはそれを理解できるはずです
ZakTaccardi

1
@IgorGanapolskyはい、2つのバージョン
ZakTaccardi 2016

13

さて、私は同じ問題に遭遇しており、完璧な解決策を得ることができませんでした。これは単なる回避策です。Googleがフレーバーについてどう考えていなかったのか...?そして、彼らがすぐにより良い解決策を提案することを願っています。

私がやっていること:

2つのフレーバーがあり、それぞれに対応するgoogle-services.json:src/flavor1/google-services.jsonsrc/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
}

制限:別のフレーバーで実行するたびに、gradleをmyFlavor 手動で変更する必要があります(ハードコードされているため)。

現在のビルドのフレーバーを取得するために、さまざまな方法を試してみましたafterEvaluate

更新、別のソリューション:すべてのフレーバー用の1つのgoogle-services.json:

また、フレーバーごとに異なるパッケージ名を指定して、Googleデベロッパーコンソールで、フレーバーごとに2つの異なるアプリを作成する必要はなく、同じアプリで2つの異なるクライアントを作成するだけでもかまいません。次にgoogle-services.json、両方のクライアントを含む1つだけが存在します。もちろん、これはフレーバーのバックエンドの実装方法に依存します。それらが分離されていない場合、このソリューションは役に立ちません。


つまり、バックエンドが分離されている場合、これは機能しません
。ZakTaccardiは

すべては、両側のフレーバーの定義に依存します。クライアントとサーバー。私の場合、異なるパッケージ名、異なるサーバーURL、異なるデータベース。したがって、サーバーは対応するデータベースのユーザーに通知を送信します。ユーザーAには、フレーバー1のトークン1とフレーバー2のトークン2があります。別のデータベースエントリがある場合、問題はありません。
ahmed_khan_89

私はコピータスクを作成し、特定のデバッグプロセスやリリースプロセスでそれらを起動しようとした、これは.Wishを働いたと思うし、このWSは以前の投稿
humblerookie

1
1使用してgoogle-services.json両方のためにreleasedebug、あなたの更新で述べたように、私のために働きました。私の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


2
動作しません。これにより、ビルドフレーバーに関係なく両方のコピーコマンドが実行されるため、本番jsonは常にappディレクトリにあります。
Isaac

それは味のために働きます。build.gradleで変数を手動で切り替える必要はありません。
Vito Valov

9

ここで作成したgoogle-services.jsonファイルを使用しています:https : //developers.google.com/mobile/add? platform=android&cntapi=gcm&cnturl= https : % 2F%2Fdevelopers.google.com%2Fcloud- messaging %2Fandroid%2Fclient&cntlbl = Continue%20Adding%20GCM%20Support&%3Fconfigured%3Dtrue

JSON構造には、クライアントと呼ばれるJSON配列があります。複数のフレーバーがある場合は、ここに異なるプロパティを追加してください。

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

私のプロジェクトでは同じプロジェクトIDを使用しています。上記のURLに2番目のパッケージ名を追加すると、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ファイルはAndroid Studioプロジェクトにどのように影響しますか?

これに従ってください:https : //stackoverflow.com/a/33083898/2382964

2番目のURLの略で、プロジェクトにgoogle-services.jsonを追加する場合、このパスにバリアント 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.)複数のbuild_flavorがあり、異なるgoogle_services.jsonファイルが中に配置されている場合app/src/build_flavor/google-service.json

ケース3.)複数のbuild_flavorがあり、その中に単一のgoogle_services.jsonファイルがある場合app/google-service.json


4

追加のgradleスクリプトは必要ありません。

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. 新しい構成ファイルに、フレーバーのパッケージIDが両方ともあることに注意してください。
  4. フレーバービルドを準備します。

それだ!..


1
2)と3)が正確に何を指しているのかわかりません。Playストアをリンクする以外に、analytics.google.comでパッケージ名を追加できる場所が見つかりません。私がjsonをダウンロードできる唯一の場所は、developers.google.com / mobile / addからで、複数のパッケージ名を追加することはできません。android_client_infoにパッケージ名を手動で追加するだけで機能しますか?
arberg

1
@arberg同じプロジェクトに複数のパッケージ名を追加して、ファイルをダウンロードできます。こちらを確認してください:github.com/googlesamples/google-services/issues/54
Christer Nordvik

4

デバッグビルドには別のパッケージ名(* .debug)があるため、フレーバーとbuildTypeに基づいて機能し、のパターンにフレーバーに関連するものを記述する必要がないものが必要でしたprocessDebugFlavorGoogleServices

各フレーバーに「google-services」という名前のフォルダーを作成しました。jsonファイルのデバッグバージョンとリリースバージョンの両方が含まれています。

ここに画像の説明を入力してください

あなたのgradleファイルの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のルートに現在のフレーバーと現在のビルドタイプを取得するために呼び出される2つのメソッドを追加します

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

    Pattern pattern;

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

    Matcher matcher = pattern.matcher( tskReqStr )

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

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

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

    println "NO MATCH FOUND"
    return "";
}

それだけです。gradleファイルからフレーバーを削除/追加/変更することを心配する必要はありません。デバッグまたはリリースgoogle-services.jsonが自動的に取得されます。


4

Firebaseは1つのgoogle-services.jsonファイルで複数のアプリケーションIDをサポートするようになりました。

このブログ投稿では、それについて詳しく説明しています。

Firebaseで1つの親プロジェクトを作成し、すべてのバリアントに使用します。次に、Firebaseで、プロジェクトごとに、所有しているアプリケーションIDごとに個別のAndroidアプリケーションを作成します。

すべてのバリアントを作成したら、すべてのアプリケーションIDをサポートするgoogle-services.jsonをダウンロードできます。データを個別に表示することが適切な場合(つまり、Crash Reporting)、ドロップダウンでそれを切り替えることができます。


4

Firebaseドキュメントによると、google-services.jsonの代わりに文字列リソースを使用することもできます

このプロバイダーは既知の名前のリソースを読み取るだけなので、別のオプションは、GoogleサービスGradleプラグインを使用する代わりに、文字列リソースをアプリに直接追加することです。これは次の方法で実行できます。

  • 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/... 他の誰かが同じ問題を持っている場合で掲示し。
Saifur Ra​​hman Mohsin

3

@ZakTaccardiの回答に基づいており、両方のフレーバーに対して単一のプロジェクトが必要でないと仮定して、これをbuild.gradleファイルの最後に追加します。

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

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

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

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

ファイルsrc/staging/google-services.jsonとが必要ですsrc/production/google-services.json。使用するフレーバー名を置き換えます。


3

google-servicesプラグインは、GCMを追加するプロジェクトにはまったく役に立たないことがわかりました。次のファイルを生成するだけで、プロジェクトIDを文字列リソースとして追加するだけです。

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

Cloud Messaging for Androidガイドから直接サンプルコードをそのままコピーした場合にのみ必要となるようです。これが行の例です:

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

解決

異なるビルドタイプまたは製品フレーバーのAPIプロジェクトを切り替えることができるようにしたい場合は、独自の定数を定義して、getToken()APIを呼び出すときに適切な定数を選択できます。

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

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

製品フレーバーについて

上記のコードは、デバッグビルドとリリースビルドを切り替えるために機能します。製品フレーバーの場合、Javaソースファイルで異なるAPIキーを定義し、対応する製品フレーバーディレクトリにファイルを配置します。参考:Gradleビルドバリアント


@swimmingtomars google-serviceプラグインを不必要に適用している可能性があります。この方法を使用する場合、google-servicesプラグインを適用できません。GCM以外のサービスにこのプラグインが必要な場合は、承認された回答を参照してください。
kjones 2016年

3

更新しました:

ビルドバリアントを使用したFirebaseのセットアップについては、詳細な手順が記載されているこのブログを参照してください。


2

google-servicesプラグインのポイントは、Google機能の統合を簡素化することです。

google-services.jsonファイルからandroid-resourcesを生成するだけなので、過度に複雑なgradle-logicはこの点を無効にすると思います。

したがって、Googleドキュメントで特定のGoogle機能に必要なリソースが示されていない場合は、関連する各ビルドタイプ/フレーバーのJSONファイルを生成し、プラグインによって生成されるリソースを確認して、それらのリソースを手動で配置することをお勧めしますそれぞれのsrc / buildtypeORflavor / resディレクトリに。

その後、google-servicesプラグインへの参照とJSONファイルを削除すれば完了です。

google-services gradle-pluginの内部動作の詳細については、他の回答を参照してください。

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


あなたの回答の使い方がわかりません。2つのgoogle-service.jsonを含めることができます。1つはデバッグ用、もう1つはリリース用
penduDev

2

@Scottiの発言の簡素化。製品のフレーバーに応じて、特定のプロジェクトに対して異なるパッケージ名でマルチプルアプリを作成する必要があります。

あなたのプロジェクトがABCで製品フレーバーが異なるX、Yであるとします。Xはパッケージ名com.xで、Yはパッケージ名com.yです。次に、FirebaseコンソールでプロジェクトABCを作成し、2つのアプリを作成する必要があります。パッケージ名はcom.xおよびcom.yです。次に、これらのパッケージを含む2つのclient-infoオブジェクトが含まれるgoogle-services.jsonファイルをダウンロードする必要があります。これで問題ありません。

jsonのスニペットはこのようなものになります

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

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

    }

2

実際、ディレクトリ内の1つの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

あなたは多くのフレーバーを持っているので、多くの違いのあるパッケージIDを持つことになるということですよね?したがって、各パッケージ名のjsonファイルと構成をセットアップ/生成するページに移動します。それはすべてjsonファイルに追加されます。

私は今、写真を投稿するのがとても面倒ですが、基本的に:

  • https://developers.google.com/mobile/addに移動します
  • プラットフォームを選択
  • アプリを選択
  • 重要:フレーバーパッケージ名を「Androidパッケージ名」フィールドに入力してください
  • ...引き続き構成ファイルを取得します。ダウンロードしてください!

ファイルを設定すると、GoogleがサーバーAPIキー+送信者IDを表示することがわかります。そして、それはすべてのパッケージ(フレーバー)で同じです

最後に、すべてのフレーバーに必要なjsonファイルは1つだけです。

ここで、登録トークンを取得するために登録するときにテストする必要があるもう1つの質問、各フレーバーの違いを確認してください。私はそれに触れませんが、それは違いであるべきだと思います。今は遅すぎるし、私はとても眠い:)それが役に立てば幸い!


1

Hey Friendsも小文字のみの名前の使用を検索し、このエラーが発生しないようにします


0

現在、同じアプリパッケージで2つのGCMプロジェクトIDを使用しています。私は最初のGCMプロジェクトのgoogle-service.jsonを配置しましたが、SENDER_IDを変更するだけで、最初のプロジェクトから2番目のプロジェクトに切り替えました。

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

(現時点では、google-services.jsonは必須ではないと思います)


0

上記の@ ahmed_khan_89の回答に触発されました。このようにgradleファイルに直接保存できます。

android{

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

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

0

「google-services.json」ファイルをそれぞれapp / src / flavorsに配置し、次にappのbuild.gradleに、androidの下にコードを追加

gradle.taskGraph.beforeTask { Task task ->
        if (task.name ==~ /process.*GoogleServices/) {
            android.applicationVariants.all { variant ->
                if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
                    copy {
                        from "/src/${variant.flavorName}"
                        into '.'
                        include 'google-services.json'
                    }
                }
            }
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.