Firebase導入は楽になった
Firebase導入に関しての以前の記事に追記していたのですが、Firebase以外でもCordova 9 導入時に少しハマったことがあるので別記事にして紹介します。
開発環境
$ cordova -v
9.0.0 (cordova-lib@9.0.1)
$ cordova platform ls
Installed platforms:
android 8.1.0
Available platforms:
browser ^6.0.0
electron ^1.0.0
ios ^5.0.0
osx ^5.0.0
windows ^7.0.0
$ gradle -v
------------------------------------------------------------
Gradle 5.6.2
------------------------------------------------------------
Build time: 2019-09-05 16:13:54 UTC
Revision: 55a5e53d855db8fc7b0e494412fc624051a8e781
Kotlin: 1.3.41
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM: 1.8.0_66 (Oracle Corporation 25.66-b17)
OS: Mac OS X 10.12.6 x86_64
Cordova9未対応のプラグイン
Cordova 8の環境まではcordova-plugin-crypt-file
というプラグインを使っていたのですが、これがCordova9に対応していなくてビルド出来なかったのですが、この記事の通りにソースを修正したら問題なくビルド出来ました。助かりました
Gradleプラグインのトラブル
Cordova 9 導入後アプリをビルドすると以下のようなメッセージがビルド時に表示されました。
> Configure project :CordovaLib
WARNING: The following project options are deprecated and have been removed:
android.useDeprecatedNdk
NdkCompile is no longer supported
Warningだから問題ないだろうと思い無視してgoogle play consoleにapkファイルをアップロードしたら、googleのテストが終わった頃に「アプリで古いバージョンの Google Play Developer API を使用していることが検出されました」とリンク付きのメッセージが表示されました。「2019年12月1日以降使えなくなります。」と書かれています。これは親切でいいのですが、gradle.properties
ファイルの該当箇所を消してもビルドを行うと復活してしまうと現象に見舞われました。
# gradle.properties
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m
android.useDeprecatedNdk=true <-- この行
android.useAndroidX=true
android.enableJetifier=true
platforms/android/gradle.properties
のandroid.useDeprecatedNdk
の値をfalse
にしてもandroid.useDeprecatedNdk=true
の行を削除しても復活してしまいます。grepしてプロジェクト内のファイルを調べてみるとこのパラメータはplatforms/android/cordova/lib/config/GradlePropertiesParser.js
で設定されているようです。以下のように該当箇所をコメントにしてビルドしたらWarningが消えました。
ちなみにこのWarningはAndroidStudioを使ってgradleプラグインを更新しなければ出ませんでした。gradleだけを使っていれば遭遇しなかったものです。ややこしいです。
# 変更前
# GradlePropertiesParser.js
this._defaults = {
// 10 seconds -> 6 seconds
'org.gradle.daemon': 'true',
// to allow dex in process
'org.gradle.jvmargs': '-Xmx2048m',
// allow NDK to be used - required by Gradle 1.5 plugin
'android.useDeprecatedNdk': 'true'
// Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet):
// 'org.gradle.parallel': 'true'
};
# 変更後
# GradlePropertiesParser.js
this._defaults = {
// 10 seconds -> 6 seconds
'org.gradle.daemon': 'true',
// to allow dex in process
'org.gradle.jvmargs': '-Xmx2048m'
// // allow NDK to be used - required by Gradle 1.5 plugin
// 'android.useDeprecatedNdk': 'true'
// Shaves another 100ms, but produces a "try at own risk" warning. Not worth it (yet):
// 'org.gradle.parallel': 'true'
};
ついでにorg.gradle.jvmargsの値も少し増やしておきました。ビルド時間が短縮された気がします。
Gradleプラグインを更新しなかったらどうなのか
そもそも今回のトラブルはAndroid StudioでGradle Syncした時に以下のダイアログが表示されて
update
を選択したことによるものです。
このgradleプラグインのupdateによってbuild.gradle内のclasspath 'com.android.tools.build:gradle:3.3.0'
がclasspath 'com.android.tools.build:gradle:3.5.0'
に書き換わっていました。
試しに他のプロジェクトでAndroidStudioを一切使わずにビルドしてgoogle play consoleにapkをアップロードしたら、googleのメッセージも表示されずに、GradlePropertiesParser.jsの編集も必要なくすんなりリリース出来ました。
移行手順
昔の記事にも書いていますが、移行するときは新規にプロジェクトを作り直して、自分が作ったソースファイルやリソースファイルを後からプロジェクトに追加するのがトラブルを避ける手っ取り早い方法だと思います。それでもいつも何かが起きますが…。
今回自分がやったのは、以下のような手順です。
-
cordova create
で新規プロジェクト作成 - アイコン等のresouceディレクトリを旧プロジェクトからコピー
- google-services.json、config.xmlを旧プロジェクトからコピー
- config.xmlファイルからプラグインの記述を削除(デフォルトのconfig.xmlに記述されているwhitelistプラグインはそのまま)
※Cordova 9 からプラグインはpackage.jsonファイルで管理されます cordova platform add android@latest
- 旧プロジェクトで使用していたCordova9対応済みのプラグインを一つずつ
cordova plugin add
する - アプリのアイコン等に使用するリソースファイル(string.xml等)を旧プロジェクトからコピー
- wwwディレクトリを旧プロジェクトからコピー
- AndroidManifest.xmlをマージ
cordova build android
- Android Studioでsyncしてチェック、gradleプラグインの更新、build.gradle等修正
cordova build android --release --prod
- META-INF/内の不要なファイルを削除して再パッケージ化して署名してgoogle playにアップロード
自分は主にCLIでビルドしているのですが、今回は11.のAndroidStudioを使った作業が余計なトラブルを招いたようです。
追記
結構この記事へのアクセスがあるので追記しておきます。
このサイトに書かれているように、gradleのバージョンとAndroid Studioで使うgradleプラグインのバージョンを合わせておかないとビルドに失敗するということです。
先日もgradleのバージョンを上げて(6.0.1)ビルドすると以下のエラーが出ましたが、
A problem occurred configuring project ':app'.
> Failed to notify project evaluation listener.
> org.gradle.api.file.ProjectLayout.directoryProperty(Lorg/gradle/api/provider/Provider;)Lorg/gradle/api/file/DirectoryProperty;
AndroidStudioを立ち上げて[File] -> [Project Structure] -> [Android Gradle Plugin Version]でgradleプラグインのバージョンを3.3.0
から3.5.3
に上げると、エラーは消えてCLI上でのgradleを使ったビルドにも成功しました。