倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「はじめての Android」開発環境 〜Gradle 編〜 : Java

id:kimukou_26 殿にコメント頂いた、Gradle による Android プロジェクトのビルドに挑戦(一覧)。 Windows 前提御免。

記事概要

  1. gradle-android-plugin について
  2. ツールのインストール
  3. プロジェクトの作成
  4. エミュレータの設定と起動 (Ant の場合と同じ)
  5. プロジェクトの実行・アンインストール
  6. プロジェクトの署名&パッケージング

参考 URL

gradle-android-plugin について


まず gradle-android-plugin について少々。 gradle-android-plugin に定義されているタスクは以下の5つです:

タスク 説明 Depends On Dependents
androidProcessResources R.java を生成する compileJava
proguard ProGuard でクラスと JAR を処理する jar
androidPackage apk ファイルを生成し、署名する*1 proguard assemble
androidInstall エミュレータ等にアプリをインストールする assemble
androidUninstall エミュレータ等からアプリをアンインストールする
  • 「Depends On」はそのタスク依存しているタスク
  • 「Dependents」はそのタスク依存しているタスク

依存関係を図にするとこんな感じ(青い四角のタスクが gradle-android-plugin に定義されているタスク):


あるタスクを実行しようとしたとき、そのタスクから伸びている矢印で指されているタスクがまず実行されます*2。 つまり androidInstall タスクを実行しようとすると、androidProcessResource タスクからドンドコ実行されていきます。 各タスクの使い方は適宜説明。

ツールのインストール


以前の記事で、Apache Ant でビルドを行う方法を見ましたが、Gradle でビルドする場合は、Apache Ant の代わりに Gradle をインストールする必要があります。 JDK6 と Android SDK はもちろん要インストール。

環境変数も「ANT_HOME」は不要で、代わりに Gradle のインストールフォルダを環境変数GRADLE_HOME」に設定し、%GRADLE_HOME%\bin を環境変数PATH」に加えます。 詳しくは「Installing Gradle」を参照。

プロジェクトの作成


ツールのインストールができたら、まずは Android プロジェクトを作成。 手順は以下の通り:

  1. プロジェクト・テンプレートの生成
  2. build.gradle を作成
  3. ソース・ディレクトリの作成もしくは設定

プロジェクト・テンプレートの生成

プロジェクト・テンプレートの生成には Gradle は関係ありません。 Apache Ant の場合と同じです:

android create project -t android-10 -p HelloAndroid -k org.example.hello -a Hello

build.gradle 作成

プロジェクト・テンプレートを生成したら、プロジェクトのルートフォルダに以下の「build.gradle」ファイルを作成します(「gradle-android-plugin」サイトに載っている build.gradle のコピトラ*3です):

buildscript {
    repositories {
        mavenRepo(urls: 'http://jvoegele.com/maven2/')
    }
    dependencies {
        classpath 'com.jvoegele.gradle.plugins:android-plugin:0.9.7'
    }
}
apply plugin: 'android'
repositories {
    mavenCentral()
}

// プロジェクトのバージョンを設定
version = "x.y.z"

// 署名設定
androidPackage {
    keyStore = System.getProperty('user.home')+'/.keystore'
    keyAlias = 'waman'
    // パスワードが設定されてなければ、コマンド・プロンプトで入力を求められる
    //keyStorePassword = "mystorepass"
    //keyAliasPassword = "myaliaspass"
}

// プロジェクトのプロパティをリソースのフィルタリング(プロパティの解決)に使うヨ
processResources {
    expand (project.properties)
}

// デバッグ・ビルド設定
task configureDebug << {
    jar.classifier = "debug"
}

