google-services.json cho các sản phẩm khác nhau


453

Cập nhật: GCM không được dùng nữa, hãy sử dụng FCM

Tôi đang triển khai Google Cloud Messaging theo hướng dẫn từ trang Nhà phát triển của Google tại đây

Tôi đã chạy thành công và kiểm tra nó. Nhưng vấn đề của tôi bây giờ là tôi có các hương vị sản phẩm khác nhau với applicationId / packName khác nhau và Id dự án Google Cloud Messaging khác nhau. Các google-services.jsoncần phải được đặt ở /app/google-services.jsonkhông phải là thư mục hương vị.

Có cách nào để làm cho google-services.jsoncấu hình khác nhau cho nhiều hương vị?


Đối với Maven, chúng tôi đã triển khai một cái gì đó tương tự bằng cách sử dụng hồ sơ maven và các tệp thuộc tính riêng biệt cho mỗi hồ sơ
sakis kaliakoudas

1
nếu bạn chỉ muốn bạn sử dụng sender_id thì hãy tạo khóa mà không cần bất kỳ tên gói nào từ bảng điều khiển google.
Murtaza Khursheed Hussain

Dòng apply plugin: 'com.google.gms.google-services'trong tệp gradle dường như đặt các gcmchuỗi vào app/build/generated/res/google-services/debug/values/values.xml...
Alexander Farber

Câu trả lời tốt nhất tôi tìm thấy cho câu hỏi
Estel

Hãy chắc chắn đọc điều này: firebase.googleblog.com/2016/08/. Nó bao gồm mọi khả năng và sự đánh đổi.
Albert Vila Calvo

Câu trả lời:


509

Google bao gồm hỗ trợ cho các hương vị trong phiên bản 2.0 của plugin dịch vụ chơi. Kể từ phiên bản này củagradle plugin com.google.gms:google-services:2.0.0-alpha3

bạn có thể làm được việc này

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

Phiên bản 3.0.0 của plugin tìm kiếm tệp json ở những vị trí này (xem xét bạn có flavorhương vị1 và loại bản dựng debug):

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

Điều này làm việc cho tôi thậm chí sử dụng Hương vị. Tôi có miễn phí và trả tiền ở một chiều và Mock & Prod ở chiều khác. Tôi cũng có 3 buildTypes: gỡ lỗi, phát hành và dàn dựng. Đây là cách nó xuất hiện trong dự án của tôi cho hương vị FreeProd:

nhập mô tả hình ảnh ở đây

Có bao nhiêu tệp google-services.json sẽ phụ thuộc vào đặc điểm của dự án của bạn, nhưng bạn sẽ cần ít nhất một tệp json cho mỗi dự án Google.

Nếu bạn muốn biết thêm chi tiết về những gì plugin này làm với các tệp json này, thì đây là: https://github.com/googlesamples/google-service/issues/54#issuecomment-165824720

Liên kết đến các tài liệu chính thức: https://developers.google.com/android/guides/google-service-plugin

Bài đăng trên blog với thông tin được cập nhật: https://firebase.googleblog.com/2016/08/organizing-your-firebase-enables-android-app-builds.html

Và vào đây để kiểm tra phiên bản mới nhất của plugin này: https://bintray.com/android/android-tools/com.google.gms.google-service/view


13
Điều này không hiệu quả với tôi vì một số lý do - tôi gặp lỗi xây dựng lớp - File google-services.json is missing from module root folder. The Google Services Plugin cannot function without it.vì vậy tôi sẽ dùng đến cách sao chép tệp hương vị vào thư mục gốc mỗi lần thông qua tập lệnh xây dựng.
dodgy_coder 3/03/2016

2
Làm việc như một lá bùa, cảm ơn chúa vì điều này. google-services.json và cách sử dụng apis hoàn toàn mới này có vẻ như là một bước lùi. Không biết làm thế nào được cho là dễ dàng hơn.
ĐỎ_

140
googl-services.json là một sự ghê tởm ... làm thế nào để quản lý một số tệp json điên dễ dàng hơn là chỉ cắm vào một khóa API và ID người gửi? Vui lòng google dừng những điều vô nghĩa
Greg Enni

