パルカワ2

最近はFlutterをやっています

Annotation processorを利用したAndroidライブラリをつくる

作る度に毎度似たようなことをしていてめんどくさい。しかも忘れていたりするのでテンプレート化したいんですが、Android Studioを更新するときにはテンプレートを消さないといけないとかあるらしくてそれはそれでだるいので、とりあえず将来の自分のためにメモとして残しておく。

ここでは、Konohanaという名前のライブラリを作ろうとしています。 名前の由来は、此花区です。かわいい。

全部のログはここにあります。

github.com

New Project

まずは、サンプルアプリを作ります。

File -> New Project を選択

  • Application NameにKonohanaExampleをつける
  • package nameを com.github.hisaichi5518.konohana.exampleに変更する
  • Project Location を Konohana にする

そのあとは自分がmin sdkなどを指定してFinishを押す。 ビルド出来るようになるので、とりあえずビルドして安心感を得る。

f:id:hisaichi5518:20170919172225p:plain

Git

プロジェクト生成が終われば、Gitをアレしてソレする。

  • git init
  • curl https://www.gitignore.io/api/vim%2Candroid%2Candroidstudio > .gitignore
  • git add .
  • git commit -m "first commit"

gitignoreを自分で頑張るのは不毛なので gitignore.io に任せる。僕が利用するVim, Android, Android Studio を指定してある。 Githubリポジトリ作るとかは良きタイミングで。

app -> example

  • app を右クリックして、Refactor -> Rename を選択
  • example にする
  • git commit

Android Libraryを追加する

File -> New Module -> Android Library を選択

  • library name は Konohana
  • module name を library
  • package nameは com.github.hisaichi5518.konohana
  • min sdkはよしなにする
  • git commit

f:id:hisaichi5518:20170919172257p:plain

annotation library (Java Library)を追加する

Android libraryの中にannotationを入れてもいいような気がしますが、後述するProcessor library(Java library)がAndroid libraryに依存するのが許せなかったので分けます。

File -> New Module -> Java Library を選択

  • Library name は annotation
  • package name は com.github.hisaichi5518.konohana.annotation
  • class name は つくる予定のアノテーション名をいれます。 今回の場合は Key
  • git commit

annotations としているライブラリがいくつかありましたが、他は単数形でこれだけ複数形にするのが気になったのでやめました。なにか複数形にするべき理由があるのかもしれない。

f:id:hisaichi5518:20170919172313p:plain

processor library (Java Library) を追加する

File -> New Module -> Java Library を選択

  • Library nameは processor
  • package name は com.github.hisaichi5518.konohana.processor
  • class name は KonohanaProcessor
  • git commit

f:id:hisaichi5518:20170919172324p:plain

Java 8を利用する

processorのみJava8を指定する。

  • processor/build.gradle で JavaVersion.VERSION_1_8 を指定する
  • git commit

https://github.com/hisaichi5518/annotation-processor-example/commit/6ac6d78b59bda4befa5b6dde13e07f2d73dce236

追加したModuleを利用する

以下のように変更し、git commit する。

https://github.com/hisaichi5518/annotation-processor-example/commit/92ce2654b48da75d94f518ea21bd180e87c6a6b4

library/build.gradle

以下を追加する

  • compile project(':annotation')

example/build.gradle

以下を追加する

  • annotationProcessor project(':processor')
  • compile project(':library')

processor/build.gradle

以下を追加する

  • compile project(':annotation')

maven.google.com を利用する

Android Studio 3.0だと不要だと思う。 以下のコミットのように追加する。

https://github.com/hisaichi5518/annotation-processor-example/commit/bcfd9c8a9021e90ffa6b8dd86cfb16be27c10d4e

必要なライブラリを追加と削除

以下のコミットのように追加していく。

https://github.com/hisaichi5518/annotation-processor-example/commit/12d377943af8d35a68be1e52a8210083a0558960

また様々な箇所でバージョンを指定する必要があり、揃える必要があるライブラリ(例えばサポートライブラリ)は、バージョンを変数にいれる。

https://github.com/hisaichi5518/annotation-processor-example/commit/5b0ae810915aa3f4a36f803b0dfc498f5dd48b0d

ライブラリは、最新版を利用したほうがいいので、以下のURLを確認

最後に library/build.gradleにある appcompat-v7 は不要であることもあるので、不要なら消す。

Processorの準備

KonohanaProcessor を変更していく。

https://github.com/hisaichi5518/annotation-processor-example/commit/b59b76ce3989396ab71b29139cf08fcab6e5adc5

Annotationをつくる

自動生成されるのはclassなのでAnnotationにする。 あとexampleで利用するコード書いておく。

@Target(ElementType.FIELD)
public @interface Key {
}
public class MainActivity extends AppCompatActivity {

    @Key
    String name;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Rebuild Projectを実行

Build -> Rebuild Project

おわり

なんかもっとスマートなやり方があったら知りたい。 github.com