LoginSignup
86
89

More than 5 years have passed since last update.

AndroidStudioでGradleを使う際のメモ

Last updated at Posted at 2014-11-21

追記 2014-12-24

これを書いた時のAndroid Studioのバージョンを書いていなかったので追記
Android Studio 0.8.9
Gradle Plugin 0.12.2

また、Android Studioが1.0が公開され、それに伴っていくつかGradleのビルドプロパティが変更になっています。
runProguardがminifyEnabledになったりしているので注意。
詳細は以下のリンクを参照

Migrating Gradle Projects to version 1.0.0 – Android Tools Project Site
http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0

前置き

ちょいちょいAndroidアプリの開発を始めて、幾度と無くGradleでハマったのでアバウトなところをメモ。
Gradle自体よりもAndroid Studioよりなので注意。

Androidアプリプロジェクトとファイルの構成

Android Studioでプロジェクトを作成すると、以下の様なGradle関係のファイルが作成される。
この中の太文字のファイルについて、それらの役割と記述の意味について簡単に解説する。

project root
-app
--libs
--build.gradle
-gradle
--wrapper
-modules
--module
---build.gradle
-build.gradle
-settings.gradle

project root直下のbuild.gradle

プロジェクト名で表記されるbuild.gradle
プロジェクト全体での共通するビルド設定を記述する

ビルドスクリプトでの依存関係の記述

ビルドスクリプトで外部ライブラリを使いたい場合は、そのライブラリをスクリプトのクラスパスに追加する必要がある。
これはbuildscript中で依存関係を記述するdependenciesで行う。
ここに使用するライブラリやバージョンを記述する事で、ビルド時に必要なライブラリを自動的にDLする。

以下がそのサンプル

dependencies {
          classpath 'com.android.tools.build:gradle:0.12.+'
          classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
    }

また、ここで記述した外部ライブラリはrepositoriesでDL先を指定できる。

repositories {
          mavenCentral()
    }

見ての通り、これはdependenciesで宣言した2つのライブラリを、Mavenのセントラルから拾ってくる。

以下はサンプルのスクリプト全体

buildscript { 
    repositories {
    //Mavenセントラルから拾ってくる
          mavenCentral()
    }
    dependencies {
          classpath 'com.android.tools.build:gradle:0.12.+'
          classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
    }
}
allprojects {
    repositories {
          mavenCentral()
    }
 } 

また、Gradleではライブラリのバージョンを記述する際に、

classpath 'com.android.tools.build:gradle:0.12.+'

のように「+」を用いて使用するバージョンを固定しない事が出来る。
だが、Android GradleプラグインとAndroid SDK、Gradleのバージョンの関係がシビアで、何もしていないのにビルドに失敗するといった現象が起きるらしい。
その原因がこの曖昧なバージョン指定によるものらしいので、むしろ固定的に宣言したほうが無難との意見もある。

allprojectについて

このサンプルでは設定していないが、各種プロジェクトで分けたい場合は、project(':<project name>')を付けて設定することも可能。
本来ならプロジェクト毎のbuild.gradleに書くべき。
なのだけど、Gitのサブモジュールとしてプロジェクトを追加していて、そちらの編集を行いたくない場合になどに使う。

settings.gradle

ビルド対象となるプロジェクトの基本設定を行う。
Androidでは主にプロジェクト全体で必要なサブプロジェクトを記述。

外部ライブラリを使用する場合に、適当なディレクトリに配置したあと、そのディレクトリをincludeすることで使えるようになる。
たとえばvolleyをmodules/volleyみたいな感じで引っ張ってきたとすれば、

include ':app',':modules:volley'

とする。

アプリケーション内のbuild.gradle

appと表記される
アプリケーション固有の設定を行う