19
Phiên bản mới nhất của trình tạo tệp cấu hình đặt nhiều thuộc tính trong cùng một tệp cấu hình, chỉ cần một thuộc tính ở cấp ứng dụng một lần nữa, thay vì các thuộc tính riêng biệt ở cấp độ hương vị. Bạn chỉ cần đảm bảo cả hai cấu hình được tạo trong cùng một trường "Tên ứng dụng".
sroskelley

5
Kể từ Android Studio 3.1.4, sử dụng /app/src/flavor1/google-service.json không còn hoạt động. Các tệp phải được đặt trong /app/src/flavor1/debug/google-service.json và /app/src/flavor1/release/google-service.json.
nuôi dưỡng

71

CẬP NHẬT: Giải thích sau đây dành cho một dự án Android Studio, với một Dự án Firebase và các Ứng dụng Firebase khác nhau trong dự án đó. Nếu mục đích là có các tệp JSON khác nhau cho các Ứng dụng Firebase khác nhau trong các Dự án Firebase khác nhau trong cùng một dự án Android Studio, (hoặc nếu bạn không biết sự khác biệt) hãy xem tại đây. .

Bạn cần một Ứng dụng Firebase cho mỗi ID ứng dụng Android (thường là tên gói). Thông thường có một ID ứng dụng cho mỗi biến thể xây dựng Gradle (Điều này sẽ có khả năng nếu bạn sử dụng các loại xây dựng Gradle và hương vị xây dựng Gradle)


Kể từ Google Services 3.0 và sử dụng Firebase , không cần thiết phải tạo các tệp khác nhau cho các hương vị khác nhau. Tạo các tệp khác nhau cho các hương vị khác nhau có thể không rõ ràng hoặc đơn giản trong trường hợp bạn có các loại sản phẩmFlavours và Build kết hợp với nhau.

Trong cùng một tệp, bạn sẽ có tất cả các cấu hình bạn cần cho tất cả các loại và hương vị bản dựng của bạn.

Trong bảng điều khiển Firebase, bạn cần thêm một ứng dụng cho mỗi tên gói. Hãy tưởng tượng rằng bạn có 2 hương vị (dev và live) và 2 loại xây dựng (gỡ lỗi và phát hành). Tùy thuộc vào cấu hình của bạn nhưng có thể bạn có 4 tên gói khác nhau như:

  • com.stackoverflow.example (phát hành trực tiếp)
  • com.stackoverflow.example.dev (trực tiếp - nhà phát triển)
  • com.stackoverflow.example.debug (gỡ lỗi - phát hành)
  • com.stackoverflow.example.dev.debug (gỡ lỗi - dev)

Bạn cần 4 ứng dụng Android khác nhau trong Bảng điều khiển Firebase. (Trên mỗi máy bạn cần thêm SHA-1 để gỡ lỗi và trực tiếp cho từng máy tính bạn đang sử dụng)

Khi bạn tải xuống tệp google-services.json, thực sự nó không thực sự quan trọng từ ứng dụng bạn tải xuống, tất cả chúng đều chứa cùng một thông tin liên quan đến tất cả các ứng dụng của bạn.

Bây giờ bạn cần xác định vị trí tệp này ở cấp ứng dụng (ứng dụng /).

nhập mô tả hình ảnh ở đây

Nếu bạn mở tệp đó, bạn sẽ thấy rằng nếu chứa tất cả thông tin cho tất cả các tên gói của bạn.

Một điểm đau được sử dụng để làm plugin. Để làm cho nó hoạt động, bạn cần xác định vị trí plugin ở dưới cùng của tập tin của bạn. Vì vậy, dòng này ..

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

... cần phải ở dưới cùng của tệp build.gradle ứng dụng của bạn.

Đối với hầu hết những gì đã nói ở đây, nó cũng áp dụng cho các phiên bản trước. Tôi chưa bao giờ có các tệp khác nhau cho các cấu hình khác nhau, nhưng bây giờ với bảng điều khiển Firebase dễ dàng hơn vì chúng cung cấp một tệp duy nhất với mọi thứ bạn cần cho tất cả các cấu hình của bạn.


Tôi tạo của tôi từ developers.google.com/mobile/add và chỉ có một cơ hội để đặt một tên gói. Vị trí của Firebase ở đâu để thiết lập điều này hoặc tệp google-services.json trông như thế nào với nhiều hương vị
CQM

