Android Jetpack(AndroidX Projects)のPlaygroundについて

以下で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はルートプロジェクトで行う前提になっており、ローカルでの開発のみに使用することを目的としているようです。