LoginSignup
7
7

More than 5 years have passed since last update.

GradleとAndroid Studioを利用したマルチプロジェクトビルド

Posted at

背景

マルチプロジェクトビルドに挑戦しているので記録を残す。
C, C++, Javaのネイティブ環境である。
ndk-buildはコマンドをgradleから直叩きする形。
Androidライブラリとテスト用のAndroidアプリケーションをそれぞれ複数含む。

執筆時点の環境情報

$ gradle -version

------------------------------------------------------------
Gradle 2.14
------------------------------------------------------------

Build time:   2016-06-14 07:16:37 UTC
Revision:     cba5fea19f1e0c6a00cc904828a6ec4e11739abc

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Mac OS X 10.11.5 x86_64

Gradleについて

クロージャの扱い

task hello {
    // これだとタスク実行前(評価時)に実行されてしまう
    println "hello world"
}
task hello {
    doLast {
        println "hello world"
    }
}
task hello << {
    println "hello world"
}

まずはGradle単体でのマルチプロジェクトの設定

構成を設定する

settings.gradle
rootProject.name = 'water'
include 'bluewhale:bluemoon'
include 'bluewhale:redmine'
include 'krill'
include 'tropicalFish'
include '123'
include 'アイウエオ'
$ gradle projects
Root project 'water'
+--- Project ':123'
+--- Project ':bluewhale'
|    +--- Project ':bluewhale:bluemoon'
|    \--- Project ':bluewhale:redmine'
+--- Project ':krill'
+--- Project ':tropicalFish'
\--- Project ':アイウエオ'

ディレクトリ自体は作成しなくても良い。
以降この節ではプロジェクトを例として解説。

サブプロジェクトのタスクは親からでも設定できる

Closure cl = { task -> println "I'm $task.project.name" }
task hello << cl
project(':bluewhale') {
    task hello << cl
}

子供からでも親のタスクを設定できる

/build.gradle
task ok << {
    println "ok I'm water."
}
bluewhale/build.gradle
// rootProjectにokというタスクがない場合はエラーになる
rootProject.ok << {
    println "ok! man!"
}
$ gradle ok
Configuration on demand is an incubating feature.
:ok
ok I'm water.
ok! man!

BUILD SUCCESSFUL

実行時のタスクの順番を指定する

bluewhale/build.gradle
task hello(dependsOn: ":krill:hello") << {
    println "hello bluewhale"
}

プロジェクト単位では指定できない。

評価の順番を指定する

他のプロジェクトに依存

evaluationDependsOn(':producer')

全部逆順にする場合はこう

evaluationDependsOnChildren()

task単位では指定できない。
何も指定しない場合はalnum

Configuration on Demand

関係あるプロジェクトだけ評価する
そのうちこれがデフォルトの挙動になるだろうと書いてありました。
こうしないと関係ないプロジェクトも全部評価して設定してしまう。
詳しくはこちら

gradle.properties
org.gradle.configureondemand=true

Android Studio

一般的な構造

android-unsplash $ tree -L 2
.
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── android-unsplash.iml
├── app
│   ├── app.iml
│   ├── build
│   ├── build.gradle
│   └── src
├── build.gradle
├── gradle
│   └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

Note: app/ はandroid-unsplash/ の単なるサブプロジェクトである

To Be Continued

とりあえず今日はここまで (2016/6/21)

ドキュメント

マルチプロジェクトの概要
マルチプロジェクトの詳細と設定
Configure on Demand機能の設定

7
7
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
7
7