Android Platformアプリ環境でもAnnotation Prosessor使いたい
まえがき
誰に需要があるか分からないけれど、個人的に調べたので書いておく。 どうしてもAndroid.mkでビルドする必要がある!という以外では、gradleを使ってビルドする方が何かと楽できるのでそちらをオススメします。
開発環境
下記の開発環境で行ってます。
- OSX 10.11.1
- Android 6.0.1
- target aosp_shamu
また今回、Annotaion Prosessorとして利用するのはButterKnifeとします。 他のAPTでも利用方法は大きく変わらないはずです。
プロジェクト構成
今回利用するプロジェクト構成は下記の様になっています。
<tree-top>/vendor/kobashin/sampleにプロジェクトを配置します。
vendor/kobashin/sample ├── Android.mk ├── AndroidManifest.xml ├── libs │ └── butterknife-7.0.1.jar ├── res │ ├── layout │ │ └── activity_main.xml │ ├── mipmap-hdpi │ ├── mipmap-mdpi │ ├── mipmap-xhdpi │ ├── mipmap-xxhdpi │ ├── mipmap-xxxhdpi │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── values-w820dp └── src └── uselibrary.sample.kobashin.com.uselibrary_sample └── MainActivity.java
一般的なPlatformアプリ環境でのパッケージ構成になっています。 libs以下に こちらより取得したjarを配置しています。
MainActivity.javaおよびactivity_main.xmlの内容は以下の通り簡素な内容になっています。
Android.mkにAnnotation Prosessorの設定を記入する
support-libraryを組み込む
今回のプロジェクトでは、support-v7-appcompatを利用しています。 support-v7-appcompatはソースツリー内にプロジェクトが居るので、そのモジュール名を指定すればStaticライブラリとして読み込みが可能です。また、support-v7はv4に依存しているためそれの指定も必要です。
上記の様に、LOCAL_STATIC_JAVA_LIBRARIESに該当のプロジェクトのLOCAL_MODULE(Android.mkに定義)として定義されているandroid-support-v4
android-support-v7-appcompat
を指定します。
support library系のモジュールは
ただし上記指定のみでは、AAR形式ではなくJAR形式での読み込みとなるため、別途リソースファイルを参照できるようにしなければなりません。
これで、support-v7のresを参照できるようになります。
ButterKnifeのjarをビルドに組み込む設定
上記support libraryはすでにモジュールが存在したので、定義を持ってくるのみで済みましたが、自前でjarを持ち込む場合は別途記述が必要になります。
33行目のように書くことで、butterknifeという名前でAndroid.mk内で参照が可能になります。
annotation processorを指定する
EclipseやAndroidStudioは適切なタイミングでProcessorを呼び出してくれているため上手くうごきますが、 Android.mkにてビルドする場合は、jarファイルをStaticライブラリに指定するだけではAnnotation Processorは動作しません。
javacコマンドでAnnotation Processorを指定するときと同じように、-processor
オプションにProcessorのクラスを指定することで動作させることができます。
Android.mk内でjavacのオプションを定義するにはLOCAL_JAVACFLAGSを利用します。
生成済みのAndroid.mk
もろもろの設定を入れた後のAndroid.mkは次の通りです。
Buildする
mm ANDROID_COMPILE_WITH_JACK=false
とか使ってビルドすると、apkが生成されます。
AndroidM向けには標準でBuildToolにJackが採用されます。
Jackは今のところ、Annotation Processorには対応していないようで、コンパイルは正常に通りますが、実行時に期待通りに動作しません。そのため、ここではJACKを利用しないようにしています。
メモ書き
M向け環境だとデフォルトでjillとかjackが採用されるはずで、どこかで読んだ内容だとAnnotation Processingは動かないとなっていたんだけれど、gradle向けにはってことなのかな?
ちなみに、mm ANDROID_COMPILE_WITH_JACK=false
とするとjackを使わないでBuildできます。
mm
とmm ANDROID_COMPILE_WITH_JACK=false
を混ぜて実行していたので、実行結果の整理ができてないままに記事になっていました。ごめんなさい。
正しくは、Jack利用時にはAnnotation Processorはやはり期待通り動作していません。