Android Libraryを作成されるときに生成される.aarフォーマットについて紹介したいと思います。

.aarの生成方法、使い方については以下の記事で書いたのでそちらを参考にしてください。

【Android】.aarをGitHub Pagesを使って公開する

.aarフォーマットはなんどかこのブログの記事で出現しては記事にすると言っていたので、改めて調べてみました。

.aarとは

The ‘aar’ bundle is the binary distribution of an Android Library Project.

意訳すると「AARはAndroidライブラリプロジェクトのバイナリディストリビューションです」という感じです。

つまりAndroidプロジェクト用のライブラリをまとめたフォーマットです。

.aarファイルには以下のファイルが含まれています。

順番に解体していきます。

1
2
$ ls -lah
-rw-r--r-- 1 hgoe fuga 6.0K 9 30 14:43 custom-view-0.0.1.aar

AAR(Android Archive)のフォーマットは.zipなので、mv *.aar *.zipで変換することが出来ます。

ということで.zipに変換して解凍してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cp custom-view-0.0.1.aar custom-view-0.0.1.zip
$ ls -lah
-rw-r--r-- 1 hoge fuga 6.0K 9 30 14:43 custom-view-0.0.1.aar
-rw-r--r-- 1 hoge fuga 6.0K 10 6 11:40 custom-view-0.0.1.zip
$ unzip custom-view-0.0.1.zip -d custom-view-0.0.1
Archive: custom-view-0.0.1.zip
inflating: custom-view-0.0.1/AndroidManifest.xml
inflating: custom-view-0.0.1/classes.jar
inflating: custom-view-0.0.1/R.txt
creating: custom-view-0.0.1/res/
creating: custom-view-0.0.1/res/values/
inflating: custom-view-0.0.1/res/values/values.xml
creating: custom-view-0.0.1/assets/
creating: custom-view-0.0.1/aidl/
$ ls -lah
total 32
drwxr-xr-x 8 hoge fuga 272B 10 6 11:52 custom-view-0.0.1
-rw-r--r-- 1 hoge fuga 6.0K 9 30 14:43 custom-view-0.0.1.aar
-rw-r--r-- 1 hoge fuga 6.0K 10 6 11:40 custom-view-0.0.1.zip

unzipで生成したcustom-view-0.0.1ディレクトリの中身を見てみます。

1
2
3
4
5
6
7
8
9
10
$ tree custom-view-0.0.1
custom-view-0.0.1
├── AndroidManifest.xml
├── R.txt
├── aidl
├── assets
├── classes.jar
└── res
└── values
└── values.xml

というファイル構成になっています。

とってもAndroidですよね。

各ディレクトリ名がAndroidプロジェクトのまんまなので特に紹介は割愛します。

なので.xmlファイルの中身を見ていきます。

ちなみに今回使っているサンプルのcustom-view-0.0.1.aarの元になっているプロジェクトはGitHubに公開しています。

NinjaAdMax/SampleCustomViewAttr

また記事にもしているので、よかったら確認してみてください。

【Android】AttributeSetを使ってXMLだけで自作Viewに値をセットする

AndroidManifest.xml

Androidプロジェクト(.aarを生成する元のプロジェクト)で書かれていたAndroidManifest.xmlは以下の通りです。

src/main/AndroidManifest.xml
1
2
3
4
5
6
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.shinobi.admax.android.library.circleview">
<application android:allowBackup="true"
android:label="@string/app_name" >
</application>
</manifest>

では.aarにしたときにどのようになっているか確認してみます。

custom-view-0.0.1/AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.shinobi.admax.android.library.circleview"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="20" />
<application
android:allowBackup="true"
android:label="@string/app_name" >
</application>
</manifest>

versionCodeversionNameminSdkVersiontargetSdkVersionが付与されてます。

ちなみにプロジェクトのbuild.gradleは以下のようになってました。

build.gradle build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apply plugin: 'com.android.library'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "jp.shinobi.admax.android.library.circleview"
minSdkVersion 9
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

ということで、ちゃんと期待通りに生成されていますね。

次にres/values内を見てみたいと思います。

res/values

元のプロジェクトのresディレクトリは以下の様になります。

1
2
3
4
5
6
$ tree src/main/res
src/main/res/
└── values
├── attrs.xml
└── strings.xml
1 directory, 2 files

各ファイルの内容は以下のようになっています。

src/main/res/values/strings.xml
1
2
3
<resources>
<string name="app_name">CircleView</string>
</resources>
src/main/res/values/attrs.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomView">
<attr name="custom_circle_x" format="dimension|reference" />
<attr name="custom_circle_y" format="dimension|reference" />
<attr name="custom_circle_position">
<enum name="top" value="0" />
<enum name="bottom" value="1"/>
<enum name="left" value="2" />
<enum name="right" value="3" />
<enum name="center" value="4"/>
<enum name="top_left" value="5" />
<enum name="top_right" value="6" />
<enum name="bottom_left" value="7" />
<enum name="bottom_right" value="8" />
</attr>
<attr name="custom_circle_radius" format="dimension|reference" />
<attr name="custom_circle_color" format="color|reference" />
</declare-styleable>
</resources>

では.aarを解凍したディレクトリ内にあるcustom-view-0.0.1/res/values/values.xmlを見ます。

res/values/values.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- From: file:${Project Root}/src/main/res/values/attrs.xml -->
<eat-comment />
<declare-styleable name="CustomView">
<attr name="custom_circle_x" format="dimension|reference" />
<attr name="custom_circle_y" format="dimension|reference" />
<attr name="custom_circle_position">
<enum name="top" value="0" />
<enum name="bottom" value="1" />
<enum name="left" value="2" />
<enum name="right" value="3" />
<enum name="center" value="4" />
<enum name="top_left" value="5" />
<enum name="top_right" value="6" />
<enum name="bottom_left" value="7" />
<enum name="bottom_right" value="8" />
</attr>
<attr name="custom_circle_radius" format="dimension|reference" />
<attr name="custom_circle_color" format="color|reference" />
</declare-styleable>
<!-- From: file:${Project Root}/src/main/res/values/strings.xml -->
<eat-comment />
<string name="app_name">CircleView</string>
</resources>

丁寧にコメントもついていますが、すべて統合されています。

ちなみにですが、AndroidManifest.xmlも今回のres/values/values.xmlもファイルの中身を見るのに特に難しい事はしていません。

ただ、簡単に見れるのは嬉しくないですね。

作ったクラス達

作ったクラスなどのjavaファイルはcustom-view-0.0.1/classes.jarになっています。

まとめ

他にも、libsディレクトリに*.jarを入れるとcustom-view-0.0.1/libsというディレクトリが出来て、その中にlibsディレクトリにいれたライブラリ達が入ります。

Proguardを使った暗号化をした場合はproguard.txtが生成されます。

中身に関しては以下のページを参考にしてください。

AAR Format - Android Tools Project Site

終わりに

自作の画像やStyleなどをつけるときは.aarで配布しないといけません。

*.jarファイルだと*.javaのファイルしか含まれないためです。

作成して.aarファイルを生成するのはいいですが、公開する前に中身を確認するのも良いかと思います。

以上になります。

参考

AAR Format - Android Tools Project Site