Androidソースコードの一部をビルドする

Androidソースコードの一部をビルドする方法です。

* Androidアプリでなく、AOSPで公開されているOSのソースコードについての話題です。

# 手順
* Androidのソースコードをbuildする環境を用意する。
* ビルドしたいモジュールのAndroid.mkに含まれる LOCAL_MODULE を設定している箇所を探す。
* LOCAL_MODULEで設定している文字列local_moduleをmakeの引数にする。 make local_module
* cleanしたい場合はclean- を付加する。 make clean-local_module


# 例1 bluedroid
* Android 5.1 で bluedroid だけをビルドしたい場合の例です。
* external/bluetooth/bluedroid以下のAndroid.mkに含まれるLOCAL_MODULE を探す。 (agが無い場合はgrepで探してください。)

```
$ ag "LOCAL_MODULE[: ]"  external/bluetooth/bluedroid
external/bluetooth/bluedroid/embdrv/sbc/decoder/Android.mk
24:LOCAL_MODULE:= libbt-qcom_sbc_decoder

external/bluetooth/bluedroid/osi/Android.mk
18:LOCAL_MODULE := libosi
40:LOCAL_MODULE := ositests

external/bluetooth/bluedroid/stack/Android.mk
154:LOCAL_MODULE := libbt-brcm_stack

external/bluetooth/bluedroid/conf/Android.mk
4:LOCAL_MODULE := bt_stack.conf
13:LOCAL_MODULE := bt_did.conf
22:LOCAL_MODULE := auto_pair_devlist.conf

external/bluetooth/bluedroid/test/bluedroidtest/Android.mk
33:LOCAL_MODULE:= bdt

external/bluetooth/bluedroid/test/suite/Android.mk
22:LOCAL_MODULE := bdtest

external/bluetooth/bluedroid/bta/Android.mk
92:LOCAL_MODULE := libbt-brcm_bta

external/bluetooth/bluedroid/audio_a2dp_hw/Android.mk
14:LOCAL_MODULE := audio.a2dp.default

external/bluetooth/bluedroid/hci/Android.mk
39:LOCAL_MODULE := libbt-hci

external/bluetooth/bluedroid/main/Android.mk
136:LOCAL_MODULE := bluetooth.default

external/bluetooth/bluedroid/gki/Android.mk
27:LOCAL_MODULE := libbt-brcm_gki

external/bluetooth/bluedroid/utils/Android.mk
16:LOCAL_MODULE := libbt-utils
```

* 何個もLOCAL_MODULEが定義されているのですが、いろいろ試した結果、bluetooth.default がbluedroidの本体のライブラリbluetooth.default.soに対応しています。これを指定すると下位のLOCAL_MODULEもまとめてビルドしてくれます。
* LOCAL_MODULEで設定している文字列bluetooth.default を引数にして make します。

```
$ make bluetooth.default
```
* 依存しているbionic libcなどもビルドされます。
* 最終的に out/target/product/generic/system/lib/hw/bluetooth.default.so に出力されます。

```
Install: out/target/product/generic/system/lib/hw/bluetooth.default.so
```

# 例2 wpa_supplicant
* Anrdoid 5.1 の wpa_supplicant hostapdをビルド
* external/wpa_supplicant_8以下のAndroid.mkのLOCAL_MODULEを探す

```
$ ag "LOCAL_MODULE[: ]" external/wpa_supplicant_8/
external/wpa_supplicant_8/hs20/client/Android.mk
62:LOCAL_MODULE := hs20-osu-client

external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant_conf.mk
16:LOCAL_MODULE := wpa_supplicant.conf

external/wpa_supplicant_8/wpa_supplicant/Android.mk
1549:LOCAL_MODULE := wpa_cli
1559:LOCAL_MODULE := wpa_supplicant
1589:#LOCAL_MODULE := eapol_test
1604:#LOCAL_MODULE := wpa_supplicant.conf
1613:LOCAL_MODULE = libwpa_client

external/wpa_supplicant_8/hostapd/Android.mk
896:LOCAL_MODULE := hostapd_cli
906:LOCAL_MODULE := hostapd
```
* make でビルドしたけどbuildされなかった。
* 原因はtargetがaosp_arm-engだとWPA_SUPPLICANT_VERSIONなどの定義がないためだった。
* WPA_SUPPLICANT_VERSIONはNexusなどのtarget設定に含まれているので、とりあえず、Nexus6 (shamu)の設定を行ったらbuild できるようになった。
* lunch 14 とかすると、TARGET_PRODUCT=aosp_shamuとなる。
* makeでビルドする。

```
make wpa_supplicant.conf wpa_cli wpa_supplicant libwpa_client hostapd_cli hostapd_cli
```

* 下記にファイルが出力される。

```
Install: out/target/product/shamu/system/etc/wifi/wpa_supplicant.conf
Install: out/target/product/shamu/system/bin/wpa_cli
Install: out/target/product/shamu/system/bin/wpa_supplicant
Install: out/target/product/shamu/system/lib/libwpa_client.so
Install: out/target/product/shamu/system/bin/hostapd
Install: out/target/product/shamu/system/bin/hostapd_cli
```



# 参考
* Building a particular module in the android source code
 * http://stackoverflow.com/questions/13139394/building-a-particular-module-in-the-android-source-code
* Android Build System
 * http://elinux.org/Android_Build_System