다른 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많은 맛에 대해 구성을 다르게 만드는 방법이 있습니까?


메이븐을 위해, 우리는 모든 프로필 받는다는 프로파일과 별도의 등록 정보 파일을 사용하여 비슷한 구현했습니다
sakis kaliakoudas

1
sender_id를 사용하려면 Google 콘솔에서 패키지 이름없이 키를 생성하십시오.
Murtaza Khursheed 후세인

apply plugin: 'com.google.gms.google-services'gradle 파일 의 줄 은 gcm문자열 을 넣는 것 같습니다 app/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber

내가 찾은 가장 좋은 답변은 이 질문에 있습니다
Estel

firebase.googleblog.com/2016/08/… 을 읽어보십시오 . 모든 가능성과 장단점을 다룹니다.
Albert Vila Calvo

답변:


509

Google은 Play 서비스 플러그인 버전 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를 사용하더라도 나에게 효과적이었습니다. 한 차원에서 무료로 지불하고 다른 차원에서 Mock & Prod를 사용했습니다. 또한 디버그, 릴리스 및 스테이징의 세 가지 빌드 유형이 있습니다. 이것이 내 프로젝트에서 FreeProd 맛을 보는 방법입니다.

여기에 이미지 설명을 입력하십시오

google-services.json 파일 수는 프로젝트의 특성에 따라 다르지만 모든 Google 프로젝트마다 하나 이상의 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_

140
googl-services.json은 혐오입니다 ... API 키와 발신자 ID를 연결하는 것보다 미친 JSON 파일을 어떻게 관리하는 것이 쉬운가요? 구글은 말도 안돼
그렉 Ennis

19
최신 버전의 구성 파일 생성기는 여러 구성 속성을 동일한 구성 파일에 저장하며 플레이버 수준의 별도 속성 대신 앱 수준에서 다시 하나만 필요합니다. 두 구성이 모두 동일한 "앱 이름"필드에 생성되도록해야합니다.
sroskelley

5
Android Studio 3.1.4부터 /app/src/flavor1/google-services.json을 사용하면 더 이상 작동하지 않습니다. 파일은 /app/src/flavor1/debug/google-services.json 및 /app/src/flavor1/release/google-services.json에 있어야합니다.
nurider

71

업데이트 : 다음 설명은 하나의 Android Studio 프로젝트에 대한 것으로, 해당 프로젝트 내에 하나의 Firebase 프로젝트와 다른 Firebase 앱이 있습니다. 동일한 Android Studio 프로젝트 내의 다른 Firebase 프로젝트에서 다른 Firebase 앱에 대해 다른 JSON 파일을 갖는 것이 목표라면 (또는 차이점이 무엇인지 모르는 경우) 여기를 참조하십시오. .

Android 애플리케이션 ID (일반적으로 패키지 이름) 당 하나의 Firebase 앱이 필요합니다. Gradle 빌드 변형마다 하나의 응용 프로그램 ID를 갖는 것이 일반적입니다 (Gradle 빌드 유형 및 Gradle 빌드 풍미를 사용하는 경우)


현재 Google 서비스 3.0 및 사용 중포 기지를 서로 다른 맛에 대해 서로 다른 파일을 만들 필요는 없습니다. 서로 다른 풍미 및 빌드 유형이있는 경우 다른 풍미에 대해 다른 파일을 작성하는 것이 명확하거나 간단하지 않을 수 있습니다.

같은 파일에는 모든 빌드 유형과 맛에 필요한 모든 구성이 있습니다.

Firebase 콘솔에서 패키지 이름 당 하나의 앱을 추가해야합니다. 2 가지 맛 (dev 및 live)과 2 가지 빌드 유형 (debug and release)이 있다고 상상해보십시오. 구성에 따라 다음과 같은 4 가지 패키지 이름이있을 수 있습니다.

  • com.stackoverflow.example (실시간 릴리스)
  • com.stackoverflow.example.dev (실시간-dev)
  • com.stackoverflow.example.debug (디버그-릴리스)
  • com.stackoverflow.example.dev.debug (디버그-dev)