@CQM Tôi đã cập nhật câu trả lời thêm một số liên kết. Bạn có thể kiểm tra tài liệu Firebase và bạn có thể tạo tệp JSON trong bảng điều khiển Firebase như được mô tả trong câu trả lời.
Sotti

7
Đây là một câu trả lời thực sự tốt và nó nên là câu trả lời đúng duy nhất cho câu hỏi này.
Nando

1
Tôi đã phát hiện ra điều này khi tôi gặp phải vấn đề tương tự, giống như bạn mô tả ở trên. Tôi đến đây để gửi câu trả lời cho hậu thế chỉ để thấy bạn đã thực hiện nó. Với phiên bản 3.0.0, đây chắc chắn là câu trả lời tốt nhất.
Tash Pemhiwa

6
Lưu ý rằng điều này chỉ hoạt động nếu tất cả các hương vị của bạn nằm trong cùng một dự án căn cứ hỏa lực. Nếu sử dụng nhiều dự án (tôi có xu hướng giữ dev và giai đoạn trong một dự án firebase và prod trong một prod projet riêng biệt trong một tài khoản google khác), bạn cần giải pháp được Yair Kukielka vạch ra. Trên thực tế, plugin có vẻ hỗ trợ nhiều đường dẫn - trong quá trình xây dựng, bạn sẽ nhận được gợi ý về nơi plugin tìm kiếm tệp google-services.json: "Không thể tìm thấy google-services.json khi tìm kiếm trong [src / prod / debug, src / debug / prod, src / prod, src / debug, src / prodDebug] "
JHH

43

Đã viết một bài trung bình về vấn đề này.

Có một vấn đề tương tự (sử dụng BuildTypes thay vì Flavours) và đã khắc phục nó như vậy.

Tận dụng hệ thống quản lý phụ thuộc của Gradle. Tôi đã tạo ra hai nhiệm vụ,switchToDebugswitchToRelease. Yêu cầu bất cứ lúc nào assembleReleaselà chạy, đó switchToReleasecũng là chạy. Tương tự cho gỡ lỗi.

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: sử dụngprocessDebugFlavorGoogleServices / processReleaseFlavorGoogleServicestác vụ để sửa đổi nó ở mức độ hương vị.


Nhưng điều này hoạt động cho buildTypes, không phải cho hương vị như được đăng bởi OP
bryant1410

1
@ bryant1410 nếu bạn đang sử dụng hương vị - Tôi đoán rằng bạn có thể nối vào tác vụ processDebugFlavorGoogleService thay thế.
ZakTaccardi

Tôi nghĩ bạn nên thay đổi nó trong câu trả lời của bạn, vì câu hỏi là về hương vị, không phải buildTypes. Tôi nghĩ bạn cũng có thể để câu trả lời này là lựa chọn thứ hai
bryant1410

1
@ bryant1410 logic về cơ bản là giống nhau cho cả hương vị hoặc buildType. bạn sẽ có thể tìm ra nó
ZakTaccardi

1
@IgorGanapolsky có, hai phiên bản
ZakTaccardi

13

Vâng, tôi đang gặp vấn đề tương tự và không thể có được bất kỳ giải pháp hoàn hảo nào. Nó chỉ là một cách giải quyết. Tôi tự hỏi làm thế nào Google không nghĩ về hương vị ...? Và tôi hy vọng họ sẽ sớm đề xuất một giải pháp tốt hơn.

Những gì tôi đang làm:

Tôi có hai hương vị, trong mỗi loại tôi đặt google-services.json tương ứng: src/flavor1/google-services.jsonsrc/flavor2/google-services.json.

Sau đó, trong bản dựng lớp, tôi sao chép tệp tùy theo hương vị vào app/thư mục:

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
}

Giới hạn: bạn sẽ phải thay đổi myFlavor bằng tay theo cấp độ mỗi lần bạn muốn chạy cho một hương vị khác nhau (vì nó bị mã hóa cứng).

Tôi đã thử nhiều cách để có được hương vị xây dựng hiện tại như afterEvaluategần gũi ... không thể có bất kỳ giải pháp nào tốt hơn cho đến bây giờ.

Cập nhật, Một giải pháp khác: một google-services.json cho tất cả các hương vị:

