AndroidのAdvertising IDを最小構成で取得する

# やりたいこと
- AdIDを取得する
- Google Play Serviceの必要なパッケージのみインストールする

プロジェクト的にはAdIDを取得したあとに何かをする要件がありますが、この記事では取得するところまでとします。
Google Play Serviceの全パッケージを導入すると当然アプリの容量が増えてしまいます。
なるべく導入するものは必要最小限としましょう！

# 環境
- Android Studio 3.3.2
- Kotlin 1.3.30

# 必要なパッケージを調べてみる
必要なパッケージを日本語で調べると `com.google.android.gms.ads`と出てきますが
[公式ドキュメント](http://www.androiddocs.com/google/play-services/id.html)によると `com.google.android.gms.ads.identifier`です。

> The advertising ID APIs are available in the com.google.android.gms.ads.identifier package in the Google Play Services library.

[Advertising ID](http://www.androiddocs.com/google/play-services/id.html)より引用

[Release Notes](https://developers.google.com/android/guides/releases)から最新版を見てみると最新版は`16.0.0`のようです。（2019年4月19日現在）

# 入れてみる
build.gradleの`dependencies`に追加すればパッケージの導入可能です。
サポートライブラリの別バージョンを入れようとしてGradle Syncでエラーとなるためexcludeします。
AdIDはUIスレッド以外で取得しなければいけないためcoroutineも入れます。

```build.gradle
    implementation 'com.google.android.gms:play-services-ads-identifier:16.0.0', {
        exclude group: 'com.android.support', module: 'support-v4'
    }
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.0'
```

ビルド時に下記エラーも発生したため、build.gradleの`android`以下にも追記します。

- エラー内容  
`More than one file was found with OS independent path 'META-INF/atomicfu.kotlin_module'`

- 追記内容

```build.gradle
    packagingOptions {
        pickFirst("META-INF/atomicfu.kotlin_module")
    }
```

# AdIDを取得する
処理の流れ
1. メインスレッド以外で実行する
2. AdIDのオプトアウト状態をチェックする。
3. オプトアウトしていない場合にAdIDを取得する。

今回はログに出すだけにします。

## AdIDの取得コード
```kotlin
GlobalScope.launch {
    try {
        val info = AdvertisingIdClient.getAdvertisingIdInfo(this@MainActivity)
        if (!info.isLimitAdTrackingEnabled) {
            Log.d(tag, "AdId: ${info.id}")
        } else {
            Log.d(tag, "isLimitAdTrackingEnabled: true")
        }
    } catch (e: GooglePlayServicesNotAvailableException) {
        Log.d(tag, e.message)
    } catch (e: GooglePlayServicesRepairableException) {
        Log.d(tag, e.message)
    }
}
```

今回のサンプルコードは[GitHub](https://github.com/iret-kondo/AdvertisingId)に置いてありますので良ければ参考にしてください。

# 番外編
日本語で調べた際に出てきた`com.google.android.gms.ads`で実装するとどうなるでしょうか。
（最初はこちらの方法で実装しようとし、危うく闇落ちしかけました。）
`com.google.android.gms.ads`の最新版は `17.2.0`です。（2019年4月19日現在）
このパッケージを導入しアプリを実行すると、下記のエラーが出てアプリがクラッシュします。

```
    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
```

どうやら `17.0.0`からAdMob App IDの記載が必須になったようです。

> 重要: Google Mobile Ads SDK バージョン 17.0.0 では、この手順は必須です。この <meta-data> タグを追加しない場合は、クラッシュして次のメッセージが表示されます。"The Google Mobile Ads SDK was initialized incorrectly."
[Mobile Ads SDK(Android) スタートガイド](https://developers.google.com/admob/android/quick-start#update_your_androidmanifestxml)から引用

## どうするか
そっかー必須ならしょうがないねー、AdMob App ID取得して記載しようねー

とはなりません。
AdIDを取得したいだけでAdMobを使っていないのに。AdMobを使っていないのに( ‘ᾥ’ )

Google Mobile Ads SDK バージョン 17.0.0未満に下げる？
それはないでしょう。

## どうしたか
めんどくさがらずに[公式ドキュメント](http://www.androiddocs.com/google/play-services/id.html)を読みました。
バッチリ書いてあります！
~~普段あまり意識しなかったimport文に使っているパッケージバッチリ書いてあります~~

## 番外編のまとめ
公式ドキュメント読みましょう！