Firebase 콘솔에 4 개의 다른 Android 앱이 필요합니다. (각각 사용하고있는 각 컴퓨터에 디버그 및 라이브 용 SHA-1을 추가해야합니다)

google-services.json 파일을 다운로드하면 실제로 어떤 앱을 다운로드하든 상관없이 모든 앱과 관련된 동일한 정보가 포함됩니다.

이제이 파일을 앱 수준 (app /)에서 찾아야합니다.

여기에 이미지 설명을 입력하십시오

해당 파일을 열면 모든 패키지 이름에 대한 모든 정보가 포함되어 있음을 알 수 있습니다.

문제는 플러그인이되는 것입니다. 작동하려면 파일 맨 아래에서 플러그인을 찾아야합니다. 이 라인은 ..

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

... 앱 build.gradle 파일의 맨 아래에 있어야합니다.

여기에 언급 된 대부분의 경우 이전 버전에도 적용됩니다. 다른 설정에 대해 다른 파일을 사용한 적이 없지만 Firebase 콘솔을 사용하면 구성에 필요한 모든 것을 하나의 단일 파일로 제공하기 때문에 더 쉽습니다.


developers.google.com/mobile/add 에서 광산을 생성 하고 하나의 패키지 이름을 넣을 수있는 기회는 단 하나입니다. Firebase가이 위치를 설정하는 장소는 어디입니까, google-services.json 파일은 여러 가지 맛으로 보이는데
CQM

@ CQM 링크를 추가하여 답변을 업데이트했습니다. Firebase 설명서를 확인하고 답변에 설명 된대로 Firebase 콘솔에서 JSON 파일을 생성 할 수 있습니다.
Sotti

7
이것은 정말 좋은 답변 이며이 질문에 대한 유일한 대답이어야합니다.
Nando

1
위에서 설명한 것처럼 똑같은 문제가 발생했을 때 직접 발견했습니다. 나는 당신이 이미 그것을 한 것을 알기 위해 후손에 대한 답변을 제출하기 위해 여기에 왔습니다. 버전 3.0.0, 이것은이다 확실히 가장 좋은 대답.
Tash Pemhiwa

6
모든 맛이 동일한 firebase 프로젝트 내에있는 경우에만 작동합니다. 여러 프로젝트를 사용하는 경우 (하나의 firebase 프로젝트에서 개발 및 단계를 유지하고 다른 Google 계정의 별도의 전용 prod projet에서 prod를 유지하는 경향이 있음) Yair Kukielka가 요약 한 솔루션이 필요합니다. 실제로 플러그인은 다양한 경로를 지원하는 것으로 보입니다. 빌드하는 동안 플러그인이 google-services.json 파일을 찾은 위치에 대한 힌트를 얻을 수 있습니다. "[src / prod를 보면서 google-services.json을 찾을 수 없습니다. / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

이 문제에 대한 중간 게시물 을 작성했습니다.

비슷한 문제 (Flavors 대신 BuildTypes 사용)가 있었고 그렇게 수정했습니다.

Gradle의 종속성 관리 시스템을 활용하십시오. 나는이 작업을 생성 switchToDebug하고 switchToRelease. 언제든지 assembleRelease실행 해야하며 실행해야 switchToRelease합니다. 디버그와 동일합니다.

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

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

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

afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease
}

편집 :processDebugFlavorGoogleServices / processReleaseFlavorGoogleServices작업을 사용 하여 맛 수준별로 수정하십시오.


영업 이익에 의해 게시 그러나이없는 맛을 위해, buildTypes 작동
bryant1410

1
풍미를 사용하는 경우 @ bryant1410-대신 processDebugFlavorGoogleServices 작업에 연결할 수 있다고 생각합니다.
ZakTaccardi

