IonicにFirebaseプラグインを入れた際のGoogle Play Servicesのバージョン調整(依存conflict解決)

最近(2018年10月)、Ionic3でAndroidアプリを作って、Play Storeで公開しました。

そこに至るにはいろいろと罠がありましたので、その記録を思い出せるうちに書いて残しておこうと思います。

困ったり解決したりする度に[ツイートしてた](https://twitter.com/agajo_tech)からいけるはず……！！

いくつかの記事にわけて、シリーズとしてまとめておきます。

なお、なんとかリリースできたアプリはこちら。あなたの日本語入力速度を測定します。→[フリックとローマジ 〜日本語入力スピード測定〜](https://play.google.com/store/apps/details?id=oka_ryunoske.work.flickromaji.app)

#シリーズ一覧

 - [小さめの奴をまとめて](https://qiita.com/agajo/items/dee6c5c994fe0e5ef001)
    - Ionicアプリにおける、色の指定のしかた
    - アプリのIDを初期値にしたまま端末に複数インストールすると上書きされる
    - iconとsplashの生成
    - android実機デバッグでエラーメッセージを見る
    - chromeでinspectタブを開いていると、端末ビルド時にno device error
    - play-services-ads v17 でAndroidManifest.xmlのmeta-data強制
 - [複数のファイルにまたがるPromiseの使い方](https://qiita.com/agajo/items/c466a4cdc3930dd43206)
    - IonicのNavControllerはProviderからは使えない
 - [プライバシーポリシー](https://qiita.com/agajo/items/e886afb7f5408141d1fc)
 - [admob-freeプラグインでのeventsオブジェクトの扱い](https://qiita.com/agajo/items/fd1e61e3325552aaefaf)
 - firebaseプラグイン導入時のGoogle Play Services libraryのバージョン調整(この記事)
 - [Lazy Loading への対応](https://qiita.com/agajo/items/f13a2ae06c70fef8887b)
    - ngIf、ngForが動かない時

#cordova-plugin-firebase

IonicアプリでFirebaseを使おうと思ったら、こちらのプラグインを使うことになると思います。

https://ionicframework.com/docs/native/firebase/
https://github.com/arnesson/cordova-plugin-firebase

リンクを２つ貼りましたが、Ionicのページとgithubのページを貼っただけで同じプラグインの話です。

#生じていた問題


##依存バージョンの不一致

上記のプラグインをインストールしたアプリをbuildしようとすると、下記のエラーが出ました。

>The library com.google.android.gms:play-services-measurement-base is being requested by various other libraries at [[11.0.4,11.0.4], [16.0.0,16.0.0]], but resolves to 16.0.0. Disable the plugin and check your dependencies tree using ./gradlew :app:dependencies.

基本的には、こちらの方が記事に書いて下さっている内容そのものです。

https://qiita.com/konyavic/items/bf0cbab1b37301dc2a77

ということで、エラーメッセージやこちらの記事に書いてあるのと同じように`./gradlew`を実行して依存関係を調べ、解決していこうと思ったのですが……。

##gradlewコマンド単体で実行できない

僕が実行するbuildコマンドって`ionic cordova run android --device`とかであって、どうも`./gradlew`はこの中で自動的に実行されているようなんですよね。

だから、依存関係を調べるために自力で`./gradlew :app:dependencies`を実行しようにも、この引数を与えて実行する方法がわからない！！

`platforms/android`の中に`gradlew`があったのでこれを実行してみてもエラーになります。カレントディレクトリを変えて実行してもだめ。やっぱり`ionic cordova run`とかじゃないと駄目みたい。

結局、依存関係を調べて自力で解決する方法は頓挫しました。


#解決策

本家githubのプラグインの説明に書いてあることをしっかり実行すればちゃんと動きました。最初からよく読めって話ですね…。引用しておきます。

https://github.com/arnesson/cordova-plugin-firebase
>Google Play Services
>Your build may fail if you are installing multiple plugins that use Google Play Services. This is caused by the plugins installing different versions of the Google Play Services library. This can be resolved by installing cordova-android-play-services-gradle-release.

>If your build is still failing, you can try installing cordova-android-firebase-gradle-release. For more info, read the following comment about locking down the specific versions for play services and firebase. It is suggested to use + instead of 15.+ to ensure the correct versions are used.

要するに

`cordova-android-play-services-gradle-release`と`cordova-android-firebase-gradle-release`を追加でインストールすると良いということ。

さらに、僕の場合、どちらも`--variable PLAY_SERVICES_VERSION=+`というオプションをつけてインストールして初めてうまくいきました。

コマンドとしてはこうなります。

```
$ cordova plugin add cordova-android-play-services-gradle-release  --variable PLAY_SERVICES_VERSION=+
$ cordova plugin add cordova-android-firebase-gradle-release  --variable FIREBASE_VERSION=+
```


この2つのプラグインは兄弟みたいなもんですが、この兄弟はもう一人いて、`cordova-android-support-gradle-release`も必要になるケースがあるかもしれません。僕の場合は不要でした。


これらをインストールした上で、あらためて`ionic cordova run android --device``などを実行してアプリをビルドしたらうまくいきました。




#プラグインがわけわかんなくなっちゃった時の対策

解決策を探していろいろ依存関係の数字をいじったりしてる時にですね、あれこれいじりすぎてプラグインがしっちゃかめっちゃかになってしまい、

一旦`cordova-plugin-firebase`を外して元の状態に戻そうとしても、もともとできていたビルドすらできなくなってしまいました。

この時はかなり焦ったんですが…

##解決策

`plugins`フォルダと`platforms`フォルダを思い切って消してしまって(不安なら念の為どこかに避けておいて)、

必要ならgitで特定のコミットまで戻して、

改めて`ionic cordova run android --device`を実行すると、

一通りのプラグインを改めてインストールし直してくれるので復活できます。

実は`plugins`フォルダと`platforms`フォルダは、`.gitignore`でgitの管理対象外にデフォルトで設定されています。

後から再インストールして復活できるから、管理に含めておく必要がないんですね。