// リリース・ビルド設定
task configureRelease << {
    proguard.enabled = true
}
  • gradle-android-plugin の最新バージョンは 0.9.8 のようですがイマイチ上手く動かなかったので、1つ前のバージョン 0.9.7 を使用しています。
  • キーストアは $user.home で指定されるフォルダ下に「.keystore」という名前で作成されているとしています*4。 プロジェクトのルートフォルダに「.keystore」という名前のキーストアがある場合は「keyStore = '.keystore'」で OK です。
  • processResource タスクに施している設定 expand の詳細は、Copy タスクの expand メソッド参照(こちら)。
  • デバッグ・ビルド」、「リリース・ビルド」タスク (configureDebug, configureRelease) は設定だけど << を使ってるようです。 こちらで書かれてる話との整合性はというと・・・「設定では << を書かない」という場合の設定は「タスクの設定」であり、ここでの設定は「ビルドの設定(を行う処理)」だっていうことでいいのかな? このあたりも参照。

ソース・フォルダの作成もしくは設定

Gradle プロジェクトでは、Java コードは「src/main/java」に配置する習わしなので*5、このフォルダを作成して、「android create project」コマンドによって生成された Java コードを(パッケージ階層も含めて)このフォルダ下へ移動しましょう。

もし「android create project」コマンドによって生成されたフォルダ構造をそのまま使いたいなら、上記の build.gradle に

sourceSets {
    main {
        java {
            srcDir 'src'
        }
    }
}

を付け加えましょう。

プロジェクトの実行・アンインストール


プロジェクトが作成できたので、次はプロジェクトの実行やアプリのアンインストール。 ここでは、エミュレータ等は起動されているものとします。

プロジェクトの実行

プロジェクトを実行する、つまり apk ファイルを生成してエミュレータ等の上で動かすためには、androidInstall タスクを実行します:

gradle configureDebug androidInstall
// もしくは gradle cD aI

ここでは configureDebug タスクによってデバッグ設定になるようにしてありますが、これをつけなくても(androidInstall タスクだけを実行しても)特に問題はなさそうです。 生成される apk ファイルに「-debug」という分類子(?)が付くだけです。

プロジェクトのアンインストール

エミュレータ等からプロジェクト(から生成されたアプリ)をアンインストールするには、以下のコマンドを実行します:

gradle androidUninstall
// もしくは gradle aU

プロジェクトの署名&パッケージング


最後は、キーストアを使用して署名された apk ファイルを作成する方法。 assemble タスクによって apk ファイルを生成しますが、ProGuard による処理を行うため、configureRelease タスクを事前に実行するようにします:

gradle configureRelease assemble
// もしくは gradle cR assemble
  • きちんと確認してませんが、AndroidManifest.xml で「debuggable="true"」になっていても、そのままパッケージングしてそう・・・要確認。
  • build.gradle にキーストアなどのパスワードを設定していないと、コマンド・プロンプトで入力を求められます。
  • ビルドに成功すると、「$PROJECT_HOME/build/distributions」フォルダ下に apk ファイルが生成されます。

以上で、基本的な使い方は完了。 で、「gradle-android-plugin」では、Scala (や Groovy や Clojure)でも Android アプリを開発できるらしいですが、単純に Scala Plugin によって Scala プロジェクトにするだけでは動かなかったので、今後要研究*6

初めてのAndroid 第3版

初めてのAndroid 第3版

*1:progaurd 処理が行われていなければ、デバッグキーによって署名されるようです。

*2:当初、図中に「processResources」タスクを描いてましたが間違いだったので修正しました。 「processResources」タスクは「classes」タスクには依存されてますが、「compileJava」タスクには依存していません。

*3:Copy, Translate & Paste を仮面ライダーorz 風に言ってみました・・・。

*4:システム・プロパティのもっとスマートな取得方法がありそうだけど・・・

*5:テストコードや Java 以外の言語(Scala や Groovy ?)を扱う場合は、このようなフォルダ構造の有難味が分かるかと。

*6:Groovy で開発できるかなぁ?と思って、「apply plugin:'groovy'」として dependencies に groovy 要素などを加えたら、コンパイルはできましたがエミュレータ上では動きませんでした。 たぶん、Groovy 動かすための Jar ファイルなどを詰め込まないといけないんじゃないかと思いますが。