Android Maven Pluginを入れてMavenでAndroidをビルド
Maven化を進めてきたけど、ビルドしたりapkファイル作ったりはIntelliJ頼りな状態。
一人プロジェクトとかだとそこまで必要性はないかもしれないけどCIツールは導入するつもりだから、もうここでやっちゃえ、ということでMavenでビルドできるようにしておくことにしたメモ。
全部OSX前提。
前提条件
環境変数の設定
ANDROID_HOMEを設定する。コマンドラインでもIDEでも反映されるように/etc/launchd.confに記述する。
ちなみにlaunchd.confはデフォルトでは存在しないので自分で作る。
launchd.confの書式は以下のとおり。
setenv key value
また、bashなどのように変数($PATHとか)が使えないので、PATHに追記、みたいなことはできない。らしい。
こんな感じ?
setenv ANDROID_HOME /path/to/android_sdk_root setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/path/to/android_sdk_root/tools:/path/to/android_sdk_root/platform-tools
このlaunchdってマスタープロセスっぽいので、confの設定がうまくいっているかどうかは再起動以外反映の方法はないらしい。
[ria10@localhost avd]$ ps -ef UID PID PPID C STIME TTY TIME CMD 0 1 0 0 12:46AM ?? 0:00.48 /sbin/launchd 0 11 1 0 12:46AM ?? 0:00.22 /usr/libexec/UserEventAgent (System) 0 12 1 0 12:46AM ?? 0:01.23 /usr/libexec/kextd 0 13 1 0 12:46AM ?? 0:00.33 /usr/libexec/taskgated -s 0 14 1 0 12:46AM ?? 0:00.26 /usr/sbin/notifyd 0 15 1 0 12:46AM ?? 0:00.33 /usr/sbin/securityd -i 0 16 1 0 12:46AM ?? 0:00.08 /usr/sbin/diskarbitrationd 0 17 1 0 12:46AM ?? 0:00.71 /usr/libexec/configd ~snip~
このとおり、OSのプロセスは/sbin/launchdによって起動されているのが確認できる。ひゃー。だから、上記のconfの設定例とか自己責任でね!
ここまでの設定等々がうまくいっているかどうかを確認する方法を提供してくれているので、確認する。
http://code.google.com/p/maven-android-plugin/wiki/Samples
ここでサンプルアプリをダウンロードして、解凍したディレクトリの直下にいくつかアプリがあるので、どれか選んでそのディレクトリの直下で
mvn clean install
してうまくいけばOK。
それぞれのプロジェクトはそれぞれ確認できる内容やレベルが変わってくるので、とにかく完璧な状態を期すなら、一個上のディレクトリでmvn clean installすればいい。くわしくはサンプルアプリのページを読んでちょ。
実際にアプリが動くので、エミュレータか実機がつながってないとコマンドがコケちゃうので要注意。
なんかのパラメータを指定しないと、繋がってるエミュと実機全部で動いてどれかでコケるとエラー、SDKのインストールが足りてなくてもエラー(2.2未満なんか普通入れてない)、テストが走るときにアプリが勝手に起動して、勝手にフォーム入力とかし始めるけど、それを邪魔してもエラー、画面にロックがかかってもエラー。もうキルアみたいな感じだから。
あと、エラーログで"This command should give you all you need: tools/android update sdk --no-ui --obsolete --force"的なのが出てきたかもしれないけど、これ打つとありとあらゆるバージョンのSDKを入れてくれるという大盤振る舞いなコマンドなんで要注意してください。
っていうか、Android1.x系の動作確認までしろだって?わけがわからないよ。
まあ、全部通さなくてもそこそこ通った感があればいいんじゃないかと思いますけど。全部通そうとすると、NativeDevelopmentKitのテストまでさせられるし。
Androidアプリを手動で作る
公式サイトには、お手軽に作れる風な方法も載ってたけど、今回は手動での方法で挑戦することにした。
pom.xmlの作成
作成とちょびっと編集はIntelliJのandroidプロジェクトを途中からmaven管理しようとした時のメモですでにやってある。
対応Androidバージョンの指定
dependencyに記述。わしゃGBから。
<dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency>
ちなみに2.3.3とかを設定するにはセントラルリポジトリにないAndroidライブラリはMaven Android SDK Deployerでインストールの手順を踏んでないと通らないので注意。
追記)別にこの部分なくてもビルド通った。。
いらないフィアルを消す
rm -r bin build.xml build.properties libs
って書いてあるけど、binとbuild.propertiesはないのでlibsとbuild.xmlだけ消しといた。
依存関係の追加
よしなに。
実行
mvn clean install
以上。
うまくいかないときは、構成をどんどんシンプルにしていって、つまづく場所を特定するべし。
・・・あれっ?maven-android-pluginっていう何かをインストールするとかじゃないの?環境変数設定するだけじゃない。なんだかよくわからないな。。
追記)このときはまだ、あんなことになるなんて思ってもいなかったんだ。。
IntelliJだとmavenでActionBarSherlockの依存関係を解決できないっぽい。
外部ライブラリプロジェクトを使ったプロジェクトをIntelliJとMavenで両立させる
IntelliJだとmavenでActionBarSherlockの依存関係を解決できないっぽい。
pom.xml
~snip~ <modules> <module>../ActionBarSherlock-4.2.0/library</module> </modules> ~snip~ <dependency> <groupId>com.actionbarsherlock</groupId> <artifactId>library</artifactId> <version>4.2.0</version> <type>apklib</type> </dependency> ~snip~
で、コマンドラインからのビルドは通るけど、IntelliJでコンパイルエラーがでる。
で、こんなのを見つけた
http://youtrack.jetbrains.com/issue/IDEA-90325
バグっていうか未実装っていうか、とにかくIntelliJがダメっぽい。ここでは「Internal buid modeを使う(External Buildのチェックを外すってこと?)」でお茶を濁しているけど、External Buildのチェックを外したらもっとダメになった。
だから、外部ライブラリだけは手動でIntelliJ依存の設定をしている。つまり解決方法見いだせなかった系エントリ。
IntelliJ12では解決されない風だなぁ・・・。
追記)これの副作用なんだろうか。pom.xmlを編集すると、Source Folderの位置がsrc/main/javaからsrcに勝手に戻り、(IntelliJの)Dependenciesに追加しておいたABSモジュールが勝手に消される、という。。。毎回手動で戻さなければいけないという。。。IntelliJ・・・。
追記の追記)↑これはこのぼくがそういう設定をpomにしていたからだった。。。っていうか丸1日以上、ずっとpomと格闘してるよ。。。時間ないのに。。。もう死にたい。
追記の追記の追記)ちゃんと読んでないし、試してないけど、できるのかな?
http://www.ashokgelal.com/2012/12/setting-up-intellij-idea-12-with-maven-actionbarsherlock-roboelectric-androidannotations/
あとで試す。