【Gradle Plugin】detekt「baseline」とは

何のことか分からないまま遊んでいたら、ルール違反が検出されなくなった。

毎度のことながら、

気づいてからドキュメントに書いてあることが分かる。

Code Smell Baseline
👉 Code Smell Baseline | detekt hatena-bookmark

まあ、そんなに隅々まで読まないわな。

なので簡単にメモ。

 

🧑‍💻「baseline」とは


./gradlew detekt

で「code smell」が検出されたときに、それらを baseline に保存しておくと、次からそれらは検出されなくなる。

「検出のベースライン」ということなのだろう。

 

🧑‍💻 baseline ファイル

ファイル位置を指定しておくと分かりやすい。


// build.gradle.kts

detekt {
  baseline = file("$rootDir/config/detekt/baseline.xml")
}


❯ ./gradlew tasks | grep detekt | grep -v EXPERIMENTAL
detekt
detektBaseline - Creates a detekt baseline on the given --baseline path.
detektGenerateConfig - Generate a detekt configuration file inside your project.

検出後、./gradlew detektBaseline で指定した位置に書き出される。


❯ ./gradlew detekt             

> Task :app:detekt FAILED
~(略)~ The function EditBar(target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -> Unit, onClear: () -> Unit, onValueChange: (TextFieldValue) -> Unit, onAdd: () -> Unit, onUpdate: () -> Unit, onDelete: () -> Unit, modifier: Modifier) has too many parameters. The current threshold is set to 6. [LongParameterList]
~(略)~ The function TodoScreen is too long (99). The maximum length is 60. [LongMethod]
~(略)~ The function MainScreen is too long (63). The maximum length is 60. [LongMethod]

FAILURE: Build failed with an exception.

❯ ./gradlew detektBaseline                            

BUILD SUCCESSFUL in 510ms

❯ cat config/detekt/baseline.xml                                            
<?xml version="1.0" ?>
<SmellBaseline>
  <ManuallySuppressedIssues></ManuallySuppressedIssues>
  <CurrentIssues>
    <ID>LongMethod:MainScreen.kt$@Composable fun MainScreen( modifier: Modifier = Modifier )</ID>
    <ID>LongMethod:TodoScreen.kt$@Composable fun TodoScreen( modifier: Modifier = Modifier, viewModel: TodoViewModel = hiltViewModel() )</ID>
    <ID>LongParameterList:TodoScreen.kt$( target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -&gt; Unit, onClear: () -&gt; Unit, onValueChange: (TextFieldValue) -&gt; Unit, onAdd: () -&gt; Unit, onUpdate: () -&gt; Unit, onDelete: () -&gt; Unit, modifier: Modifier = Modifier )</ID>
  </CurrentIssues>
</SmellBaseline>

ここで検出しようとすると、何も検出されない。


❯ ./gradlew detekt              

BUILD SUCCESSFUL in 582ms

削除すると検出されるようになる。


❯ rm config/detekt/baseline.xml

❯ ./gradlew detekt             

> Task :app:detekt FAILED
~(略)~ The function EditBar(target: TargetTodo, focusRequester: FocusRequester, onDone: KeyboardActionScope.() -> Unit, onClear: () -> Unit, onValueChange: (TextFieldValue) -> Unit, onAdd: () -> Unit, onUpdate: () -> Unit, onDelete: () -> Unit, modifier: Modifier) has too many parameters. The current threshold is set to 6. [LongParameterList]
~(略)~ The function TodoScreen is too long (99). The maximum length is 60. [LongMethod]
~(略)~ The function MainScreen is too long (63). The maximum length is 60. [LongMethod]


FAILURE: Build failed with an exception.

 

🧑‍💻 まとめ

キャッシュが効いてるのかと思ってあれこれやっていたが、この「baseline」だった。

「最初からドキュメントを隅々まで読んでおけば良かった。」などは言わない。

👉 【AndroidStudio】detekt で JetpackCompose 記述をチェックする hatena-bookmark


AndroidX が minSdkVersion 19 に移行

AndroidX ライブラリは、2023 年 10 月のリリースから、サポートされるデフォルトの最小 Android API レベル 19 (以前は 14) に移行します。Play ストアのチェックイン データによると、ほぼすべての Android ユーザーが API 19 以降のデバイスを使用しているため、API レベル 19 ではなくなりました。レガシーバージョンをサポートするために必要です。この変更は、AndroidX ライブラリがアプリ開発者の潜在的なユーザー数を最大化し、Google Play ServicesおよびAndroid NDKと連携するのに役立ちます。

現在、より低い minSdkVersion をサポートしている場合は、その値を 19 に増やし、以前のバージョンをサポートするようにコードをクリーンアップすることをお勧めします。ビジネス上の理由でそれができない場合は、AndroidX の以前のバージョンを使用し続けることをお勧めします。


👉 Android Developers Blog: AndroidX moving to minSdkVersion 19 hatena-bookmark

「API レベル 19」てのは、「Android OS 4.4 / Kitkat」です。

10年前ぐらいにリリースされました。


