GradleとAndroid | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

こんにちは、中村です。
今回はGradleとAndroidのお話をしたいと思います。

さて、Android Studio、Android開発者の間では話題になってますよね。
ゆんぼうの記事にも概要やインストール方法などが載ってるので、その部分はそちらを参照してください。

正直私は見た目があんまり好みじゃなくてEclipseを使い続けてたんですが、Gradleの魅力を知ってからAndroid Studioにも慣れとかなきゃいけないかなあという気持ちになっております。
というのは、Gradleのandroidプラグインの中にProduct flavorsという機能がありまして、その機能をフルに使うためにはやっぱりEclipseだと限界があるのかなと思い始めまして。

いきなりGradleやらProduct flavorsやら、あんまり聞かない単語が続いたと思うので、ここでこの2つの技術を簡単に説明したいと思います。
  • Gradle
  • 簡単に言うと、Antの発展版というところでしょうか。
    中身の設定ファイル(build.gradle)をGroovyというプログラム言語で書けるので、設定ファイルをXMLで書くAntよりも柔軟なことが簡単にできちゃいます。
  • Product flavors
  • 上に書いたように、gradleのandroidプラグインが提供する機能の1つです。
    一言で言うと、同じようなアプリでリソースや実装の違いを同じプロジェクト配下で管理できる方法を提供する機能ということになります。
    例えば無料版と有料版で、広告の有無のようなリソースの差分、有料版で機能を豊富にするためのソースコードを切り替える場合です。
    従来だと、プロジェクトを分けたりバージョン管理上のブランチで管理したりといった煩雑な方法でしか管理ができませんでした。
    それを1つのプロジェクト内でビルドするソースコードやリソースを切り替える機能を提供し、煩雑な管理を省いてくれるのがProduct flavorsです。
と。説明はここまでにして、ここからはEclipseで作ったプロジェクトをAndroid StudioにインポートしてProduct flavorsで複数のapkファイルをビルドして動かすまでの手順を書いていきたいと思います。
今回使ったツールのバージョンは以下のようになります。
  • Eclipse: Kepler
  • Android Studio: 0.4.0
  • JDK: OracleJDK 1.6.0 u37 64bit
  • Android SDK: 22.3
  • Gradle: 1.9
  • Gradle Android plugin: 0.7

まずは[android_sample]という名前でEclipseで簡単なプロジェクトを作成します。



このプロジェクトをAndroid Studioでインポートします。


インポートの結果はプロジェクト直下にできた[import-summary.txt]に書かれています。
ここに書かれている通り、プロジェクト配下のディレクトリ構成やAndroid Manifest.xmlの場所が変更になってますね。
それと、ビルドシステムがGradleベースになってるので、[build.gradle]などのgradleのビルドに必要なファイルが配置されています。

さて、ここからはProduct flavorsを使い始めてみようと思います。
まずは[app/build.gradle]のandroid配下を編集してFlavorを追加します。
ここでは[pro]版と[free]版を用意して、ついでにそれぞれのパッケージ名を変えて2つのアプリが1つのデバイス中で共存できるようにしてみます。
このパッケージ名はAndroidManifest.xmlに書かれるもので、実際のソースファイルのものではありません。
android {
    // 一番最後に以下を追加します
    productFlavors {
        pro {
            packageName "com.example.android_sample.pro"
        }
        free {
            packageName "com.example.android_sample.free"
        }
    }
}
ファイルの編集後、Android Studioの[Tools]→[Android]→[Sync Project With Gradle Files]を選択するとAndroid StudioにFlavorの追加が認識されます。

せっかくなのでソースコードとリソースの切り替えもやってみましょう。
今回はMainActivityと同階層にFooクラスを作って、そのメソッドをMainActivityからコールするコードを書いてみます。
この呼び出すFooクラスをFlavorでのソース切り替え対象にすることにします。
また、リソース切り替え対象はstrings.xmlを使い、アプリ名や画面上のメッセージの切り替えてみようと思います。
それぞれのファイルの内容は以下のようにします。
package com.example.android_sample;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Foo.saySomething(this);
    }
}
package com.example.android_sample;

import android.content.Context;
import android.widget.Toast;

public class Foo {
    public static void saySomething(Context context) {
        Toast.makeText(context, "This is pro version", Toast.LENGTH_SHORT).show();
    }
}

package com.example.android_sample;

import android.content.Context;
import android.widget.Toast;

public class Foo {
    public static void saySomething(Context context) {
        Toast.makeText(context, "This is free version", Toast.LENGTH_SHORT).show();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">android_sample (pro)</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello pro world!</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">android_sample(free)</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello free world!</string>
</resources>
ディレクトリ構成は以下の通りです。
(今回の切り替え対象やアプリ上の表示関係のないファイルは省略しています)
リソースファイルはmainと他Flavorで重複してもFlavorのもので上書きしてくれるんですが、ソースファイルの方では重複するとビルド時にエラーになるので注意が必要です。
android_sample (root)
`-- app
  `-- src
    |-- free
    | |-- java
    | | `-- com
    | |   `-- example
    | |     `-- android_sample
    | |       `-- Foo.java
    | `-- res
    |   `-- values
    |     `-- strings.xml
    |-- main
    | |-- assets
    | |-- java
    | | `-- com
    | |   `-- example
    | |     `-- android_sample
    | |       `-- MainActivity.java
    | |-- res
    | |   |-- layout
    | |   | `-- activity_main.xml
    | |   `-- values
    | |     `-- strings.xml
    | `-- AndroidManifest.xml
    `-- pro
        |-- java
        | `-- com
        |   `--example
        |     `-- android_sample
        |       `-- Foo.java
        `-- res
          `-- values
            `-- strings.xml
ファイルの編集が終わったら、Android Projectの左下にいる[Build Valiant]を選択して、Flavorの切り替えをしてみましょう。
以下の画像のようにapp/src/pro/javaとapp/src/free/javaの配下がJavaのソースセットとして切り替わるのがわかると思います。


それぞれのFlavorで[Build]→[Make Project]でビルドをしてみると、app/build/apk配下にそれぞれのapkファイルができていると思います。
この2つのapkファイルをデバイスにインストールしてみると、パッケージが異なるので以下の画像のように2つのアプリが共存ができるようになります。
作成したアプリは画像中のandroid_sample(pro)とandroid_sample(free)になります。

それぞれのアプリを起動して、振る舞いの違いも見てみましょう。
Pro版、Free版で表示されるメッセージとToastで表示されているメッセージが切り替わっているのがわかると思います。


さて、最後にまとめとして、今回は同じアプリの実装やリソースをFlavorとして切り替える方法を紹介しました。

やっぱりAndroid StudioはビルドシステムとしてGradleを採用しているだけあって、Flavorでの切り替えがスムーズにできますね。
Eclipseでも[外部ツール]としてGradleを使ってある程度のことはできるんですが、ソースセットの切り替えの部分というのがAndroid Studioのように簡単にはできませんでした。
(本当はこのブログ内でEclipseでFlavorを切り替える方法を紹介したかったんですが...)
まあ、ここらへんはEclipseのAndroidSDKToolsがプラグインだということもあって、なかなか難しいのかなと思います。

では、今回はここらへんで。
このブログの執筆時点でもう2013年も終わりに近くなってまいりました。皆さん、良いお年を~。