Mokelab Blog

#77 Jetpack Composeのコンパイラプラグインのレポートを生成する

Jetpack Composeのコンパイラプラグインにはレポートを生成する機能があります(公式ドキュメント)。

例によって導入でいろいろとハマったので記事として残します。大事な部分だけ拾い読みしたい方はこちらこちらだけ御覧ください。

app/build.gradleにブロックを追加する

公式ドキュメントに「Other Gradle projects」の欄があるので、app/build.gradleに追記してみます。

plugins { ... }

android { ... }

dependencies { ... }

// このブロックを追加
compileKotlin {
  freeCompilerArgs += listOf(
    "-P",
    "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=reports"
  )
}

Sync Nowを押すと次のように怒られました。compileKotlin()は知らないぞと言われています。

A problem occurred evaluating project ':app'.
  > Could not find method compileKotlin() for arguments [...] on project ':app' of type org.gradle.api.Project.

kotlinOptionsに移動させる

先ほどのブロックはKotlinコンパイラに対して引数を追加するのが目的でした。Androidの場合、androidブロックの中にあるkotlinOptionsの中に記述する必要があるようです。

plugins { ... }

android {
  ...
  kotlinOptions {
    jvmTarget = '1.8'
    // 移動させた
    freeCompilerArgs += listOf(
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=report"
    )    
  }
}
  
dependencies { ... }

Sync Nowするとまたエラーになりました。

A problem occurred evaluating project ':app'.
  > No signature of method:

公式ドキュメントのサンプルはkts版でした。GroovyなのでlistOfの部分を修正します。

plugins { ... }

android {
  ...
  kotlinOptions {
    jvmTarget = '1.8'
    // Groovyになおした
    freeCompilerArgs += [
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=report"
    ]
  }
}
  
dependencies { ... }

これでSync Nowすると成功しました。ビルドしてみます。

ビルド時エラー

ビルドすると次のようなエラーがでました(横に長いので改行をいれています)。

Unsupported plugin option: 
  androidx.compose.compiler.plugins.kotlin:metricsDestination=report

サポートしていないプラグインのオプションだよ!と言われました。公式ドキュメントの通りなのに。。。

と、ここでComposeのバージョンを確認してみます。1.0.1だったので1.1.1にしました。Kotlinのバージョンも1.6.10にあげておきます。

//build.gradle
buildscript {
  ext {
    // 1.1.1にした
    compose_version = '1.1.1'
  }
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
  id 'com.android.application' version '7.1.2' apply false
  id 'com.android.library' version '7.1.2' apply false
  // 1.6.10にした
  id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

task clean(type: Delete) {
  delete rootProject.buildDir
}

これでビルドが成功するようになりました。

生成されない。。。

ビルドも成功しましたがレポートらしきものは生成されません。実はmetricsDestinationオプションに指定するフォルダはフルパスで記述する必要があります(次の例は代表のmacでの例なのでそのままコピペして使わないようお願いします)。

plugins { ... }

android {
  ...
  kotlinOptions {
    jvmTarget = '1.8'
    // フルパスにした
    freeCompilerArgs += [
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=/Users/fkm/compose-reports"
    ]
  }
}
  
dependencies { ... }

ビルドすると、指定したパスにapp_debug-module.jsonができました。中身は次のような感じになっています。

{
  "skippableComposables": 7,
  "restartableComposables": 7,
  "readonlyComposables": 0,
  "totalComposables": 7,
  "restartGroups": 7,
  "totalGroups": 8,
  "staticArguments": 6,
  "certainArguments": 1,
  "knownStableArguments": 33,
  "knownUnstableArguments": 0,
  "unknownStableArguments": 0,
  "totalArguments": 33,
  "markedStableClasses": 0,
  "inferredStableClasses": 1,
  "inferredUnstableClasses": 0,
  "inferredUncertainClasses": 0,
  "effectivelyStableClasses": 1,
  "totalClasses": 1,
  "memoizedLambdas": 4,
  "singletonLambdas": 0,
  "singletonComposableLambdas": 4,
  "composableLambdas": 4,
  "totalLambdas": 4
 }

プロジェクトの下に生成したい

フルパスを記述するので、複数人で開発する場合に困ります。なのでプロジェクトの下に生成されるよう修正します。

plugins { ... }

android {
  ...
  kotlinOptions {
    jvmTarget = '1.8'
    // フルパスにした
    freeCompilerArgs += [
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${rootProject.file(".").absolutePath}/compose-reports"
    ]
  }
}
  
dependencies { ... }

レポートも生成したい

メトリックスが生成できたので、いっしょにレポートも生成するようにします。

plugins { ... }

android {
  ...
  kotlinOptions {
    jvmTarget = '1.8'
    freeCompilerArgs += [
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${rootProject.file(".").absolutePath}/compose-reports"
    ]
    // レポートも生成するようにした
    freeCompilerArgs += [
      "-P",
      "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${rootProject.file(".").absolutePath}/compose-report"
    ]
  }
}
  
dependencies { ... }

ビルドします。Kotlinコードに変更しないとコンパイル部分がスキップされてしまうので、Android StudioでRebuild Projectします。

app_debug-classes.txtには、クラスに関する情報が生成されます。

stable class MainActivity {
  <runtime stability> = Stable
}

app_debug-composables.txtには、コンポーザブル関数に関する情報が生成されます。どの引数が安定(stable)かなどの大事な情報が入っています。

restartable skippable fun Greeting(
  stable name: String
)
restartable skippable fun DefaultPreview()
restartable skippable fun ReportTheme(
  stable darkTheme: Boolean = @dynamic isSystemInDarkTheme($composer, 0)
  stable content: Function2<Composer, Int, Unit>
)

stable/unstableに関しては公式ドキュメントを参照してください。stableと思っていたものがunstableになっていないか確認しましょう。

まとめ

Jetpack Composeのコンパイラプラグインの機能を使ってメトリックスとレポートを生成する方法を紹介しました。ぐぐってもAndroidプロジェクトでの使い方が出てこなくて苦労しました。。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。