질문은 buildTypes가 아닌 맛에 관한 것이기 때문에 답변에서 변경해야한다고 생각합니다. 난 당신이 또한 두 번째 옵션으로이 답변을 떠날 수 있다고 생각
bryant1410

1
@ bryant1410 논리는 기본적으로 플레이버 또는 buildType에 대해 동일합니다. 당신은 그것을 알아낼 수 있어야합니다
ZakTaccardi

1
@IgorGanapolsky 네, 두 가지 버전
ZakTaccardi

13

글쎄, 같은 문제가 발생하여 완벽한 해결책을 얻지 못했습니다. 해결 방법 일뿐입니다. Google이 맛에 대해 어떻게 생각하지 않았는지 궁금합니다. 그리고 그들이 더 나은 해결책을 제안하기를 바랍니다.

내가하고있는 일 :

나는 해당 Google-services.json를 넣어 각 하나에 두 개의 맛을 가지고 src/flavor1/google-services.jsonsrc/flavor2/google-services.json.

그런 다음 빌드 gradle에서 특징에 따라 파일을 app/디렉토리 에 복사합니다 .

android {

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

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

// other stuff
}

제한 사항 : 다른 맛을 내고 싶을 때마다 (하드 코딩되기 때문에) gradle에서 myFlavor 수동으로 변경 해야 합니다.

나는 현재 빌드 맛을 afterEvaluate가깝게 얻는 여러 가지 방법을 시도했지만 지금까지 더 나은 솔루션을 얻을 수 없었습니다.

업데이트, 다른 솔루션 : 모든 맛을위한 하나의 google-services.json :

또한 각 플레이버마다 패키지 이름이 다르면 Google 개발자 콘솔 에서 각 플레이버마다 두 개의 서로 다른 앱을 만들 필요는 없지만 동일한 앱에서 두 개의 서로 다른 클라이언트를 만들 필요는 없습니다. 그런 다음 google-services.json두 클라이언트를 모두 포함하는 하나만 갖게됩니다 . 물론, 이것은 당신이 당신의 맛의 백엔드를 어떻게 구현하고 있는지에 달려 있습니다. 분리되지 않은 경우이 솔루션이 도움이되지 않습니다.


당신은 백엔드가 분리되면 이것이 효과가 없을 것이라는 것을 의미합니다.
ZakTaccardi

모두 당신이 양측의 향을 어떻게 정의했는지에 달려 있습니다. 클라이언트와 서버. 필자의 경우 다른 패키지 이름, 다른 서버 URL 및 다른 데이터베이스. 따라서 서버는 해당 데이터베이스의 사용자에게 알림을 보냅니다. 사용자 A는 flavor1에 대한 토큰 1과 flavor2에 대한 토큰 2를 가지고 있습니다. 다른 데이터베이스 항목이 있으면 아무런 문제가 없습니다.
ahmed_khan_89

나는 특정 디버그 프로세스 또는 릴리스 프로세스를 호출하고는이 WS 이전에 게시 .Wish을했다 생각하는 다음 복사 작업을 생성하고 시도
humblerookie을

1
하나를 사용하여 google-services.json모두를 release하고 debug당신의 업데이트에 언급 한 바와 같이, 나를 위해 일했다. 나 debug처럼 빌드 를 분할하려고하는 경우 이것이 가장 간단한 해결책이라고 생각합니다 . 참고로 여기에서 파일을 생성 할 수 있습니다. developers.google.com/mobile/add?platform=android
yuval

12

ahmed_khan_89 의 답변 에 따르면 제품 맛 안에 "복사 코드"를 넣을 수 있습니다.

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

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

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

그런 다음 설정을 수동으로 전환 할 필요가 없습니다.


2
@ZakTaccardi 그러나 질문은하지 빌드 유형, 맛입니다
bryant1410

