以下でAndroid Jetpack(AndroidX Projects)の開発が行われています。
https://github.com/androidx/androidx
見て気になったPlaygroundという仕組みがあって、大規模なプロジェクトでは応用できそうなので、メモしておきます。
以下にPlaygroundの説明があります。300を超えるモジュールがあるのですが、独立して実行できる。つまり、あるモジュールとそれに必要なモジュールだけをIDEで開いたりビルドすることができるPlaygroundという仕組みがあります。
https://github.com/androidx/androidx/blob/68ce8d632705fbed51333e7051fbc0f673160919/playground-common/README.md
ちょっとprojectの構造をみていきましょう。以下のようなフォルダ構造になっており、普通にGradleでインポートできるようになっています。
root
├── activity
├── ads
├── androidx-plugin
├── annotation
├── appcompat
├── appsearch
├── arch
├── asynclayoutinflater
├── autofill
├── benchmark
├── biometric
...
├── build.gradle
...
├── settings.gradle
...
./gradlew projectsでプロジェクト構造を見てみると以下のようにたくさんのプロジェクトが入っています。
Root project 'androidx'
+--- Project ':activity'
| +--- Project ':activity:activity'
| +--- Project ':activity:activity-compose'
| | +--- Project ':activity:activity-compose:activity-compose-samples'
| | \--- Project ':activity:activity-compose:integration-tests'
| | \--- Project ':activity:activity-compose:integration-tests:activity-demos'
| +--- Project ':activity:activity-ktx'
| +--- Project ':activity:activity-lint'
| \--- Project ':activity:integration-tests'
| \--- Project ':activity:integration-tests:testapp'
+--- Project ':ads-identifier'
| \--- Project ':ads-identifier:integration-tests'
| \--- Project ':ads-identifier:integration-tests:testapp'
+--- Project ':ads-identifier-benchmark'
+--- Project ':ads-identifier-common'
+--- Project ':ads-identifier-provider'
| \--- Project ':ads-identifier-provider:integration-tests'
| \--- Project ':ads-identifier-provider:integration-tests:testapp'
+--- Project ':ads-identifier-testing'
+--- Project ':annotation'
| +--- Project ':annotation:annotation'
| +--- Project ':annotation:annotation-experimental'
| +--- Project ':annotation:annotation-experimental-lint'
| +--- Project ':annotation:annotation-experimental-lint-integration-tests'
| \--- Project ':annotation:annotation-sampled'
...
...
ここまでは普通なんですが、ここでactivityのディレクトリの中を見てみると以下のようになっています。
./gradlewやsettings.gradleなどがモジュールの中にも存在しています。 普通Gradleのプロジェクトではルートのディレクトリのみにsettings.gradleなどが存在していますが、このディレクトリの中にも存在しています。
-rw-r--r-- 1 takahirom staff 107B 4 25 19:01 OWNERS
-rw-r--r-- 1 takahirom staff 652B 4 25 19:01 README.md
drwxr-xr-x 6 takahirom staff 192B 4 25 19:01 activity
drwxr-xr-x 7 takahirom staff 224B 4 25 19:01 activity-compose
drwxr-xr-x 6 takahirom staff 192B 4 25 19:01 activity-ktx
drwxr-xr-x 4 takahirom staff 128B 4 25 19:01 activity-lint
lrwxr-xr-x 1 takahirom staff 27B 4 25 19:01 gradle -> ../playground-common/gradle
lrwxr-xr-x 1 takahirom staff 47B 4 25 19:01 gradle.properties -> ../playground-common/androidx-shared.properties
lrwxr-xr-x 1 takahirom staff 28B 4 25 19:01 gradlew -> ../playground-common/gradlew
lrwxr-xr-x 1 takahirom staff 32B 4 25 19:01 gradlew.bat -> ../playground-common/gradlew.bat
drwxr-xr-x 3 takahirom staff 96B 4 25 19:01 integration-tests
-rw-r--r-- 1 takahirom staff 1.2K 4 25 19:01 settings.gradle
ここで./gradlew projectsしてみると。。?
activityとそれに必要なプロジェクトだけセットアップされている事がわかります。
------------------------------------------------------------
Root project 'activity-playground'
------------------------------------------------------------
Root project 'activity-playground'
+--- Project ':activity'
| +--- Project ':activity:activity'
| +--- Project ':activity:activity-compose'
| | +--- Project ':activity:activity-compose:activity-compose-samples'
| | \--- Project ':activity:activity-compose:integration-tests'
| | \--- Project ':activity:activity-compose:integration-tests:activity-demos'
| +--- Project ':activity:activity-ktx'
| +--- Project ':activity:activity-lint'
| \--- Project ':activity:integration-tests'
| \--- Project ':activity:integration-tests:testapp'
+--- Project ':annotation'
| \--- Project ':annotation:annotation-sampled'
+--- Project ':compose'
| +--- Project ':compose:lint'
| | +--- Project ':compose:lint:common'
| | \--- Project ':compose:lint:internal-lint-checks'
| \--- Project ':compose:test-utils'
+--- Project ':fakeannotations'
+--- Project ':internal-testutils-common'
+--- Project ':internal-testutils-gradle-plugin'
+--- Project ':internal-testutils-runtime'
+--- Project ':lint-checks'
| \--- Project ':lint-checks:integration-tests'
\--- Project ':test-screenshot'
Included builds
\--- Included build ':androidx-plugin'
このようにサブプロジェクト単体で動かせるようにしています。ドキュメントによると、CIはルートプロジェクトで行う前提になっており、ローカルでの開発のみに使用することを目的としているようです。