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