ログイン
編集不可のページディスカッション情報添付ファイル
"alstamber/AndroidDevelopment/PragmaticDevelopmentEnvironment"の差分

MMA
4と5のリビジョン間の差分
2013-03-30 13:28:18時点のリビジョン4
サイズ: 15259
編集者: alstamber
コメント:
2013-03-30 13:58:26時点のリビジョン5
サイズ: 15339
編集者: alstamber
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 357: 行 357:

== android-bindingを使ってみる ==
  * [[../AndroidBinding|こちら]]

なにこれ

  • Android向け実用的開発環境を構築するプラクティス
  • 色々調べてみてよさそうなものを組み合わせてみた

前提

  • IDEにIntelliJ使う
  • mavenを使った自動依存関係解決
  • mavenを使ったビルド管理
  • テストしやすい開発手法
    • 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に書いておけばあとはなんとかしてくれる
  • まずは基本的記述

   1 <groupId>(開発するアプリのパッケージ名)</groupId>
   2 <artifactId>(一意なID)</artifactId>
   3 <version>(バージョン)</version>
   4 <packaging>apk</packaging>
   5 <name>(名前)</name>
  • 続いて依存するライブラリについての記述
    • 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開発をするためのヘルパー

<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>
  • デフォルトプラグインの設定は次のサイトを参考にした

<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>
                </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>
  • 続いて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はダメ!

android-bindingを使ってみる

alstamber/AndroidDevelopment/PragmaticDevelopmentEnvironment (最終更新日時 2013-03-30 22:29:59 更新者 alstamber)