web-dev-qa-db-ja.com

Crashlyticsが無効なAPIキーを検出しました

文字列参照として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のみを評価できるため、文字列リソースを調べないため、ハードコードされた文字列のみをサポートしています。今後のリリースでこれをサポートするために検討できるよう、興味のあるチームと間違いなく共有します。

30
Dmytro Danylyk

編集:受け入れられたソリューションは、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プラグインが魔法をかける直前にプロパティファイルを生成/入力します。

52
a.bertucci

FabricのCrashlytics 2.6.6を使用。メニューからビルドバリアント(通常はAndroid Studio)にあります)を選択してアプリを実行するだけです。Fabricダッシュボードに反映されるまでに1分ほどかかります、しかし私は回避策を必要としませんでした。

0
marienke