[Android] FCMの GooglePlayService の依存関係を調べる

#最初に
外部ライブラリを利用していると、依存関係がどうなってるのかとても気になることがありますよね。

そんな時、ビルド時の「依存関係」を調べると、
不整合がどこで起きているのか目安をつけることができます。



## 依存関係を調べる

今回のプロジェクトでは、下記環境で FCM(Firebase Console Massging) ライブラリを利用します。

```
android {
    compileSdkVersion 26
}
dependencies {
    implementation  "com.google.firebase:firebase-messaging:17.0.0"
    implementation 'com.google.firebase:firebase-core:16.0.3'
}
```

上記を利用している対象のプロジェクトに移動したら、
ターミナル から gradlew の `dependencies` を利用し、外部ファイルに出力させます。

```　
[Win]
gradlew :app:dependencies > out.txt

[Mac]
./gradlew :app:dependencies > out.txt
```

コマンドを実行したら out.txt に「依存関係」が出力されるのでエディターで開きツリーの構成を確認します。

## FCM ver17.0.0 の依存関係を表示

```
【抜粋】 
+--- com.google.firebase:firebase-messaging:17.0.0
|    +--- com.google.android.gms:play-services-basement:15.0.1
|    |    \--- com.android.support:support-v4:26.1.0
|    |         +--- com.android.support:support-compat:26.1.0
|    |         |    +--- com.android.support:support-annotations:26.1.0
|    +--- com.google.android.gms:play-services-tasks:15.0.1
|    |    \--- com.google.android.gms:play-services-basement:[15.0.1] -> 15.0.1 (*)
|    +--- com.google.firebase:firebase-common:16.0.0 -> 16.0.1
|    |    +--- com.google.android.gms:play-services-basement:15.0.1 (*)
|    |    \--- com.google.android.gms:play-services-tasks:15.0.1 (*)
|    +--- com.google.firebase:firebase-iid:[16.0.0] -> 16.0.0
|    |    +--- com.google.android.gms:play-services-basement:15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-stats:15.0.1
|    |    |    \--- com.google.android.gms:play-services-basement:[15.0.1] -> 15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-tasks:15.0.1 (*)
   　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ↓↓↓ (※1) 
|    \--- com.google.firebase:firebase-measurement-connector:16.0.0 -> 17.0.0
|         \--- com.google.android.gms:play-services-basement:15.0.1 (*)
#==============================================================#
+--- com.google.firebase:firebase-core:16.0.3
|    +--- com.google.firebase:firebase-analytics:16.0.3
|    |    +--- com.google.android.gms:play-services-basement:15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-measurement-api:[16.0.1] -> 16.0.1
|    |    |    +--- com.google.firebase:firebase-common:16.0.0 -> 16.0.1 (*)
|    |    |    \--- com.google.firebase:firebase-iid:16.0.0 (*)
|    \--- com.google.firebase:firebase-measurement-connector-impl:17.0.1
|         \--- com.google.firebase:firebase-measurement-connector:17.0.0 (*)

```
ツリーの見方として **アロー演算子(->) となってる個所は、記載バージョンでリンクされたことを示します。**

さて、ここでちょっと気になる所があります。

上記ツリーの messaging 内で 16.0.0 とリンクされるべき箇所で（※1）、
バージョン不整合を防ぐために **core で利用されている 17.0.0 としてリンクされています。**

また messaging/core どちらも **GooglePlayService の基本コンポーネント である play-services-basement は 15.0.1 に依存していることがわかります。**

#### Tips
GooglePlayService の基本コンポーネントである messaging/play-services-basement v15.0.1 は、support-v4 の下記バージョンと紐づいていました。

```
com.google.android.gms:play-services-basement:15.0.1 　　　
| 　 \--- com.android.support:support-v4:26.1.0
```
これは **compileSdkVersion** のバージョンに依存しているようで **27** を利用すると **appcompat-v7: 27.x** を利用する必要があるため、下記のように 27系としてリンクされます。

**|    |    \--- com.android.support:support-v4:26.1.0 -> 27.0.0**


## FCM ver17.3.4 の依存関係を表示

この FCM バージョンでは
 - トークン受信サービス FirebaseInstanceIdService が deprecated 化
 - メッセージ受信時に ANR が発生した問題の改修
 - その他バグ改修/最適化

が行われてます。では、バージョンが変わると「依存関係」がどうなるか見てみましょう。

```
+--- com.google.firebase:firebase-messaging:17.3.4
|    +--- com.google.android.gms:play-services-basement:16.0.1
|    |    \--- com.android.support:support-v4:26.1.0
|    |         +--- com.android.support:support-compat:26.1.0
|    +--- com.google.android.gms:play-services-tasks:16.0.1
|    |    \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    +--- com.google.firebase:firebase-common:16.0.3
|    |    +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    |    \--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|    +--- com.google.firebase:firebase-iid:[17.0.4] -> 17.0.4
|    |    +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    |    +--- com.google.android.gms:play-services-stats:16.0.1
|    |    |    \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    |    +--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|    |    +--- com.google.firebase:firebase-common:16.0.3 (*)
|    |    \--- com.google.firebase:firebase-iid-interop:16.0.1
|    |         +--- com.google.android.gms:play-services-base:16.0.1
|    |         |    +--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    |         |    \--- com.google.android.gms:play-services-tasks:16.0.1 (*)
|    |         \--- com.google.android.gms:play-services-basement:16.0.1 (*)
|    \--- com.google.firebase:firebase-measurement-connector:17.0.1
|         \--- com.google.android.gms:play-services-basement:16.0.1 (*)
#==============================================================#
+--- com.google.firebase:firebase-core:16.0.3
|    +--- com.google.firebase:firebase-analytics:16.0.3
|    |    +--- com.google.android.gms:play-services-basement:15.0.1 -> 16.0.1 (*)
|    |    +--- com.google.android.gms:play-services-measurement-api:[16.0.1] -> 16.0.1
|    |    |    |    +--- com.google.firebase:firebase-common:16.0.1 -> 16.0.3 (*)
|    |    |    |    \--- com.google.firebase:firebase-iid:16.0.0 -> 17.0.4 (*)
|    |    |    +--- com.google.firebase:firebase-common:16.0.0 -> 16.0.3 (*)
|    |    |    \--- com.google.firebase:firebase-iid:16.0.0 -> 17.0.4 (*)
|    \--- com.google.firebase:firebase-measurement-connector-impl:17.0.1
|         \--- com.google.firebase:firebase-measurement-connector:17.0.0 -> 17.0.1 (*)
```

messaging の play-services-basement は 16.0.1 にアップデートされています。
それに伴い core の **play-services-basement は 15.0.1 ではなく 16.0.1 とリンクしている事が確認できます。**

他では firebase-iid 16.0.0 => 17.0.4 となっていますね。

このようにバージョンが異なる状態でライブラリが混合したとき、低い方がアップグレードされます。
ダウングレードされることがあるかは現状不明ですが...

### まとめ

いろんなライブラリを導入したときに、バージョン問題と思われる事象が起きたときには「依存関係」を調べることで解決の手助けになると思います。