ionic
Firebase
play-services
Ionic3

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

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

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

困ったり解決したりする度にツイートしてたからいけるはず……!!

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

なお、なんとかリリースできたアプリはこちら。あなたの日本語入力速度を測定します。→フリックとローマジ 〜日本語入力スピード測定〜


シリーズ一覧


cordova-plugin-firebase

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

https://ionicframework.com/docs/native/firebase/

https://github.com/arnesson/cordova-plugin-firebase

リンクを2つ貼りましたが、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-releasecordova-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の管理対象外にデフォルトで設定されています。

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