mavenによるAndroidプロジェクトのProfile設定

Posted on 2011-10-11 by arikui

初めまして、arikuiと言います。先月くらいからAndroid向けアプリ開発を担当しています。
今回はAndroid開発において環境に依存するリソースの切り替え方法、中でもmavenのプロファイルについて書きたいと思います。

使用した開発環境

  • maven2
  • maven-android-plugin 2.8.4
  • android SDK 2.2
  • (Eclipse 3.6 Helios)

私の環境ではmavenを使用してAndroid開発をしているので、やや限定された環境向けの記事かもしれません。
まだ私自身あれこれ試行錯誤している部分もあるので、他にもっといい方法があるかもしれませんがそこはご了承ください。

maven-android-pluginの設定

弊社では、mavenで設定を切り替える場合にはpom.xmlやprofiles.xml、settings.xmlでプロファイルごとにリソースディレクトリを変数定義して切り替える方法をよく採用しています。
Androidプロジェクトではリソースはresディレクトリ以下に配置していきます。Androidプロジェクトにおけるリソースとは、コード以外の全てのファイルであり、リソースの種類によってディレクトリが決まっています。
Resource Types

このresディレクトリを切り替えればいいわけです。
そのためにmaven-android-pluginの要素の子要素として、以下が用意されています。

resourceDirectory
リソースを配置するディレクトリ。デフォルトは${project.basedir}/res
resourceOverlayDirectory
リソースディレクトリに上書きする差分ディレクトリ。デフォルトは${project.basedir}/res-overlay
同じ名前のファイルがあれば上書きし、違う名前のファイルがあればコピーする。差分だけを置けばよい。
resourceOverlayDirectories
上書きするディレクトリを

要素で複数設定可能。こちらを設定した場合、要素は無視される。
同じ名前が競合した場合は、先に設定した方が優先される。

その他の要素は以下を参照してください。
android-maven-plugin

要素で設定したディレクトリには全てのプロファイルで共通のリソースを入れておきます。そしてもしくは要素で設定したディレクトリにはプロファイルごとに異なるリソースを入れます。

設定例

実際に設定したpom.xml

<plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>maven-android-plugin</artifactId>
    <version>2.8.4</version>
    <configuration>
        <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
        <assetsDirectory>${project.basedir}/src/main/android/assets</assetsDirectory>
        <resourceDirectory>${project.basedir}/src/main/android/res</resourceDirectory>
        <resourceOverlayDirectory>${profileResources}</resourceOverlayDirectory>
        <sdk>
            <path>${env.ANDROID_HOME}</path>
            <platform>8</platform>
        </sdk>
        <deleteConflictingFiles>true</deleteConflictingFiles>
        <undeployBeforeDeploy>true</undeployBeforeDeploy>
    </configuration>
    <extensions>true</extensions>
</plugin>
<profile>
    <id>profile1</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <profileResources>${project.basedir}/src/main/profiles/profile1/res</profileResources>
    </properties>
</profile>
<profile>
    <id>profile2</id>
    <properties>
        <profileResources>${project.basedir}/src/main/profiles/profile2/res</profileResources>
    </properties>
</profile>

この設定では、${project.basedir}/src/main/android以下にassetsディレクトリとresディレクトリを置いて、${project.basedir}/src/main/profiles以下にあるプロファイルごとの設定でresを上書きしています。

例えば以下のようなディレクトリ構成だったとして、XML設定ファイルを環境ごとに切り替える場合を考えてみます。

resourceDirectory(上の設定例では${project.basedir}/src/main/android/res)にはデフォルトでdrawable-hdpi、drawable-ldpi、drawable-mdpi、layout、valuesが作られています。そこにさらにXMLディレクトリを追加しました。
そしてresourceOverlayDirectory(上の設定例では${project.basedir}/src/main/profiles以下のres)にはXMLディレクトリだけを作成しました。
今回はresourceDirectoryにはsample01.xml、sample02.xmlの2ファイル、resourceOverlayDirectoryにはsample02.xml、sample03.xmlの2ファイルを配置しました。コンパイル後、sample02.xmlが上書きされ、sample03.xmlがコピーされるはずです。

なおresourceDirectoryディレクトリを直接切り替えることも可能ですが、その場合は全てのプロファイルに全てのリソースを持たないといけないため、プロファイルで異なる差分部分だけをresourceOverlayDirectoryで上書きします。

結合

それではコンパイルしてみましょう。以下のコマンドで各プロファイルに対応したapkを作成します。

$ mvn clean install -P プロファイル名

コンパイルが無事終わると、リソースはapkファイルに固められます。この時、XMLファイルはAndroid XML Binary形式に変換されるので注意してください(CLASSファイルもDalvik VM用にdex形式に変換される)。
apkはただのzipファイルなのでアーカイバで中を見ることが出来ます。中を見てみましょう。

正しく結合されました。

res以下にvaluesが見当たりませんが、resources.arscに格納されています。
ちなみにvaluesとは別にvalues-jpやvalues-enなどvalues-xx形式で言語別の設定をすることも出来ます。xxにはISO 639-1に定義されているものが使えます。
Codes for the Representation of Names of Languages


Tags

Android maven