2020-02-04T05:43:12.000+09:00

Androidライブラリ開発でRuntimeInvisibleParameterAnnotationsとなりアプリがビルドできない時の対処法

明確な原因まではわからないものの、対処法までは見つかったのでとりあえず書く。ざっくり言うと、Jetifierのバグを踏んだらしい。

問題の再現手順

ライブラリプロジェクトとして、Android Support Libraryを用いたものを作成する。AndroidXではない。

api "com.android.support:support-annotations:28.0.0"

下記のようなEnumクラスを作成する。ポイントなのは、コンストラクタのパラメータにAnnotationが付けてあること。

public enum MyOriginalEnum {
  
  MyOriginalEnum(@Nullable Integer hoge) {
    // do something
  }
  
}

このクラスをライブラリとして参照するプロジェクトで、Jetifierを有効にする。gradle.propertiesにある。

android.useAndroidX=true
android.enableJetifier=true

このEnumをJavaコードから参照する。importだけでも再現する。Kotlinから参照する場合は関係ない。

Log.d("Hoge", MyOriginalEnum.values());

すると、下記のようなエラーになってコンパイルができない。

エラー: MyOriginalEnumにアクセスできません
クラス・ファイル/Users/****/.gradle/caches/transforms-2/files-2.1/****/jetified-****-api.jar(****/MyOriginalEnum.class)は不正です
RuntimeInvisibleParameterAnnotations属性が不正です: MyOriginalEnum(Integer)
削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。

対処方1

Enum側のパラメータに付与してあるAnnotationを外す。今回の場合は @Nullable を外すので、IDE補助がなくなる。

対処法2

Jetifierを使わない。どうもこの問題はJetifierによるバイトコードの変換で発生しているらしい。

対処法3

Kotlinコードからしか参照しない。試したところ、Kotlinからしか参照しない分には問題は発生しなかった。