Bạn cũng có thể, có các tên gói khác nhau cho mỗi hương vị và sau đó trong bảng điều khiển dành cho nhà phát triển google, bạn không phải tạo hai ứng dụng khác nhau cho mỗi hương vị, nhưng chỉ có hai ứng dụng khách khác nhau trong cùng một ứng dụng. Sau đó, bạn sẽ chỉ có một google-services.jsoncái chứa cả hai khách hàng của bạn. Tất nhiên, điều này phụ thuộc vào cách bạn thực hiện phần phụ trợ của hương vị của bạn. Nếu chúng không được tách ra thì giải pháp này sẽ không giúp bạn.


bạn có nghĩa là nếu các phần phụ trợ được tách ra, thì điều này sẽ không hiệu quả với bạn, tôi tin rằng
ZakTaccardi

tất cả phụ thuộc vào cách định nghĩa của bạn về các hương vị ở cả hai bên; máy khách và máy chủ. Trong trường hợp của tôi, các tên gói khác nhau, các url máy chủ khác nhau và cơ sở dữ liệu khác nhau. Vì vậy, máy chủ sẽ gửi thông báo cho người dùng trong cơ sở dữ liệu tương ứng. Người dùng A có mã thông báo 1 cho hương vị1 và mã thông báo2 cho hương vị2. Nếu bạn có các mục cơ sở dữ liệu khác nhau thì bạn sẽ không gặp vấn đề gì.
ahmed_khan_89

Tôi đã thử tạo các tác vụ sao chép và sau đó gọi chúng trong một quy trình gỡ lỗi hoặc quy trình phát hành cụ thể và để nghĩ rằng nó đã hoạt động. Chúc các ws này được đăng trước đó
humblerookie

1
Sử dụng một google-services.jsoncho cả hai releasedebuglàm việc cho tôi, như được đề cập trong bản cập nhật của bạn. Tôi nghĩ rằng đây là giải pháp đơn giản nhất nếu bạn chỉ cố gắng phân chia bản debugdựng của mình , giống như tôi. Để tham khảo, bạn có thể tạo tệp tại đây: developers.google.com/mobile/add?pl
platform = android

12

Theo câu trả lời của ahmed_khan_89 , bạn có thể đặt "bản sao mã" bên trong hương vị sản phẩm.

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

Sau đó, bạn không phải chuyển đổi cài đặt bằng tay.


2
@ZakTaccardi nhưng câu hỏi là về hương vị, không phải cho loại xây dựng
bryant1410

1
đây không phải là một giải pháp tốt như Medium.com/@ZakTaccardi/ từ
ZakTaccardi

2
Không hoạt động. Điều này chạy cả hai lệnh sao chép bất kể hương vị xây dựng, vì vậy json sản xuất luôn nằm trong thư mục ứng dụng.
Isaac

Nó không hoạt động cho hương vị. Không cần phải tự chuyển đổi các biến trong build.gradle.
Vito Valov

9

Tôi đang sử dụng tệp google-services.json, được tạo từ đây: https://developers.google.com/mobile/add?pl platform = android & cntapi = gcm & cnturl = https :% 2 %% % 2Fandroid% 2Fclient & cntlbl = Tiếp tục% 20Adding% 20GCM% 20 Hỗ trợ &% 3Fconfigured% 3Dtrue

Trong cấu trúc JSON có một mảng JSON được gọi là các máy khách. Nếu bạn có nhiều hương vị, chỉ cần thêm các thuộc tính khác nhau ở đây.

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

Trong dự án của tôi, tôi đang sử dụng cùng một id dự án và khi tôi thêm tên gói thứ hai vào url trên, google cung cấp cho tôi một tệp chứa nhiều ứng dụng khách trong dữ liệu json.

Xin lỗi vì dữ liệu JSON nhỏ gọn. Tôi không thể định dạng chính xác ...


8

Tệp google-services.json không cần thiết để nhận thông báo. Chỉ cần thêm một biến cho mỗi hương vị trong tệp build.gradle của bạn:

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

Sử dụng biến BuildConfig.GCM_SENDER_ID này thay vì getString (R.opes.gcm_defaultSenderId) trong khi đăng ký:

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

6

1.) Google-services.json thực sự làm gì?

Thực hiện theo: https://stackoverflow.com/a/31598587/2382964

