다른 productFlavors에 대한 google-services.json 테스트했습니다. 그러나 내

업데이트 : GCM 은 더 이상 사용되지 않으며 FCM을 사용하십시오.

Google 개발자 페이지의 안내에 따라 새 Google 클라우드 메시징을 구현하고 있습니다.

성공적으로 실행하고 테스트했습니다. 그러나 내 문제는 이제 applicationId / packageName 및 Google Cloud Messaging Project ID가 다른 제품 맛이 다른 것입니다. 는 google-services.json상기 넣어 할 필요가 /app/google-services.json없는 맛 폴더.

google-services.json많은 맛에 대해 구성을 다르게 만드는 방법이 있습니까?



답변

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


답변

업데이트 : 다음 설명은 하나의 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 콘솔을 사용하면 구성에 필요한 모든 것을 하나의 단일 파일로 제공하기 때문에 더 쉽습니다.


답변

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

비슷한 문제 (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작업을 사용 하여 맛 수준별로 수정하십시오.


답변

글쎄, 같은 문제가 발생하여 완벽한 해결책을 얻지 못했습니다. 해결 방법 일뿐입니다. 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두 클라이언트를 모두 포함하는 하나만 갖게됩니다 . 물론, 이것은 당신이 당신의 맛의 백엔드를 어떻게 구현하고 있는지에 달려 있습니다. 분리되지 않은 경우이 솔루션이 도움이되지 않습니다.


답변

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

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


답변

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 데이터가 유감입니다. 형식이 올바르게 지정되지 않았습니다 …


답변

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