幾つかのブロックに分かれているので、それぞれにどういった内容を記述するかを簡単に書く。
基本的にこれらのブロックに記述の順序は無いが、signingConfigブロックとbuildTypesブロックだけは例外で、signingConfigブロックを先に記述する必要がある。

  • androidブロック(Android DSLとも)
    • defaultConfigブロック
    • signingConfigブロック
    • buildTypeブロック
    • productFlavorsブロック
  • dependenciesブロック

androidブロック(Android DSL)

compileSdkVersionやbuildToolsVsersionの記述
この中に他のブロックが含まれる

defaultConfigブロック

マニュフェストエントリなどを記述
プロダクトフレーバーの一種
ここで設定した項目は、Android StudioのProject Structureダイアログ(Flavorsタブ)に表示される
Project Structureからも直接ビルドスクリプトを編集できる

signingConfigブロック

署名付きAPKファイルを生成する際に使用する
このブロック内にreleaseConfigといったコンフィグを作成し、使用するキーストアや鍵の設定を行う
パスワードなどは直接記述しないこと
環境変数からキーストアの情報を参照する場合は次のようにする。

System.getenv("KEYS")

buildTypeブロック

Debug版やRelease版など、複数のバージョンをビルドする際に使用する
デフォルトでdebugとreleaseが用意されている
もちろん、任意のビルドタイプを追加することが可能

productFlavorsブロック

buildTypeと同じようでちょっと違う。
有料版と無料版や同じアプリの別デバイス対応など、同じプロジェクトから複数のアプリをビルドする際に使用する
また、buildType同様、使用するソースセットや依存関係の記述が可能
buildTypeとproductFlavorの組合せには、ビルドバリアント(build variant)と呼ばれる(Android Studioに表示されているアレ)

dependenciesブロック

依存関係の記述を行う

プラグインの宣言

apply plugin でAndroidプラグインの宣言を行う。

アプリケーションに対する設定

apply plugin: 'com.android.application'

Androidのライブラリプロジェクトに対しては

apply plugin: 'com.android.library'

になる。
注意点としては、AndroidプラグインとJavaプラグインは共存できない。
このため、Javaプラグインと依存関係にあるプラグインの利用もできないので注意されたし。

以下はスクリプト全体のサンプル抜粋

apply plugin: 'android'
//AndroidでGradleを使うときの記述。最近フルパスで書けって言われる
//com.android.application

//androidのビルド設定のメイン
android {
    //signingConfigsブロック
    signingConfigs {
        release_config {
            keyPassword System.getenv("KEYS")
        }
    }
    //アプリをビルドするSDKとかその辺りの設定
    compileSdkVersion 20
    buildToolsVersion '20'
    defaultConfig {
          minSdkVersion 10 //インスコ出来る最小
          targetSdkVersion 20 //インスコ対象端末
        //アプリのバージョン識別子
        //これを上げないとGoogle PlayでVerUP出来ない  
        versionCode 1 
        versionName '1.0'
    }

    //ビルドタイプブロック
    //ReleaseとDebugでそれぞれのタスクとか書ける
    buildTypes {
          release {
                //難読化のProGuard設定
                //ProGuardファイルは難読化の除外設定とかを記述する
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
                signingConfig signingConfigs.release_config
          }
        debug{
                runProguard false
        }
    }
    //プロダクトフレーバーブロック
    productFlavors {
        //ステージングとリリースで切り替える
        staging {
            applicationId "sample.test.applicationname.staging"
        }
        product {
            applicationId "sample.test.applicationname"
        }
    }

}
//依存関係
dependencies {
    repositories {
          mavenCentral()
    }
    //外部ライブラリ関係
    //lib配下のjar郡
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //サブモジュールとして追加した連中
    compile project(':modules:volley')

    androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
    //external に追加するやつら
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.android.support:appcompat-v7:20.0.0'
} 

それぞれの意味は中身に記載

あとがき

だいぶ長くなったのでこのへんで。
もっとGradleよりだとか、実用的な話は別に上げるかもしれません。

その他、参考になったサイト

など

86
89
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
89