2.) Tệp google-services.json ảnh hưởng đến dự án studio android của bạn như thế nào?

Thực hiện theo: https://stackoverflow.com/a/33083898/2382964

chỉ viết tắt cho url thứ hai, nếu bạn thêm google-services.json trong dự án của bạn thì phải có google-servicesthư mục được tạo tự động cho debugbiến thể trong đường dẫn này

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

3.) Phải làm gì, để làm cho nó được thực hiện?

thêm phụ thuộc google-services trong project_levelbuild.gradle, bạn cũng có thể sử dụng version 3.0.0nếu bạn đang sử dụng thư viện app_compact.

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

bây giờ trong app_levelbuild.gradle bạn phải thêm ở phía dưới.

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

4.) Nơi đặt tệp google-service.json trong cấu trúc của bạn.

trường hợp 1.) nếu bạn không có build_flavor, chỉ cần đặt nó vào /app/google-service.jsonthư mục bên trong .

trường hợp 2.) nếu bạn có nhiều build_flavor và bạn có các tệp google_service.json khác nhau được đặt bên trong app/src/build_flavor/google-service.json.

trường hợp 3.) nếu bạn có nhiều build_flavor và bạn có một tệp google_service.json được đặt bên trong app/google-service.json.


4

Không cần bất kỳ kịch bản lớp bổ sung.

Google bắt đầu thêm tên gói khác nhau trong tên của 'android_client_info'. Dường như bên dưới trong google-services.json

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

vì vậy, các bước sau là đủ để có lựa chọn google-services.json khác nhau.

  1. Có 2 hương vị
  2. Thêm gói dev flavour mới vào trang cấu hình phân tích của google và tải xuống google-services.json.
  3. Lưu ý trong tệp cấu hình mới, cả hai id gói flavour của bạn đều ở đó
  4. Chuẩn bị bất kỳ xây dựng hương vị của bạn.

Thế là xong! ..


1
Tôi không chắc những gì 2) và 3) đề cập chính xác. Tôi không thể tìm thấy bất cứ nơi nào trong analytics.google.com nơi tôi có thể thêm packagenames, ngoài việc liên kết cửa hàng chơi. Nơi duy nhất tôi tìm thấy để tải xuống json là từ đây developers.google.com/mobile/add và điều đó không cho phép thêm nhiều packagenames. Nó sẽ hoạt động chỉ bằng cách thêm thủ công packagenames vào android_client_info?
arberg

1
@arberg Bạn có thể thêm nhiều tên gói cho cùng một dự án và sau đó tải xuống tệp. Kiểm tra tại đây: github.com/googlesamples/google-service/issues/54
Christer Nordvik

4

Chúng tôi có một tên gói khác cho các bản dựng gỡ lỗi (* .debug) vì vậy tôi muốn một cái gì đó hoạt động dựa trên hương vị và buildType, mà không phải viết bất cứ thứ gì liên quan đến hương vị theo mẫu của processDebugFlavorGoogleServices .

Tôi đã tạo một thư mục có tên "google-services" theo từng hương vị, chứa cả phiên bản gỡ lỗi và phiên bản phát hành của tệp json:

nhập mô tả hình ảnh ở đây

Trong phần buildTypes của tệp lớp của bạn, hãy thêm phần này:

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

Nó sẽ tự động sao chép tệp json bên phải vào thư mục gốc của mô-đun ứng dụng của bạn khi bạn chuyển đổi biến thể xây dựng.

Thêm hai phương thức được gọi để có được hương vị hiện tại và loại bản dựng hiện tại ở thư mục gốc của bản dựng.

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

Đó là nó, bạn không phải lo lắng về việc loại bỏ / thêm / sửa đổi các hương vị từ tệp lớp của bạn và nó sẽ tự động gỡ lỗi hoặc phát hành google-services.json.


4

Firebase hiện hỗ trợ nhiều id ứng dụng với một tệp google-services.json.

Bài đăng blog này mô tả nó một cách chi tiết.

Bạn sẽ tạo một dự án mẹ trong Firebase mà bạn sẽ sử dụng cho tất cả các biến thể của mình. Sau đó, bạn tạo các ứng dụng Android riêng biệt trong Firebase trong dự án đó cho từng id ứng dụng mà bạn có.

