[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 となっていますね。

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

まとめ

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