1
이 같은 솔루션의 좋은으로하지 않습니다 medium.com/@ZakTaccardi/...
ZakTaccardi

2
작동하지 않습니다. 빌드 풍미에 관계없이 두 가지 복사 명령을 모두 실행하므로 프로덕션 json은 항상 app 디렉토리에 있습니다.
Isaac

그것은 맛을 위해 작동합니다. build.gradle에서 변수를 수동으로 전환 할 필요가 없습니다.
Vito Valov

9

https://developers.google.com/mobile/add?platform=android&cntapi=gcm&cnturl=https:%2F%2Fdevelopers.google.com%2Fcloud-messaging 에서 생성 된 google-services.json 파일을 사용하고 있습니다. % 2Fandroid % 2Fclient & cntlbl = 계속 % 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"
}

내 프로젝트에서 동일한 project-id를 사용하고 위 URL에 두 번째 package-name을 추가하면 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 파일은 Android Studio 프로젝트에 어떤 영향을 줍니까?

이것을 따르십시오 : https://stackoverflow.com/a/33083898/2382964

두 번째 URL을 짧게 말하면 프로젝트에 google-services.json을 추가하면 이 경로 google-servicesdebug변형에 대한 자동 생성 폴더 가 있어야합니다

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 파일을 넣을 위치.

case 1.) build_flavor가 없으면 /app/google-service.json폴더 안에 넣으십시오 .

case 2.) 여러 build_flavor가 있고 내부에 다른 다른 google_services.json 파일이있는 경우 app/src/build_flavor/google-service.json.

case 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)이 정확히 무엇을 의미하는지 잘 모르겠습니다. analytics.google.com에서 Play 스토어 연결 외에 패키지 이름을 추가 할 수있는 곳을 찾을 수 없습니다. json을 다운로드하는 유일한 곳은 developers.google.com/mobile/add에서 제공 되며 여러 패키지 이름을 추가 할 수 없습니다. android_client_info에 패키지 이름을 수동으로 추가해도됩니까?
arberg

1
@arberg 동일한 프로젝트에 여러 패키지 이름을 추가 한 다음 파일을 다운로드 할 수 있습니다. 여기 확인 : github.com/googlesamples/google-services/issues/54
크리스 Nordvik에게

4

우리는 디버그 빌드 (* .debug)에 대해 다른 패키지 이름을 가지고 있으므로의 패턴에 플레이버와 관련된 것을 쓰지 않고 플레이버와 buildType을 기반으로 작동하는 것을 원했습니다 processDebugFlavorGoogleServices.

json 파일의 디버그 버전과 릴리스 버전을 모두 포함하는 각 플레이버에 "google-services"라는 폴더를 만들었습니다.

여기에 이미지 설명을 입력하십시오

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의 루트에서 현재 플레이버 및 현재 빌드 유형을 얻기 위해 호출 된 두 가지 메소드를 추가하십시오.

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는 이제 하나의 google-services.json 파일로 여러 애플리케이션 ID를 지원합니다.

이 블로그 게시물 에 자세히 설명되어 있습니다.

Firebase에서 모든 변형에 사용할 하나의 상위 프로젝트를 생성합니다. 그런 다음 보유한 각 애플리케이션 ID에 대해 해당 프로젝트 아래의 Firebase에서 별도의 Android 애플리케이션을 만듭니다.

모든 변형을 만들면 모든 애플리케이션 ID를 지원하는 google-services.json을 다운로드 할 수 있습니다. 데이터를 개별적으로 보는 것과 관련이있는 경우 (예 : 충돌보고) 드롭 다운으로 데이터를 전환 할 수 있습니다.


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 Rahman Mohsin

3

@ZakTaccardi의 답변을 바탕으로 두 가지 맛에 대해 단일 프로젝트를 원하지 않는다고 가정하면 build.gradle파일 끝에 다음을 추가 하십시오.

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

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

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

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

