2010-10-31 Android プロジェクトを maven で倒す

_ はじめに

デ部宴会で @vvakame さんや @hidecheck さんとandroid プロジェクトの mavenize に挑戦したのでまとめです。

参考

http://code.google.com/p/maven-android-plugin/wiki/GettingStarted

http://code.google.com/a/eclipselabs.org/p/m2eclipse-android-integration/wiki/GettingStarted

11/1追記「settings.xml に署名のための設定を追加する」を書き忘れていたので追加しました。

前提

Mac 上での開発を想定しています。Windows や Linux でも同じようにできると思いますが、やり方はそれぞれの環境で違うので適宜読み替えてください。

すでに eclipse を用いて android の開発が行えていることを前提とします。開発環境を構築する部分は記述しないので、 http://developer.android.com/sdk/index.html を見るなりググるなりして環境を作ってください。

_ 一度だけすればいいこと

maven を準備する。

とりあえず省略。こんな感じで使えてればOK。 maven-3.0 でもたぶんいけます。

$ mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.6.0_22
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x" version: "10.6.4" arch: "x86_64" Family: "mac"

環境変数 ANDROID_HOME に android SDK のパスをセットする。

例: ~/.bash_profile に export ANDROID_HOME=/Applications/android-sdk-mac_x86

補足: この環境変数は、 pom.xml から Android SDK のパスを取得するために参照します。コマンドラインから mvn コマンドを実行する場合はshell の環境変数に含まれていること。また、後ほど eclipse を使う場合は eclipse の環境変数に ANDROID_HOME がセットされている必要があります。よくわからない場合は一度ログアウトしてみましょう。

(11/1追記)settings.xml に署名のための設定を追加する

後で作成する pom.xml の署名を行う部分が参照する、キーストアの場所やパスワードなどの情報を設定します。

~/.m2/settings.xml の /settings/profiles の下に、プロファイルとして追加します。署名用の設定なので、 sign プロファイルがアクティブになったときに有効になるようにしておきます。

追加するプロファイルでは、以下のプロパティを定義します。

keystore
キーストアのpath。プロジェクトからの相対パスも書けますが、絶対パスでの指定がおすすめ。例: /Users/zaki/android/dev.keystore
storepass
キーストアを読み込むためのパスワード。例: hogehoge
alias
キーストアに含まれるキーのエイリアス名。例: dev
keypass
キーを読み込むためのパスワード。例: hogehoge

settings.xml の例

<settings>

        :
        :

  <profiles>

        :
        :

    <profile>
      <id>sign</id>
      <properties>
        <keystore>/Users/zaki/android/dev.keystore</keystore>
        <storepass>hogehoge</storepass>
        <alias>dev</alias>
        <keypass>hogehoge</keypass>
      </properties>
    </profile>
  <profiles>
</settings>

tools に PATH を通す

例: ~/.bash_profile に export PATH="${ANDROID_HOME}/tools:${PATH}"

android コマンドのヘルプが見えるはずです。

$ android -h

Usage:
  android [global options] action [action options]

(以下略)

eclipse プラグインのインストール

以下の2つのプラグインをインストールします。

  • m2eclipse

UpdateSite: http://m2eclipse.sonatype.org/sites/m2e

  • m2eclipse-android-integration

UpdateSite: http://m2eclipse-android-integration.googlecode.com/svn/trunk/com.byluroid.eclipse.maven.android.update/

_ プロジェクト作成のたびにすること

コマンドラインからプロジェクトを作る。

$ android create project --target 4 --name FirstMavenAndroid --path FirstMavenAndroid --activity FirstMavenAndroidActivity --package org.zakky.firstmaven
Created project directory: FirstMavenAndroid
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/src/org/zakky/firstmaven
Added file FirstMavenAndroid/src/org/zakky/firstmaven/FirstMavenAndroidActivity.java
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/res
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/bin
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/libs
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/res/values
Added file FirstMavenAndroid/res/values/strings.xml
Created directory /Users/zaki/fromsvn/zaki_on_issofty1/android/FirstMavenAndroid/res/layout
Added file FirstMavenAndroid/res/layout/main.xml
Added file FirstMavenAndroid/AndroidManifest.xml
Added file FirstMavenAndroid/build.xml

不要なディレクトリ/ファイルを削除する

作成されたディレクトリ(上の例だと FirstMavenAndroid)の中にある不要なものを削除します。

$ cd FirstMavenANdroid
$ rm -rf bin libs build.xml build.properties

pom.xml を置く。

