web-dev-qa-db-ja.com

Firebase Performance Pluginによりビルド時間が遅くなる

Firebase PerformanceをAndroid Studioのgradleタスクapp:transformClassesWithFirebasePerformancePluginForDebugは他のどのタスクよりも大幅に時間がかかっているため、gradleのビルド時間を劇的に遅くしています。

プロファイラーに表示される遅いビルド

20
Ian White

プロジェクトのFirebaseは、ビルド時間を40%増加させました。デバッグビルドを高速化するために、app/build.gradleファイルとルートbuild.gradleファイルのビルドパラメーターを使用して、デバッグのオン/オフを切り替える可能性を追加しました。

アプリ:

if(!project.hasProperty( "disable-performance-plugin")){プラグインを適用: 'com.google.firebase.firebase-perf'}

root/buildscript/dependencies:

if(!project.hasProperty( "disable-performance-plugin")){classpath( 'com.google.firebase:firebase-plugins:1.1.5'){除外グループ: 'com.google.guava'、モジュール: ' guava-jdk5 '}}

コマンドラインから実行する場合

./gradlew your-task -Pdisable-performance-plugin

Android Studioから作業する場合、フラグをコンパイラオプションに追加します。

Android Studio compiler options

36
Ivan Kravchenko

既存の回答はすべて有効ですが、それらはすべて何かを見逃しています。

この問題に対処するには、2つの主要なオプションから選択できます。

1. firebasePerformanceInstrumentationEnabledプロパティを使用します

これは、ビルドプロセス中に無効にするための SDKによって提供される公式の方法 です。

これがすること:

  • _transformClassesWithFirebasePerformancePluginFor*_タスクの実行時間を〜5-10sに短縮します。
  • 自動トレースを無効にして監視をリクエストしますが、カスタムトレースを有効のままにします。後者はAndroidManifest _<meta-data>_タグとFirebasePerformance.getInstance().setPerformanceCollectionEnabled()の呼び出しで制御できます。詳細は ドキュメント をご覧ください。

これを行う方法:

必要な場合(通常、アプリを公開するときのみ)他のすべてで無効にするよりも、only enableプラグインするほうがはるかに簡単だと思います。ケース。

注:もちろん、手動ビルドでは忘れることがありますを有効にします。したがって、CIがない場合は、Gradleで他の自動スクリプトを追加するか、他の回答で使用されている反対のアプローチに固執する価値があるかもしれません。

ただし、一般に、必要な手順は2つだけです。

  1. _gradle.properties_ファイルに次の行を追加します。

    _firebasePerformanceInstrumentationEnabled=false
    _
  2. CI構成または手動ビルドで次のコマンドを使用します。

    ./gradlew assembleRelease -PfirebasePerformanceInstrumentationEnabled = true

長所:

  • 設定するプロパティは1つだけです。

短所:

  • プラグインはビルド時間にさらに5〜15秒追加します。

2. _firebase-perf_ Gradleプラグインを適用しないように、カスタムGradleプロジェクトプロパティを使用します

これがすること:

  • transformClassesWithFirebasePerformancePluginFor *タスクはまったく実行されないです。また、最初のソリューションを使用するときに存在する追加の〜5〜10秒のオーバーヘッドを節約します。
  • 最初の方法と同じ– 自動トレースを無効にして監視をリクエストしますが、カスタムトレースを有効のままにします。後者はAndroidManifest _<meta-data>_タグとFirebasePerformance.getInstance().setPerformanceCollectionEnabled()の呼び出しで制御できます。詳細は ドキュメント をご覧ください。

これを行う方法:

このアプローチには同様のポイントと警告があり、2つのステップも含まれます。

  1. アプリモジュールの_build.gradle_ファイルを変更します。

    _if (project.hasProperty('useFirebasePerf')) {
      apply plugin: 'com.google.firebase.firebase-perf'
    }
    _

    注: you 必要ないプロジェクトレベルに同じチェックを適用する_build.gradle_:

    _classpath "com.google.firebase:firebase-plugins:$firebase_plugins_version"
    _

    プラグイン自体が有効になっていない場合、Gradleはこの宣言を使用しません。

    そして、 ドキュメントに記載されている としてfirebase-plugins v1.1.1以降を使用している場合、そこに_guava-jdk5_依存関係を除外するために必要ないがあります。

  2. CI構成または手動ビルドで次のコマンドを使用します。

    ./gradlew assembleRelease -PuseFirebasePerf

長所:

  • 完全 Firebase Performance Gradleプラグインに関連する時間の費用を排除します。

短所:

*(ボーナスオプション)カスタムGradleプロジェクトプロパティを使用して_firebase-perf_ SDKを除外

Firebase Performance SDKのカスタムトレースやその他の機能を使用せず、自動監視のみに依存している場合(つまり、コード内のSDKに依存関係がない場合)、非本番用にこの依存関係を除外できますビルドします。

これを行う方法:

必要なのは、アプリモジュールの_build.gradle_ファイルを更新することだけです。

  • 最初のオプションを使用することを選択した場合、依存関係を次のように変更します。

    _if (project.property('firebasePerformanceInstrumentationEnabled') == 'true') {
      implementation "com.google.firebase:firebase-perf:${firebase_perf_version}"
    }
    _
  • 2番目を選択した場合:

    _if (project.hasProperty('useFirebasePerf')) {
      implementation "com.google.firebase:firebase-perf:${firebase_perf_version}"
    }
    _

利点:

  • これにより、依存関係の構成と「ProGuarding」に費やす追加の〜5-10sを節約できます。