Khi bạn tạo tất cả các biến thể của mình, bạn có thể tải xuống google-services.json hỗ trợ tất cả các id ứng dụng của bạn. Khi có liên quan để xem dữ liệu một cách riêng biệt (ví dụ: Báo cáo sự cố), bạn có thể chuyển đổi dữ liệu đó với danh sách thả xuống.


4

Theo tài liệu Firebase, bạn cũng có thể sử dụng tài nguyên chuỗi thay vì google-services.json .

Vì nhà cung cấp này chỉ đọc tài nguyên với các tên đã biết, nên một tùy chọn khác là thêm tài nguyên chuỗi trực tiếp vào ứng dụng của bạn thay vì sử dụng plugin cấp độ Google Services. Bạn có thể làm điều này bằng cách:

  • Di chuyển cái google-services plugin khỏi root build.gradle của bạn
  • Xóa google-services.json khỏi dự án của bạn
  • Thêm tài nguyên chuỗi trực tiếp
  • Xóa plugin áp dụng: 'com.google.gms.google-services'từ ứng dụng build.gradle của bạn

Ví dụ 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
Tôi gặp khó khăn khi khớp giá trị của khóa nào trong tệp google-services.json khớp với chuỗi tương đương nhưng sau đó tôi thấy điều này có ích: developers.google.com/android/guides/ nam Đăng trong trường hợp người khác gặp vấn đề tương tự.
Saifur Rahman Mohsin

3

Dựa trên câu trả lời của @ ZakTaccardi và giả sử bạn không muốn một dự án duy nhất cho cả hai hương vị, hãy thêm phần này vào cuối build.gradletệp của bạn :

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
}

Bạn cần phải có các tập tin src/staging/google-services.jsonsrc/production/google-services.json. Thay thế tên hương vị cho những người bạn sử dụng.


3

Tôi đã thấy rằng plugin dịch vụ google khá vô dụng đối với các dự án muốn thêm GCM. Nó chỉ tạo tệp sau mà chỉ cần thêm ID dự án của bạn dưới dạng tài nguyên chuỗi:

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

Dường như bạn chỉ cần nó nếu bạn đã sao chép nguyên văn mã mẫu trực tiếp từ hướng dẫn Cloud Messaging cho Android . Dưới đây là dòng ví dụ:

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

Giải pháp

Nếu bạn muốn có thể chuyển đổi các dự án API cho các loại sản phẩm hoặc hương vị sản phẩm khác nhau, bạn chỉ cần xác định các hằng số của riêng mình và chọn một dự án phù hợp khi gọi 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);

Đối với hương vị sản phẩm

Đoạn mã trên hoạt động để chuyển đổi giữa các bản dựng gỡ lỗi và phát hành. Đối với các hương vị sản phẩm, bạn sẽ xác định các khóa API khác nhau trong tệp nguồn java và đặt các tệp vào thư mục hương vị sản phẩm tương ứng của chúng. Để tham khảo: Biến thể Gradle Build


@swimmingtomars Bạn có thể đang áp dụng plugin google-service một cách không cần thiết. Nếu bạn sử dụng phương pháp này, bạn không thể áp dụng plugin dịch vụ google. Xem câu trả lời được chấp nhận nếu bạn yêu cầu plugin này cho dịch vụ khác ngoài GCM.
kjones

3

CẬP NHẬT:

Về mặt thiết lập Firebase với các biến thể xây dựng, vui lòng tham khảo blog này có hướng dẫn chi tiết.


2

Quan điểm của plugin dịch vụ google là đơn giản hóa việc tích hợp các tính năng của Google.

Vì nó chỉ tạo tài nguyên Android từ tệp google-services.json, nên logic logic lớp quá phức tạp phủ nhận điểm này, tôi nghĩ vậy.

Vì vậy, nếu các tài liệu Google không nói tài nguyên nào là cần thiết cho các tính năng cụ thể của Google, tôi sẽ đề xuất tạo tệp JSON cho mỗi bản dựng / hương vị có liên quan, xem các tài nguyên nào được tạo bởi plugin và sau đó đặt các tài nguyên đó theo cách thủ công vào các thư mục src / buildtypeORflavor / res tương ứng của chúng.

Xóa các tham chiếu đến plugin dịch vụ google và tệp JSON sau đó, và bạn đã hoàn thành.