以下の部分を修正した pom.xml を置きます。

  • groupId を自分用に。プロジェクト作成時の --package の値とか。
  • artifactId も自分用に。
  • プロジェクト作成で指定した target に応じて dependency の com.google.android:android の version を修正
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>
        <groupId>org.zakky.firstmaven</groupId>
        <artifactId>firstmaven</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>apk</packaging>

        <repositories>
                <repository>
                        <id>local</id>
                        <name>Local Repository</name>
                        <url>file://${basedir}/m2repo</url>
                </repository>
        </repositories>
        <dependencies>
                <dependency>
                        <groupId>com.google.android</groupId>
                        <artifactId>android</artifactId>
                        <version>1.6_r2</version>
<!--
                        <version>1.5_r3</version>
                        <version>1.5_r4</version>
                        <version>2.1_r1</version>
                        <version>2.1.2</version>
                        <version>2.2.1</version>
-->
                        <scope>provided</scope>
                </dependency>
        </dependencies>

        <build>
                <sourceDirectory>src</sourceDirectory>
                <plugins>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-compiler-plugin</artifactId>
                                <configuration>
                                        <source>1.6</source>
                                        <target>1.6</target>
                                </configuration>
                        </plugin>
                        <plugin>
                                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                                <artifactId>maven-android-plugin</artifactId>
                                <configuration>
                                        <sdk>
                                                <path>${env.ANDROID_HOME}</path>
                                                <platform>1.6</platform>
                                        </sdk>
                                        <deleteConflictingFiles>true</deleteConflictingFiles>
                                </configuration>
                                <extensions>true</extensions>
                        </plugin>
                </plugins>
        </build>

        <profiles>
                <profile>
                        <id>dev</id>
                        <activation>
                                <activeByDefault>true</activeByDefault>
                                <property>
                                        <name>env</name>
                                        <value>dev</value>
                                </property>
                        </activation>
                        <properties>
                                <maven.test.skip>true</maven.test.skip>
                                <distribution.file>distribution.xml</distribution.file>
                        </properties>
                </profile>
                <profile>
                        <id>sign</id>
                        <build>
                                <plugins>
                                        <plugin>
                                                <groupId>org.apache.maven.plugins</groupId>
                                                <artifactId>maven-jarsigner-plugin</artifactId>
                                                <version>1.2</version>
                                                <executions>
                                                        <execution>
                                                                <id>signing</id>
                                                                <goals>
                                                                        <goal>sign</goal>
                                                                </goals>
                                                                <phase>package</phase>
                                                                <inherited>true</inherited>
                                                                <configuration>
                                                                        <archiveDirectory></archiveDirectory>
                                                                        <includes>
                                                                                <include>target/*.apk</include>
                                                                        </includes>
                                                                        <keystore>${keystore}</keystore>
                                                                        <storepass>${storepass}</storepass>
                                                                        <keypass>${keypass}</keypass>
                                                                        <alias>${alias}</alias>
                                                                </configuration>
                                                        </execution>
                                                </executions>
                                        </plugin>
                                        <plugin>
                                                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                                                <artifactId>maven-android-plugin</artifactId>
                                                <inherited>true</inherited>
                                                <configuration>
                                                        <sign>
                                                                <debug>false</debug>
                                                        </sign>
                                                </configuration>
                                        </plugin>
                                </plugins>
                        </build>
                </profile>
        </profiles>
</project>

apk 作成(署名無し)

普通の maven の場合と同じです。

$ mvn clean package install

apk 作成(署名有り)

sign プロファイルをアクティブにすると署名をします。

$ mvn clean package install -Psign

apk の device install

apk 作成が成功したら、以下のコマンドでインストール出来ます。インストールは target ディレクトリの下にあるファイルが対象です。

$ mvn com.jayway.maven.plugins.android.generation2:maven-android-plugin:deploy

署名無しのものが device にインストールされている時に署名有りを入れようとするとエラーになるようなので、その場合は一旦 device から手動で削除します。

_ eclipse へのインポート

File メニュー -> Import... を選択して、開いたダイアログから Maven -> Existing Maven Projects を選択し、pom.xml を置いたディレクトリを指定してインポート実行。しばらくするとインポート完了します。 もしエラーが出るようなら、 プロジェクトを右クリックして Maven -> Update Project Configuration とかプロジェクトの clean とかを試してください。

_ TODO

  • 既存プロジェクトの Mavenize
  • テストプロジェクトの Mavenize
  • Maven の archtype 対応

«前の日記(2010-08-23) 最新