サイズ: 15339
コメント:
|
サイズ: 16555
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 193: | 行 193: |
<sdk> <platform>13</platform> </sdk> |
|
行 231: | 行 234: |
</resource> </resources> </build> </profile> }}} * 続いてproductionプロファイル {{{ <profile> <id>production</id> <properties> <deployment.stage>In Production</deployment.stage> </properties> <build> <resources> <resource> <directory>src/main/resources.production</directory> |
|
行 358: | 行 378: |
=== プロファイルごとのリソースxmlを用意する === * src/main/resources.developmentとsrc/main/resources.productionディレクトリを作る * それぞれの配下にenvironment.xmlを作って次のように記述する {{{ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="profile">development</entry> </properties> }}} {{{ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="profile">production</entry> </properties> }}} |
なにこれ
- Android向け実用的開発環境を構築するプラクティス
- 色々調べてみてよさそうなものを組み合わせてみた
前提
- IDEにIntelliJ使う
- mavenを使った自動依存関係解決
- mavenを使ったビルド管理
- テストしやすい開発手法
- MVVCで開発できるようにする
WindowsPhoneで採用されている手法
- モックを挿入しやすいようにフレームワークを導入
- モックとはネットワークからの応答など自分だけではテストできないようなものをエミュレートするためのもの
- MVVCで開発できるようにする
- 結合テストもしやすくしたいね
プロジェクトの生成
- 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に書いておけばあとはなんとかしてくれる
- まずは基本的記述
- 続いて依存するライブラリについての記述
- 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
- 4.2を使いたいときはgit://github.com/mosabua/maven-android-sdk-deployer.gitからクローンしてmvn installする
- junitは単体テストをするためのライブラリ
- mockitoはモック挿入を容易にするためのライブラリ
- roboguiceはDependency Injectionを容易にするためのライブラリ
- mockitoを使うため
- android-bindingはMVVC開発をするためのヘルパー
- groupIdがcom.google.androidになっているものについてはversionを${platform.version}にしたほうがいいかもしれない
<dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>4.1.1.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.google.android</groupId> <artifactId>android-test</artifactId> <version>4.1.1.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>org.roboguice</groupId> <artifactId>roboguice</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>gueei</groupId> <artifactId>android-binding</artifactId> <version>v30-0.52</version> </dependency> </dependencies>
プロファイルを使ったビルド設定の切り替え
- mavenではプロファイルというものを使ってビルド環境を切り替えることができる。
- プロファイルは次のように記述する
<profiles> <profile> <id><プロファイルの ID></id> <activation> <プロファイルが有効化する条件> </activation> <このプロファイルでの設定> </profile> <profile> ... </profile> </profiles>
- プロファイルを有効にするには次のようにmavenを実行すれば良い
- プロファイルhogeとfugaを有効にした例
mvn -P hoge,fuga
- activationに次のように記述すると他のプロファイルが有効ではないときに勝手に有効になる
- 例えばdevelopmentプロファイルとreleaseプロファイルがあって、普段はdevelopmentプロファイルを使うという時に使う
<activeByDefault>true</activeByDefault>
プラグイン
- mavenではプラグインを使ってビルド設定を拡張できる
- 例えばmavenではデフォルトでAndroidのビルドはできないがプラグインを使うことでできるようになる
<build> ... <plugins> ... <plugin> <groupId>プラグインのgroupId</groupId> <artifactId>プラグインのartifactId</artifactId> <version>プラグインのバージョン</version> <configuration> プラグインに渡すパラメータ </configuration> </plugin> ... </plugins> ... </build>
- デフォルトプラグインという形でプラグインの定義だけを書いておいて、後でプロファイルにプラグインに渡すパラメータを決めることもできる。
<build> <pluginManager> <plugins> <plugin> <groupId>デフォルトプラグインのgroupId</groupId> <artifactId>デフォルトのartifactId</artifactId> <version>デフォルトのバージョン</version> </plugin> ... </plugins> </pluginManager> </build>
- デフォルトプラグインの設定は次のサイトを参考にした
https://github.com/koduki/Android-Development-Suite にあるpom.xml
- それぞれ署名をするプラグイン、Androidのビルドをするためのプラグインという認識でよいのだろうか
<pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jarsigner-plugin</artifactId> <version>1.2</version> </plugin> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.4.0</version> </plugin> </plugins> </pluginManagement>
- android-maven-pluginについてはすべてのプロファイルで共通の設定を書いておく
<build></build>配下に記述
<plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <extensions>true</extensions> <configuration> <manifest> <debuggable>true</debuggable> </manifest> <sdk> <platform>13</platform> </sdk> </configuration> <executions> <execution> <id>manifestUpdate</id> <phase>process-resources</phase> <goals> <goal>manifest-update</goal> </goals> </execution> <execution> <id>alignApk</id> <phase>package</phase> <goals> <goal>zipalign</goal> </goals> </execution> </executions> </plugin> </plugins>
- プロファイルの設定も先ほどのpom.xmlを参考に記述
- まずdevelopmentプロファイル
<resources><resource><directory>……の部分はなんとなくわかるが、プロファイルごとにリソースのxmlを切り替えられるようになっているようだ
- リソースのxmlを切り替えることでモックを挿入するか実データを使用するかという部分が分かれるようにする
<profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <deployment.stage>In Development</deployment.stage> </properties> <build> <resources> <resource> <directory>src/main/resources.development</directory> </resource> </resources> </build> </profile>
- 続いてproductionプロファイル
<profile> <id>production</id> <properties> <deployment.stage>In Production</deployment.stage> </properties> <build> <resources> <resource> <directory>src/main/resources.production</directory> </resource> </resources> </build> </profile>
- 続いてreleaseプロファイル
- ただしProguardを使うつもりがないのでその部分の記述はカットした
<profile> <id>release</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <resources> <resource> <directory>src/main/resources.production</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jarsigner-plugin</artifactId> <executions> <execution> <id>signing</id> <goals> <goal>sign</goal> <goal>verify</goal> </goals> <phase>package</phase> <inherited>true</inherited> <configuration> <removeExistingSignatures>true</removeExistingSignatures> <archiveDirectory/> <includes> <include>${project.build.directory}/${project.artifactId}.apk</include> </includes> <keystore>${sign.keystore}</keystore> <alias>${sign.alias}</alias> <storepass>${sign.storepass}</storepass> <keypass>${sign.keypass}</keypass> <verbose>true</verbose> </configuration> </execution> </executions> </plugin> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <inherited>true</inherited> <configuration> <sign> <debug>false</debug> </sign> <zipalign> <verbose>true</verbose> <inputApk>${project.build.directory}/${project.artifactId}.apk</inputApk> <outputApk>${project.build.directory}/${project.artifactId}-signed-aligned.apk </outputApk> </zipalign> <manifest> <debuggable>false</debuggable> <versionCodeAutoIncrement>true</versionCodeAutoIncrement> </manifest> <proguard> <skip>true</skip> </proguard> </configuration> <executions> <execution> <id>manifestUpdate</id> <phase>process-resources</phase> <goals> <goal>manifest-update</goal> </goals> </execution> <execution> <id>alignApk</id> <phase>package</phase> <goals> <goal>zipalign</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile>
署名鍵の設定
AndroidのapkをPlayStoreにアップできるようにするためには署名をする必要がある
- 最近のAndroidはそもそも署名されていないとインストールすら出来ないようなので、野良アプリでもこれは必要だろう
- 署名鍵については~/.m2/settings.xmlに記述する
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <profiles> <profile> <id>android</id> <properties> <android.sdk.path>(SDKのパス)</android.sdk.path> <sign.keystore>(keystoreのパス)</sign.keystore> <sign.alias>(keyのalias)</sign.alias> <sign.storepass>(keystoreのパス)</sign.storepass> <sign.keypass>(keyのパス)</sign.keypass> </properties> </profile> </profiles> <activeProfiles> <activeProfile>android</activeProfile> </activeProfiles> </settings>
- ちなみに署名鍵はkeytoolを使って生成する。JDK1.6系のkeytoolでないとAndroidで使える署名鍵が作れないので注意
- 1.7はダメ!
プロファイルごとのリソースxmlを用意する
- src/main/resources.developmentとsrc/main/resources.productionディレクトリを作る
- それぞれの配下にenvironment.xmlを作って次のように記述する
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="profile">development</entry> </properties>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="profile">production</entry> </properties>