Để biết thông tin chi tiết về hoạt động bên trong của plugin gradle-dịch vụ google, hãy xem câu trả lời khác của tôi:

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


Tôi không hiểu cách sử dụng câu trả lời của bạn, tôi có thể bao gồm 2 google-service.json. 1 cho gỡ lỗi và một cho phát hành
PenduDev

2

Đơn giản hóa những gì @Scotti nói. Bạn cần tạo nhiều ứng dụng với tên gói khác nhau cho một Dự án cụ thể tùy thuộc vào hương vị sản phẩm.

Giả sử Dự án của bạn là ABC có các hương vị sản phẩm khác nhau X, Y trong đó X có tên gói com.x và Y có tên gói com.y thì trong bảng điều khiển firebase bạn cần tạo dự án ABC trong đó bạn cần tạo 2 ứng dụng với tên gói com.x và com.y. Sau đó, bạn cần tải xuống tệp google-services.json, trong đó sẽ có 2 đối tượng thông tin khách hàng sẽ chứa các nhịp đó và bạn sẽ thấy ổn.

Đoạn trích của json sẽ là một cái gì đó như thế này

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

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

    }

2

Thật vậy, chỉ cần một google-services.json trong MyApp/app/thư mục là tốt, không cần tập lệnh quảng cáo với com.google.gms:google-services:3.0.0. Nhưng hãy cẩn thận để xóa các tập tin google-services.jsontừ thư mục ứng dụng MyApp/app/src/flavor1/res/để tránh các loại lỗiExecution failed for task ':app:processDebugGoogleServices'. > No matching client found for package


2

Vì vậy, nếu bạn muốn sao chép google-services.jsontập tin từ tất cả các biến thể vào thư mục gốc của bạn. Khi bạn chuyển sang một biến thể cụ thể, đây là một giải pháp cho bạn

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

Có một lưu ý cho phương pháp này là bạn cần phải có google-service.jsontệp trong mỗi thư mục biến thể của mình, đây là một ví dụ.hình ảnh biến thể


1

Bạn có nhiều hương vị, vì vậy nó có nghĩa là bạn sẽ có nhiều gói id khác nhau, phải không? Vì vậy, chỉ cần truy cập trang nơi bạn thiết lập / tạo tệp json và cấu hình cho từng tên gói. Tất cả sẽ thêm vào tập tin json.

Tôi rất lười đăng ảnh bây giờ, nhưng về cơ bản:

  • đi đến https://developers.google.com/mobile/add
  • chọn nền tảng
  • chọn ứng dụng của bạn
  • QUAN TRỌNG : nhập tên gói hương vị của bạn vào trường "tên gói android"
  • ... Tiếp tục lấy tập tin cấu hình của bạn. Tải về nó!

Khi định cấu hình tệp, bạn có thể thấy google hiển thị cho bạn Khóa API máy chủ + ID người gửi. Và nó là giống nhau cho tất cả các gói (hương vị)

Cuối cùng, bạn chỉ cần một tệp json cho tất cả các hương vị.

Một câu hỏi nữa ở đây là bạn phải kiểm tra khi đăng ký để nhận Mã thông báo đăng ký, kiểm tra xem có khác biệt cho từng hương vị không. Tôi không chạm vào nó nhưng nó nghĩ nó nên được sự khác biệt. Quá muộn bây giờ và tôi rất buồn ngủ :) Hy vọng nó sẽ giúp!


1

Hey Friends cũng tìm tên chỉ sử dụng chữ thường nên bạn không gặp lỗi này


0

Tôi hiện đang sử dụng hai Id dự án GCM trong cùng một gói ứng dụng. Tôi đặt google-service.json của dự án GCM đầu tiên của mình nhưng tôi chuyển từ dự án thứ nhất sang dự án thứ hai chỉ thay đổi SENDER_ID:

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

(Tại thời điểm này, tôi nghĩ rằng google-services.json không bắt buộc)


0

Lấy cảm hứng từ @ ahmed_khan_89 trả lời ở trên. Chúng ta có thể trực tiếp giữ như thế này trong tập tin 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

Đặt tệp "google-services.json" của bạn dưới ứng dụng / src / flavours sau đó trong build.gradle của ứng dụng, dưới Android thêm mã bên dưới

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'
                    }
                }
            }
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.