欠点:

  • 実稼働APKのサイズは、デバッグ用のAPKよりも約0.5MB大きくなります。これにより、レポートや予測が混乱する可能性があるため、注意する必要があります。
  • 64Kのメソッドカウント制限をほぼ超えている場合、プロダクションビルドで突然それを超えて、MultiDexゾーンにいる可能性があります。そして、それは実行する余分な作業とテストを意味します。これは、Firebase Performanceが(最適化を備えたProGuardを適用した後)膨大な数のほぼ5Kのメソッド参照をもたらすためです。

私の記事 をチェックアウトすることもできます。このトピックについてさらに詳しく説明します。

24
qwertyfinger

このスレッドのコメントはすべて有効です。私はデバッグビルドのためにそれを無効にする非常に簡単な方法を提案したい:

if (getGradle().getStartParameter().getTaskRequests().toString().contains("Release")) {
    apply plugin: 'com.google.firebase.firebase-perf'
}
10
Romain Piel

transformClassesWithFirebasePerformancePluginForDebugを無効にする別のオプションを与えるために、ここに私のレシピを示します。

メインbuild.gradleフォルダー内:

if (!project.gradle.startParameter.taskNames.any { taskName ->
     taskName.toLowerCase().contains('assemble') && taskName.toLowerCase().contains('debug') }) {
     classpath("com.google.firebase:firebase-plugins:$firebasePluginVersion") {
         exclude group: 'com.google.guava', module: 'guava-jdk5'
     }
}

Build.gradleアプリファイルで:

if (!project.gradle.startParameter.taskNames.any { taskName ->
    taskName.toLowerCase().contains('assemble') && taskName.toLowerCase().contains('debug') }) {
    apply plugin: 'com.google.firebase.firebase-perf'
}
5
R. Zagórski

私もこの問題に遭遇しました。もともとR.Zagórskiによって提供された回答のバリアントを使用していましたが、Gradleフォーラムの similar thread に基づいて、条件付きでプラグインをプロジェクトに適用することは正しい方法ではないようです行く:

プラグインは「プロジェクトの一部」のみに適用できません。適用されるかされないかのどちらかです。

プラグインを条件付きで適用することは、適切に実行できれば機能するように見えますが、正式にサポートされている機能ではありません。同じスレッドのさらに下に、別のポイントが作成されます。

ただし、プラグインを使用すると、より詳細なレベルで設定できます。

案の定、実際にはFirebaseプラグインによって公開されているプロパティがあり、インストルメンテーションのオン/オフを切り替えることができます(したがって、ビルド時間の増加を切り替えます)。ただし、構築プロセス中に正確に適切なタイミングで適用する必要があるため、このプロパティを使用するのは難しくなりますが、いったん取得したら、必要に応じて基本的にピボットできます。

次のコードスニペットは、デバッグビルドバリアントと非デバッグビルドバリアントに基づいてインストルメンテーションをピボットする方法です。 Kotlinで書かれていますが、Groovyに翻訳されると思います。

plugins {
    ...
    id ("com.google.firebase.firebase-perf")
}

...

Android {
    ...

    applicationVariants.all {
        val variant = this
        val isFirebaseEnabled = !variant.javaCompiler.name.contains("Debug", true)

        gradle.taskGraph.whenReady {
            if (this.hasTask(variant.javaCompiler))
            {
                project.FirebasePerformance.isInstrumentationEnabled = isFirebaseEnabled
            }
        }
    }

    ...
}

これを適切に配置すると、transformClassesWithFirebasePerformancePluginFor*タスクはすべてのビルドバリアントに対して常に実行されますが、インストルメンテーションが有効になっていないバリアントに対してはほぼ即座に完了します。

3
Inirit

Firebase Performanceperf-pluginの新しいバージョンをリリースしました(v1.3.)。これにより、無効化 FirebaseパフォーマンスモニタリングGradleプラグインが有効になります特定のビルドバリアント用buildTypesまたはproductFlavors)。

以下の例:

 Android {
      // ...

      debug {
        FirebasePerformance {
          // Set this flag to 'false' to disable @AddTrace annotation processing and
          // automatic HTTP/S network request monitoring
          // for a specific build variant at compile time.
          instrumentationEnabled false
        }
      }
    }

リリースノートの参照:

https://firebase.google.com/support/release-notes/Android#update_-_july_10_2019

この回答のオプション2を簡略化しました https://stackoverflow.com/a/53270530/1635488

  • gradle.propertiesでプロパティを定義します

    useFirebasePerf = false

  • Perfプラグインを無効にする

    if(useFirebasePerf.toBoolean()){プラグインを適用: 'com.google.firebase.firebase-perf'}

  • 依存関係を削除

    if(useFirebasePerf.toBoolean()){implementation 'com.google.firebase:firebase-perf:16.2.3'}

  • CIビルドに対してのみパフォーマンス監視を有効にします(リリースビルドに対してのみお勧めします)

    gradlew assembleRelease -PuseFirebasePerf = true

0
android_dev

Android Studioが時間をかけて閉じて時間を構築し始めますAndroidスタジオとイベントは時々コンピューターを起動して再起動します。再起動しますか?

0

Firebase perfプラグインの新しいバージョン(1.3.0以上)Kotlin DSLを使用する場合は、次を追加する必要があります。

Android {
  ...
  buildTypes {
    ...
    all {   
      with((this as ExtensionAware).extensions["FirebasePerformance"] as FirebasePerfExtension) {
        setInstrumentationEnabled(!isDebuggable)
      }     
    }
    ...
  }

}

Groovyバージョンの場合、 Firebase documentation を確認できます。

0
codeWhisperer