#最初に
外部ライブラリを利用していると、依存関係がどうなってるのかとても気になることがありますよね。
そんな時、ビルド時の「依存関係」を調べると、
不整合がどこで起きているのか目安をつけることができます。
依存関係を調べる
今回のプロジェクトでは、下記環境で 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 となっていますね。
このようにバージョンが異なる状態でライブラリが混合したとき、低い方がアップグレードされます。
ダウングレードされることがあるかは現状不明ですが...
まとめ
いろんなライブラリを導入したときに、バージョン問題と思われる事象が起きたときには「依存関係」を調べることで解決の手助けになると思います。