次にまたAndroid用のライブラリを作るときのために、Android版Arduino Firmataを作った時に色々やった事をメモする。
最終的にCUIだけで全部ビルドしてリリースできるようになったし、rubygemなみにメンテしやすい構成ができたと思われ

ソースはここに公開してる https://github.com/shokai/ArduinoFirmata-Android


問題

EclipseでAndroidプロジェクトを作って、パッケージエクスプローラのフォルダを右クリックして「エクスポート」からjarファイルが作れる。プロジェクトの中で使っているファイルの一部分だけをライブラリとして切り出せる。


でも
  • jarに切り出すリリース作業をGUIでやるとミス起きそう
  • gitで管理しにくそう
  • jarにREADMEとかを含めるのが面倒
  • ライブラリの性質上実機で動作確認しなければならず、手元のMacで自動テストできない
  • 作ったjarを複数のサンプルアプリで動かすのが面倒
  • usb-serial-for-androidというgoogle製ライブラリを使うが、リポジトリに含めたくないのでgit submoduleで読み込みたい
などの問題があって、これは継続的にメンテするのが面倒くさそうだし、半年ぶりに更新する時に手順を全部忘れたりしそうだなあと思った。
rubygemみたいに久しぶりにメンテしても普通にリリースできる環境を作りたい。


Eclipseやめてターミナルでantとmakeとemacsで作ることにした。
Eclipseは適当に書いても足りないクラスをimportしてくれたり、アプリの画面をドラッグアンドドロップで作れるけど、ライブラリを作る時には意味ない。


開発環境

MacのターミナルとEmacsでAndroidアプリを作る環境を整える。
橋本商会 » Android開発環境をインストールしなおした
橋本商会 » emacsでAndroidのAPIも入力補完する


フォルダ構成


こんな感じ
├── History.txt
├── LICENSE.txt
├── Makefile (これ重要!)
├── README.md
├── arduino-firmata.jar (リリース版jarファイル)
├── samples (サンプルアプリを入れる場所)
│   └── FirmataSampleApp(サンプルアプリ)
│   ├── AndroidManifest.xml
│   ├── Makefile (これも重要!)
│   ├── libs
│   │   ├── arduino-firmata.jar (実は../../../arduino-firmata.jarへのシンボリックリンク)
│   │   └── usb-serial-for-android-v010.jar (これは実体)
│   └── (略)
├── src
│   ├── com
│   │   └── hoho(make initするとsubmoduleからコピーされてくるが、git ignoreされてる)
│   │   └── android
│   │   └── usbserial
│   └── org
│   └── shokai
│   └── firmata(ライブラリ本体)
│   ├── ArduinoFirmata.java
│   ├── ArduinoFirmataEventHandler.java
│   ├── ArduinoFirmataException.java
│   └── Error.class
└── usb-serial-for-android (git submodule。make initすると最新版をpullしてくる)


arduino-firmata.jarのビルド方法


Android SDKへのクラスパスを通して
% export CLASSPATH=$CLASSPATH:/usr/local/var/lib/android-sdk/platforms/android-13/android.jar
% export LC_ALL=en

ビルドする
% make init
% make

これを実現するMakefile
all: build

init:
cd usb-serial-for-android &&\
git pull origin master &&\
cd ../ &&\
cp -R usb-serial-for-android/UsbSerialLibrary/src/com src/

compile:
cd src &&\
javac org/shokai/firmata/ArduinoFirmataException.java &&\
javac org/shokai/firmata/ArduinoFirmataEventHandler.java &&\
javac org/shokai/firmata/ArduinoFirmata.java

build: compile
cd src &&\
jar cvf arduino-firmata.jar ./org &&\
jar uvf arduino-firmata.jar ../README.md &&\
jar uvf arduino-firmata.jar ../LICENSE.txt &&\
jar uvf arduino-firmata.jar ../History.txt &&\
mv arduino-firmata.jar ../

make initでsubmoduleのusb-serial-for-androidをgoogle codeのgitからpullしてきて、必要なソース(com.hoho.android.usbserial)だけsrcにコピーする。
コピーされたソースコードは.gitignoreに書いてあるのでコミットされない。

make buildでライブラリを全部コンパイルしてjarを作って、READMEやLICENSEを追加してルートディレクトリに置く。
これをgithubのmasterブランチにpushすると、github pagesで作ったArduino Firmata on Androidのページのチュートリアルのところに出るようになってる。


サンプルアプリのビルド方法

samples/FirmataSampleApp/ に移動して、
% make setup
で自分のAndroid開発環境の設定が読み込まれる


% make
% make install
これでサンプルアプリがインストールされる


Makefile
all: clean build
setup:
android update project --path `pwd` --name 'FirmataSample'
build:
ant debug
install:
adb install -r bin/FirmataSample-debug.apk
uninstall:
adb uninstall org.shokai.firmata.sample
logcat:
adb logcat | grep firmata
clean:
/bin/rm -r -f bin/classes

毎回.classファイルを削除してからビルドしている。
ant debugはソースのjavaファイルが更新された時のみ.classファイルに新しくコンパイルしなおすので、
毎回消してやらないとarduino-firmata.jarだけが更新された時に正しくビルドされない。

libsディレクトリにarduino-firmata.jarがあるが、これはルートディレクトリへのシンボリックリンク。
usb-serial-for-android.jarは http://code.google.com/p/usb-serial-for-android/からダウンロードしてきたもの。

antをmakeで使うのはなんかよくわからない気もするが、まあいいや。


更新作業

githubのissueを立てて、要求とおおまかな設計を書く。
ローカルでissue名のブランチを切って、commitメッセージの最後に#7とかissue番号を入れてcommitする。
githubにpushするとissueのページに書き込まれるので進捗が管理しやすい。
機能が完成したらmasterブランチにmergeする。



リリース作業は
History.txtにこれまでのcommitメッセージまとめを書いて、
ArduinoFirmata.javaの定数VERSIONを書き換えてからjarにビルドしなおして、
git tagをうってgithubにpushする。

だいたいこんな感じか。