#acl alstamber:read,write,revert,delete,admin All:read
== なにこれ ==
* Android向け実用的開発環境を構築するプラクティス
* 色々調べてみてよさそうなものを組み合わせてみた
== 前提 ==
* IDEにIntelliJ使う
* mavenを使った自動依存関係解決
* mavenを使ったビルド管理
* テストしやすい開発手法
* MVVCで開発できるようにする
* WindowsPhoneで採用されている手法
* と思ってたけど、Androidとの相性は良くないような
* android-bindingの使い勝手がそれほど良くない
* ModelとModel以外ぐらいに考えたほうがいいかも
* モックを挿入しやすいようにフレームワークを導入
* モックとはネットワークからの応答など自分だけではテストできないようなものをエミュレートするためのもの
* 結合テストもしやすくしたいね
== プロジェクトの生成 ==
* IntelliJを起動して、JDKとAndroid SDKの設定をしておく
* JDKは1.6系がよい
* Android SDKを設定するとプロジェクトの作成ウィザードからAndroidのプロジェクトが生成できるようになるので、それを使って生成する
* プロジェクトの下に自動的にAndroidのModuleがぶら下がったものが生成される
== プロジェクトのmavenize ==
* 生成したプロジェクトはmavenで管理できない状態になっているので、maven管理下に置く
* 生成されたAndroidのModuleを右クリックして「Add Framework Support...」からmavenを選択する
* ディレクトリ構造がmaven向けに変更され、pom.xmlが自動的に生成される
== pom.xmlの記述 ==
=== 基本的記述と依存解決 ===
* ビルドするときの設定や依存するライブラリについてはすべてpom.xmlに書く
* xmlに書いておけばあとはなんとかしてくれる
* まずは基本的記述
{{{#!highlight html
(開発するアプリのパッケージ名)
(一意なID)
(バージョン)
apk
(名前)
}}}
* 続いて依存するライブラリについての記述
* groupIdがcom.google.androidになっているものについてはversionを${platform.version}にしたほうがいいかもしれない
* アプリの開発対象となるAndroidのバージョンに依存するから
* ちなみにこれらはAndroid開発をするために必要となるライブラリである(android.jar)
* 今のところ4.1までしかmavenのセントラルリポジトリにないみたい
* 4.2を使いたいときはgit://github.com/mosabua/maven-android-sdk-deployer.gitからクローンしてmvn installする
* 要Android SDK4.2
* junitは単体テストをするためのライブラリ
* mockitoはモック挿入を容易にするためのライブラリ
* roboguiceはDependency Injectionを容易にするためのライブラリ
* mockitoを使うため
* android-bindingはMVVC開発をするためのヘルパー
{{{
com.google.android
android
4.1.1.4
provided
com.google.android
android-test
4.1.1.4
provided
junit
junit
3.8.2
test
org.mockito
mockito-all
1.9.5
org.roboguice
roboguice
2.0
gueei
android-binding
v30-0.52
}}}
=== プロファイルを使ったビルド設定の切り替え ===
* mavenではプロファイルというものを使ってビルド環境を切り替えることができる。
* プロファイルは次のように記述する
{{{
<プロファイルの ID>
<プロファイルが有効化する条件>
<このプロファイルでの設定>
...
}}}
* プロファイルを有効にするには次のようにmavenを実行すれば良い
* プロファイルhogeとfugaを有効にした例
{{{
mvn -P hoge,fuga
}}}
* activationに次のように記述すると他のプロファイルが有効ではないときに勝手に有効になる
* 例えばdevelopmentプロファイルとreleaseプロファイルがあって、普段はdevelopmentプロファイルを使うという時に使う
{{{
true
}}}
=== プラグイン ===
* mavenではプラグインを使ってビルド設定を拡張できる
* 例えばmavenではデフォルトでAndroidのビルドはできないがプラグインを使うことでできるようになる
{{{
...
...
プラグインのgroupId
プラグインのartifactId
プラグインのバージョン
プラグインに渡すパラメータ
...
...
}}}
* デフォルトプラグインという形でプラグインの定義だけを書いておいて、後でプロファイルにプラグインに渡すパラメータを決めることもできる。
{{{
デフォルトプラグインのgroupId
デフォルトのartifactId
デフォルトのバージョン
...
}}}
* デフォルトプラグインの設定は次のサイトを参考にした
* https://github.com/koduki/Android-Development-Suite にあるpom.xml
* それぞれ署名をするプラグイン、Androidのビルドをするためのプラグインという認識でよいのだろうか
{{{
org.apache.maven.plugins
maven-jarsigner-plugin
1.2
com.jayway.maven.plugins.android.generation2
android-maven-plugin
3.4.0
}}}
* android-maven-pluginについてはすべてのプロファイルで共通の設定を書いておく
* 配下に記述
{{{
com.jayway.maven.plugins.android.generation2
android-maven-plugin
true
true
13
manifestUpdate
process-resources
manifest-update
alignApk
package
zipalign
}}}
* プロファイルの設定も先ほどのpom.xmlを参考に記述
* まずdevelopmentプロファイル
* ……の部分はなんとなくわかるが、プロファイルごとにリソースのxmlを切り替えられるようになっているようだ
* リソースのxmlを切り替えることでモックを挿入するか実データを使用するかという部分が分かれるようにする
{{{
development
true
In Development
src/main/resources.development
}}}
* 続いてproductionプロファイル
{{{
production
In Production
src/main/resources.production
}}}
* 続いてreleaseプロファイル
* ただしProguardを使うつもりがないのでその部分の記述はカットした
{{{
release
performRelease
true
src/main/resources.production
org.apache.maven.plugins
maven-jarsigner-plugin
signing
sign
verify
package
true
true
${project.build.directory}/${project.artifactId}.apk
${sign.keystore}
${sign.alias}
${sign.storepass}
${sign.keypass}
true
com.jayway.maven.plugins.android.generation2
android-maven-plugin
true
false
true
${project.build.directory}/${project.artifactId}.apk
${project.build.directory}/${project.artifactId}-signed-aligned.apk
false
true
true
manifestUpdate
process-resources
manifest-update
alignApk
package
zipalign
}}}
=== 署名鍵の設定 ===
* AndroidのapkをPlayStoreにアップできるようにするためには署名をする必要がある
* 最近のAndroidはそもそも署名されていないとインストールすら出来ないようなので、野良アプリでもこれは必要だろう
* 署名鍵については~/.m2/settings.xmlに記述する
{{{
android
(SDKのパス)
(keystoreのパス)
(keyのalias)
(keystoreのパス)
(keyのパス)
android
}}}
* ちなみに署名鍵はkeytoolを使って生成する。JDK1.6系のkeytoolでないとAndroidで使える署名鍵が作れないので注意
* 1.7はダメ!
=== プロファイルごとのリソースxmlを用意する ===
* src/main/resources.developmentとsrc/main/resources.productionディレクトリを作る
* それぞれの配下にenvironment.xmlを作って次のように記述する
{{{
development
}}}
{{{
production
}}}
== android-bindingを使ってみる ==
* [[../AndroidBinding|こちら]]
* 鳴り物入りで導入してみたが、あまり使い勝手が良くない
* ちょっと込み入ったことをしようとすると結局ViewModelにバインドされているオブジェクトを叩くだけではうまく行かなくなる
* ViewにMessageパターンを使ってUI更新処理をデリゲートする必要が出てくる
* 例を挙げるとEditTextの一番前にカーソルを移動したいとき、WPFなら以下のようにViewModelに書けば良いのでViewへの参照を持たなくていい
{{{#!highlight csharp
TextBox.Select(0,0)
}}}
* android-bindingだと該当のメソッドがないためViewに対して処理を投げないといけない
* EditTextの選択範囲なんていうのはEditTextの立派な属性なんだから、それがViewModelを操作することでViewに反映されるWPFの実装は極めて自然だしそうするべきだろう
* コードが煩雑になるような……?
* このようなことを繰り返しているとViewとViewModelの結合性が高くなってしまいなんのために分けたのかよくわからなくなる
* UIオブジェクトに対する操作をほぼ完璧にViewModelで処理できるようになればだいぶ良くなる気がするが、今の段階ではViewModelでできる処理が割と限られている
* AndroidにおいてはMVCモデルで開発するほうがいいんじゃないかという気がしますな
* あるいはもうちょっとMVVMによってMVPモデルあたり