Androidのライブラリプロジェクトのパッケージングにはapklib
とaar
という二種類の規格が存在する。大きく分けるとこんな感じ。
-
apklib
: maven-android-pluginでサポートしている規格。Google公式のものではなくサードパーティ製。 -
aar
: GradleのAndroid Pluginと共に登場した規格。今ではこちらが主流。
Androidを始めたのがつい半年程前なので、その頃には既にaarがメインストリームになっていて、apklibって何ですか?という状態だった。ネットを調べてもapklibの情報が載っているページはあんまり無くて、しばらく理解できてなかった。
apklibの場合はMavenのビルド用にapklibを用意しつつ、Eclipseのローカルビルドの為にライブラリプロジェクトをcloneしてきて開発をしないといけない、つまりダブルメンテが発生するので割と最悪だと思う。一方でaarはそういう必要がないけど、Eclipseで取り扱う事ができないので個人で開発するにはいいけど会社でこれからaar一本で行きますみたいなのはまだ厳しかったりする。
ちなみに、Android Studio(IntelliJ)はapklibをいい感じに解凍してローカルでの依存関係を解決してくれるので便利。EclipseとAndroid Studioを併存させたいのであればapklibをしばらく使わざるを得ない。
内部構造がどうなってるのか気になったので調べてみた。両者とも実体はzipなのだが、微妙に内容が違った。
apklib format
+ AndroidGridViewCompatLib.apklib
+ src
+ res
+ AndroidManifest.xml
+ project.properties
aar format
+ AndroidGridViewCompatLib.aar
+ /AndroidManifest.xml (mandatory)
+ /classes.jar (mandatory)
+ /res/ (mandatory)
+ /R.txt (mandatory)
+ /assets/ (optional)
+ /libs/*.jar (optional)
+ /jni/<abi>/*.so (optional)
+ /proguard.txt (optional)
+ /lint.jar (optional)
apklibにはsrc/main/javaのソースディレクトリが含有されるけど、aarにはclasses.jarという形式で含まれるらしい。相互を一発変換できると便利なのだけど、formatをみる限り厳しそうだ。知見を持ってる方がいたらシェアして頂きたい。