2023-10-17
+-----+------+--------------+-------+-------+----------+----------+
| API |   OS | CODE_NAME    |  WW % |  JP % | WW SUM % | JP SUM % |
+=====+======+==============+=======+=======+==========+==========+
|  19 |  4.4 | KITKAT       |  0.31 |  0.27 |    99.70 |    99.63 |
+-----+------+--------------+-------+-------+----------+----------+
|  21 |  5.0 | LOLLIPOP     |  0.43 |  0.22 |    99.39 |    99.36 |
+-----+------+--------------+-------+-------+----------+----------+
|  22 |  5.1 | LOLLIPOP_MR1 |  0.89 |  1.73 |    98.96 |    99.14 |
+-----+------+--------------+-------+-------+----------+----------+
|  23 |  6.0 | M            |  1.48 |  1.07 |    98.07 |    97.41 |
+-----+------+--------------+-------+-------+----------+----------+
|  24 |  7.0 | N            |  1.81 |  1.78 |    96.59 |    96.34 |
+-----+------+--------------+-------+-------+----------+----------+
|  25 |  7.1 | N_MR1        |  0.52 |  0.50 |    94.78 |    94.56 |
+-----+------+--------------+-------+-------+----------+----------+
|  26 |  8.0 | O            |  3.07 |  2.94 |    94.26 |    94.06 |
+-----+------+--------------+-------+-------+----------+----------+
|  27 |  8.1 | O_MR1        |  2.50 |  0.78 |    91.19 |    91.12 |
+-----+------+--------------+-------+-------+----------+----------+
|  28 |  9.0 | P            |  7.01 | 10.43 |    88.69 |    90.34 |
+-----+------+--------------+-------+-------+----------+----------+
|  29 | 10.0 | Q            |  9.07 |  9.95 |    81.68 |    79.91 |
+-----+------+--------------+-------+-------+----------+----------+
|  30 | 11.0 | R            | 18.73 | 13.09 |    72.61 |    69.96 |
+-----+------+--------------+-------+-------+----------+----------+
|  31 | 12.0 | S            | 18.93 | 19.03 |    53.88 |    56.87 |
+-----+------+--------------+-------+-------+----------+----------+
|  33 | 13.0 | T            | 34.92 | 37.75 |    34.95 |    37.84 |
+-----+------+--------------+-------+-------+----------+----------+
|  34 | 14.0 | U            |  0.03 |  0.09 |     0.03 |     0.09 |
+-----+------+--------------+-------+-------+----------+----------+

👉 Android OS version market share hatena-bookmark

もういいわな、世界でも、日本でも1%に満たないんだから。


【AndroidStudio】実行時に自動でそれまでのログを消して logcat ウインドウを開く設定

こういう設定があるのは知っているけど設定をどこでするのか毎回分からない、ので。


[Run]

  ↓

[Edit Configulations...]

  ↓

✅ [Show logcat automatically]
✅ [Clear log before launch]


✔[Show logcat automatically]
✔[Clear log before launch]

基本的にこの2つはONにしてていいと思います。


Jetpack Compose Dependency versions API-33 vs API-34

 

💻 Dependencies のバージョンがきれいに揃わない

ひとつづつ地道にバージョンを上げていったもののここまでしか上げることができない。

Jetpack Compose Dependency versions API-33 vs API-34

これ以上の安定版バージョンもすでに公開されているのだが、どうしても、

「API-33 ではこのバージョンは使えないので API-34 に上げてください」

というような SDK のバージョンアップを促されるメッセージが表示され、ビルドできない。

👉 Dependency 'androidx.emoji2:emoji2-views-helper:1.4.0' requires version 34 or later [295457468] - Visible to Public - Issue Tracker hatena-bookmark


 

💻 プロの回答

Android 14 の API 34 が完成したことにより、すべての新しい Jetpack ライブラリ リリースが API 34 でコンパイルされ始めました。つまり、アプリも API 34 でコンパイルする必要があります。targetSdk は、多くのことができるまったく異なるものであることに注意してください。


すなわち、


compileSdk 34
targetSdk 33

でビルドせろ。ということなのか。

 

💻 Android Studio Giraffe

現在の Android Studio Giraffe | 2022.3.1 では、最新のサポートする API レベルは「33」。


👉 Android Studio Giraffe | 2022.3.1  |  Android Developers hatena-bookmark

これ、34 に上げてもいいの ?

 

💻 まとめ

Jetpack ライブラリの安定版最新を使いたい場合は、

Android Studio Girrafe でなく、まだ、ベータ版の Hedgehog | 2023.1.1 を使ったほうがいいんでないの?

一見、きれいに通っているように見える。


compileSdk 34
targetSdk 34

それとも、すべて安定版のまま、我慢の開発を続けるか。

👉 JetBrains Toolbox で Android Studio の Stable/Beta/Canary が同時に管理できる? hatena-bookmark


Gson が R8 で落ちる

Gson が R8 で落ちる
Android Studio, Gradle, SDK のアップデートで避けては通れない。

いろいろ悩む前に、通信周りは R8 の変化を気にしおくといい、


# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

👉 gson/examples/android-proguard-example/proguard.cfg at main · google/gson hatena-bookmark

ここらは、Gson 以外の JSON パーサーにも似たようなことが言える。

Retrofit を使ってる方は、必須の注意事項。

どんなライブラリよりも先に疑った方がいい。