【Android】gradleに設定したライブラリはどこから取得されるのか

# はじめに
こんにちは。
Android開発者が何気なく使っているライブラリですがどこから取得しているかすごく調べる機会があったので備忘録として。
前提としてbuild.gradleのdependenciesブロックにimplementationを追加すれば外部ライブラリを取得するということは知っているのですが（おそらく大半のAndroidエンジニアはわかっていると思いますが。。）ただ、ビルド時にライブラリがどこのコードでどのように取得されるのかは、詳しく理解していませんでした。
なので、流石にAndroidエンジニアを名乗るのに知っておかなければということで調べたことをまとめることにしました。

# 用語のおさらい
前提として知っておくといい用語をいくつか書いておきます。
### Gradle
高度なビルドツールキットのことで本来は「Gradle Build Tool」でありそれを略してGradleとのことAndroidとして使用されているのはGroovyそして最近はKotlinですね。

https://docs.gradle.org/current/userguide/userguide.html

### Android Gradle プラグイン（AGP）

公式より
> Android アプリの公式のビルドシステムです。さまざまなタイプのソースをコンパイルして、実際の Android デバイスまたはエミュレータ上で実行可能なアプリにまとめてリンクできます。

要はAndroidの公式のビルドシステムでAndroidに合わせた拡張セットが含まれているプラグインで、ビルド設定が簡単にできるようになった便利ツールというところです。

https://developer.android.com/studio/build/extend-agp?hl=ja

https://developer.android.com/studio/build?hl=ja


### AOSP
Androidオープンソースプロジェクトのこと。Androidの開発に関わる関係者、プロセス、ソースコードのこと。

https://source.android.com/docs/setup/about/faqs?hl=ja#what-is-the-android-open-source-project

### OSS 
オープンソースソフトウェアの略。
誰でも検査、変更、拡張できるソースコードを備えたソフトウェアのことでです。
ただOSSにはライセンス（MITやApache2.0など）が存在して、そのライセンス範囲での扱いをしなければいけないので注意。

https://aws.amazon.com/jp/what-is/open-source/

### 依存関係
Androidの依存関係とはアプリケーション開発において外部のモジュールやライブラリを取り込んで使用できるようにすること。

# Androidのビルド依存関係を追加するおさらい
ではAndroidで依存関係を追加する実装を軽くおさらいです。
Developerサイトからそのままコピーしています。

```gradle:build.gradle

plugins {
  id 'com.android.application'
}

android { ... }
// ここから下が依存関係の定義
dependencies {
    // Dependency on a local library module
    implementation project(':mylibrary')

    // Dependency on local binaries
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
}

```

https://developer.android.com/studio/build/dependencies?hl=ja#groovy

上記の処理のようにimplementationを追加することにより、欲しいライブラリ、指定があれば欲しいバージョンを定義することができます。

# 本題へ
では前置きが長くなりましたが、この依存関係を定義したライブラリはどこから取得しているのかです。
結論から言うとmavenから取得しています。
正確に言うと「 [Google Maven](https://maven.google.com/web/index.html) 」および「 [Maven Central](https://repo.maven.apache.org/maven2/) 」から取得しています。
Google MavenとはAOSPプロジェクトが管理されているものです。例えばAndroidXライブラリだったりFirebaseだったりなどGoogleのソースコードが該当します。
次にMaven Centralは外部のOSSです例えばOkHttpだったりtimberだったりなどが該当します。

次はコードになります。
以下部分でgoogle Maven と maven central にアクセスしています。
ちなみにその下の画像がイメージです。

```gradle:build.gradle
repositories {
    google()
    mavenCentral()
}
```

https://docs.gradle.org/current/userguide/declaring_repositories.html

![スクリーンショット 2023-11-16 1.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117699/d9cf4004-898f-94b3-1607-5b01b4544f5c.png)

現在は廃止されていますが、前はjcenterなどがあったようです。

# OSS Licenses Gradle Pluginで見てみる
実際にOSSライセンスライブラリで見てみましょう。
以下OSS一覧取得した画像になります。
実は取得元は違うのですが、どちらもOSSというカテゴリーではあるのですごい量のOSSが出てきます。（AndroidXとかもありますね。）
OSSの管理をする時の注意ですが、どこまで管理するのかは気にした方がいいですかね（AOSPまで含めると管理大変です。。）
例えばmaven Centralから取得する（つまり外部ライブラリ）のみを管理するのかAOSPまで管理するのかです。
何が言いたいのかと言いますと、取得元は違ってもすべてOSSで変わりないと言うことです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117699/7bc94f1e-0e09-6583-d34d-da44e9d8fda6.jpeg" width="300px">

※実装方法は以下で

https://calnikki.com/get_oss_on_oss-licenses-plugin/

# 最後に
はじめに伝えた通り理解不足なところもありましたが、調べてみるとさらに理解が深まりました。
gradleのあたりはドキュメントをじっくり読まないとブラックボックスなところがあるので知るきっかけができてよかったです。
またbuild.gradleの設定は今回の依存関係だけでなく、他の設定をしていたりもするので一度調べる時間を作ってみるのもいいかもしれません。
最後までご覧いただきありがとうございました。