文字列参照としてmeta-data
タグのvalue
を使用してプロジェクトをビルドしようとすると、crashlyticsは次のエラーで失敗します。
Crashlytics found an invalid API key: @string/crashlytics.
Check the Crashlytics plugin to make sure that the application has been added successfully!
Contact [email protected] for assistance.
機能しません
<meta-data
Android:name="com.crashlytics.ApiKey"
Android:value="@string/crashlytics"/>
作品
<meta-data
Android:name="com.crashlytics.ApiKey"
Android:value="1234567890..."/>
Androidプロジェクトの異なるproductFlavors
に対して、string.xml
内に異なるキーを定義したい。
Crashlyticsサポートに書き込んだ後:
現在、ビルド時にAndroidManifest.xmlのみを評価できるため、文字列リソースを調べないため、ハードコードされた文字列のみをサポートしています。今後のリリースでこれをサポートするために検討できるよう、興味のあるチームと間違いなく共有します。
編集:受け入れられたソリューションは、Crashlyticsの古いバージョンを使用している場合にのみ機能します(v1.1.11を使用していました)。ファブリックSDKを使用している場合は、プラグインのタスクが大幅に変更され、以下のスクリプトが機能しないことがわかります。また、APIシークレットは不要になったため、マニフェストで
<meta>
を使用して、フレーバーで定義されたマニフェストプレースホルダーとともにAPIキーを指定できます。
build.gradle内:
flavor1 { ... manifestPlaceholders = [crashlyticsApiKey: CRASHLYTICS_API_SECRET_HERE] ... }
AndroidManifest.xml内:
... <meta-data Android:name="com.crashlytics.ApiKey" Android:value="${crashlyticsApiKey}" /> ...
Crashlyticsキーを ここに記載 として指定する、文書化されていない別の方法があり、crashlytics.properties
(プロジェクトのルート)を使用して、APIシークレットとともにその値を指定します。
apiKey=YOUR_API_KEY
apiSecret=YOUR_API_SECRET
残念ながら、これはフレーバーごとに異なるcrashlytics.properties
を指定することを許可しません。これは、gradleプラグインによって正しく選択されるために、プロジェクトのルートにある必要があるためです。つまり、そのファイルを動的に生成する必要があります。アイデアは、カスタムプロパティとしてフレーバーにキー/シークレット値を追加し、ビルド時にcrashlytics.properties
を生成し、現在のフレーバーの値を使用してファイルに入力することです。
Androidモジュール内のbuild.gradle
は次のようになります:
...
productFlavors {
flavor1 {
...
set("crashlyticsApiKey", CRASHLYTICS_API_KEY_HERE)
set("crashlyticsApiSecret", CRASHLYTICS_API_SECRET_HERE)
...
}
...
}
File crashlyticsProperties = new File("${project.projectDir.absolutePath}/crashlytics.properties")
applicationVariants.all { variant ->
variant.productFlavors.each { flavor ->
def variantSuffix = variant.name.capitalize()
def generateResourcesTask = project.tasks.getByName("crashlyticsGenerateResources${variantSuffix}")
def generatePropertiesTask = task("crashlyticsGenerateProperties${variantSuffix}") << {
Properties properties = new Properties()
println "...copying apiSecret for ${variant.name}"
properties.put("apiSecret", flavor.crashlyticsApiSecret)
println "...copying apiKey for ${variant.name}"
properties.put("apiKey", flavor.crashlyticsApiKey)
properties.store(new FileWriter(crashlyticsProperties), "")
}
generateResourcesTask.dependsOn generatePropertiesTask
def cleanResourcesTask = project.tasks.getByName("crashlyticsCleanupResourcesAfterUpload${variantSuffix}")
cleanResourcesTask.doLast {
println "...removing crashlytics.properties"
crashlyticsProperties.delete()
}
}
}
...
基本的に、スクリプトはビルドプロセスをフックし、Crashlytics Gradleプラグインが魔法をかける直前にプロパティファイルを生成/入力します。
FabricのCrashlytics 2.6.6を使用。メニューからビルドバリアント(通常はAndroid Studio)にあります)を選択してアプリを実行するだけです。Fabricダッシュボードに反映されるまでに1分ほどかかります、しかし私は回避策を必要としませんでした。