Tips : Android Studio でGradleビルド

Google I/O 2014でWearにも対応したAndroid Studioですが、Versionも0.8.1(今日現在)とだいぶリリースに近づいた感があります。 Android StudioではIntelliJ IDEAはあくまでも皮で、Gradleが肝。 Androidアプリのビルドシステムを、Gradleに完全移行する宣言をしているGoogleですが、着実に歩を進めているようです。

ということで自分のアプリもGradleに移行してみました。 細かいところは割愛して、自分なりに気になったところだけメモしておきます。 (ほとんどAndroid Developerに書いてあるので、ほぼ翻訳です。)

公式なドキュメントは下記にありますので、興味のある方はこちらへ。

AntプロジェクトのImport

EclipseからExportする記事などもありますが、今はAndroid StudioでImportすることが推奨のようです。 Android Studioのメニューから、File > Import ProjectでAntプロジェクトのルートを指定します。

f:id:tomoyukim:20140710090916p:plain

ポップアップで何か聞かれるかもしれないですが、そのまま進めても大丈夫です。

Appのツリー構成

Gradleビルドシステム下のアプリプロジェクトの構成は、Android Developerにあるように大きく変わっています。

f:id:tomoyukim:20140710091855p:plain

ADT以下でのアプリと同等の単位がapp/になり、それと並列にModuleが扱える構造になっています。 Android Library ProjectなどはModuleとしてアプリプロジェクト以下で1つのプロジェクトとして扱えるようになっています。

app/以下の構造は下記のとおりです。

Android Studioでは、フォルダの色が青がMainのソース、緑がTestのソースになります。

Build Variants

この辺からGradleビルドシステムのパワーが発揮されてきます。

GradleではConfigurationで複数のAPK出力ができるようになりました。 Build TypeProduct Flavorという2つの種類が扱えるようになっており、(Build Type) x (Product Flavor)だけの数のビルドパターンを組むことができます。

プリプロジェクト内で、どのパッケージを使ってAPKをつくるか、どのリソースを組み込むかなど、細かいConfigurationをbuild.gradleに記述することができ、ディレクトリを分けて管理・実行することができます。 例えばβ用とRelease用を分けたり、無料版、有料版を分けたりする場合にとても有用です。

最初にプロジェクトをImportもしくは作成したときに、build.gradleにRelease用のスクリプトが生成されていると思います。

apply plugin: 'android'
android {
    ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

こちらの記事が詳しく記載しているので参考になりますが、このbuildTypes以下にConfigurationを加えることで、Build Typeを追加していけます。

f:id:tomoyukim:20140710094915p:plain

Build TypeやProduct Flavorを追加すると、Android Studioでは左下のBuild Variantsにその組み合わせた種類のぶんだけ表示が追加され、実行できるようになります。

dependenciesによる依存解決

ADTでは、Mavenを使えるツールが出回っていたようですが、GradleではMaven Repositoryを利用できます。 Android DeveloperのSnippetを拝借すると、下記のように指定できます。

dependencies {
    // Module dependency
    compile project(":lib")

    // Remote binary dependency
    compile 'com.android.support:appcompat-v7:19.0.1'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

デフォルトではapp/libsは空ですが、jarを配置すれば読み込んでくれるように、compile fileTree(dir: 'libs', include: ['*.jar'])が元から記載されていると思います。 また、compile project(":lib")Moduleの依存関係も解決できます。

外部ライブラリを利用する場合は、Maven Repositoryの情報をgroup:name:versionというフォーマットで記載することで解決できます。 またversionは、3.5のように固定するだけでなく、メジャーバージョンが3の最新が欲しいというときは3.+と記載することで常に最新のライブラリを利用できるようになります。

Signing Configuration

最後に、Release用に必ず利用する署名についてです。

署名はsigningConfigsを追記することで利用するKeystoreやパスワードの指定ができます。

    signingConfigs {
        release {
            def console = System.console();
            keyAlias 'YourKey'
            keyPassword 'YourKeyPassword'
            storeFile file('yourkeyname.keystore')
            storePassword 'YourStorePassword'
        }
    }

storeFilefile()のパスは何も指定しないときはapp/直下を指しています。Groovyに従った記述で好きなところを指定できます。

keyPasswordstorePasswordを直接記載したくなかったので、コンソールから入力するようにしたのですが、Android Studioを利用していると、Gradle syncしたときにCannot invoke method readLine() on null objectと怒られます。

Console()はコマンドライン用のスクリプトのようで、Android Studioでは解決できないようです。 他にも回避策があるかもしれませんが、自分は下記のようにnullチェックを入れています。

    signingConfigs {
        release {
            def console = System.console();
            keyAlias 'YourKey'
            if (console != null) {
                keyPassword console.readLine("\nKey password: ");
            }
            storeFile file('yourkeyname.keystore')
            if (console != null) {
                storePassword console.readLine("\nKeystore password: ");
            }
        }
    }

Releaseビルドのときは、コマンドラインから、

$ ./gradlew assembleRelease --no-daemon

とすることで、パスワード入力をしてビルドをすることが可能です。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築