당신은 파일이 필요 src/staging/google-services.json하고 src/production/google-services.json. 사용하는 맛 이름을 바꾸십시오.


3

Google 서비스 플러그인은 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>

Android 용 Cloud Messaging 가이드 에서 직접 샘플 코드를 직접 복사 한 경우에만 필요한 것 같습니다 . 예제 라인은 다음과 같습니다.

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 서비스 플러그인을 불필요하게 적용하고있을 수 있습니다. 이 방법을 사용하면 google-services 플러그인을 적용 할 수 없습니다. GCM 이외의 서비스에이 플러그인이 필요한 경우 허용 된 답변을 참조하십시오.
kjones


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가 말한 것을 단순화합니다. 제품 맛에 따라 특정 프로젝트에 대해 패키지 이름이 다른 Multiples 앱을 만들어야합니다.

프로젝트가 다른 제품 맛 X, Y를 가진 ABC라고 가정합니다. 여기서 X는 패키지 이름 com.x를 갖고 Y는 패키지 이름 com.y를 가지고 Firebase 콘솔에서 2 개의 앱을 만들어야하는 프로젝트 ABC를 생성해야합니다 패키지 이름이 com.x 및 com.y 인 그런 다음 pacakges를 포함하는 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

실제로 MyApp/app/디렉토리에있는 하나의 google-services.json 만 있으면 좋으며 추가 스크립트는 필요하지 않습니다 com.google.gms:google-services:3.0.0. 그러나 오류 유형을 피하기 위해 google-services.json앱 디렉토리에서 파일 을 조심스럽게 삭제하십시오.MyApp/app/src/flavor1/res/Execution failed for task ':app:processDebugGoogleServices'. > No matching client found for package


2

따라서 google-services.json모든 변형 파일을 루트 폴더로 프로그래밍 방식으로 복사하려는 경우 . 특정 변형으로 전환하면 여기에 대한 해결책이 있습니다.

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

이 방법에는 경고가 있습니다 google-service.json. 여기에는 각 변형 폴더에 파일 이 있어야 합니다. 여기에 예가 있습니다.변형 이미지


1

당신은 많은 맛을 가지고 있기 때문에, 당신은 많은 차이점을 가지고 있음을 의미합니다. 따라서 json 파일을 설정 / 생성하는 페이지로 이동하여 각 패키지 이름에 대해 구성하십시오. 모든 것이 json 파일에 추가됩니다.

나는 지금 그림을 게시하기 위해 게으르다. 그러나 기본적으로 :

  • https://developers.google.com/mobile/add 로 이동
  • 플랫폼 선택
  • 앱을 선택하십시오
  • 중요 : 플레이버 패키지 이름을 "android package name"필드에 입력하십시오
  • ... 구성 파일을 계속 가져옵니다. 다운로드 해!

파일을 구성하면 Google에 서버 API 키 + 발신자 ID가 표시됩니다. 그리고 그것은 모든 패키지 (맛)에 대해 동일합니다

결국, 모든 맛에 대해 하나의 json 파일 만 있으면됩니다.

등록 토큰을 얻기 위해 등록 할 때 테스트해야 할 질문이 하나 더 있습니다. 각 맛의 차이가 있는지 확인하십시오. 나는 그것을 만지지 않지만 그것이 차이가 있어야한다고 생각합니다. 너무 늦었고 너무 졸려 :) 그것이 도움이되기를 바랍니다!


1

이봐 친구도 이름 사용 소문자 만 찾습니다 다음이 오류가 발생하지 않습니다


0

현재 동일한 앱 패키지에서 두 개의 GCM 프로젝트 ID를 사용하고 있습니다. 첫 번째 GCM 프로젝트의 google-service.json을 넣었지만 SENDER_ID 만 변경하여 첫 번째 GCM 프로젝트에서 두 번째 프로젝트로 전환합니다.

    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 아래에 배치 한 다음 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'
                    }
                }
            }
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.