techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Android Platformアプリ環境でもAnnotation Prosessor使いたい

まえがき

誰に需要があるか分からないけれど、個人的に調べたので書いておく。 どうしてもAndroid.mkでビルドする必要がある!という以外では、gradleを使ってビルドする方が何かと楽できるのでそちらをオススメします。

開発環境

下記の開発環境で行ってます。

  • OSX 10.11.1
  • Android 6.0.1
  • target aosp_shamu

また今回、Annotaion Prosessorとして利用するのはButterKnifeとします。 他のAPTでも利用方法は大きく変わらないはずです。

github.com

プロジェクト構成

今回利用するプロジェクト構成は下記の様になっています。

<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系のモジュールは /frameworks/supportの周辺に居ます。

ただし上記指定のみでは、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できます。

mmmm ANDROID_COMPILE_WITH_JACK=falseを混ぜて実行していたので、実行結果の整理ができてないままに記事になっていました。ごめんなさい。 正しくは、Jack利用時にはAnnotation Processorはやはり期待通り動作していません。