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に対応していなくてビルド出来なかったのですが、この記事の通りにソースを修正したら問題なくビルド出来ました。助かりました:smile:

    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.propertiesandroid.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した時に以下のダイアログが表示されて

    Gradle Plugin 更新ダイアログ

     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の編集も必要なくすんなりリリース出来ました。

    移行手順

     昔の記事にも書いていますが、移行するときは新規にプロジェクトを作り直して、自分が作ったソースファイルやリソースファイルを後からプロジェクトに追加するのがトラブルを避ける手っ取り早い方法だと思います。それでもいつも何かが起きますが…。
     今回自分がやったのは、以下のような手順です。

    1. cordova createで新規プロジェクト作成
    2. アイコン等のresouceディレクトリを旧プロジェクトからコピー
    3. google-services.json、config.xmlを旧プロジェクトからコピー
    4. config.xmlファイルからプラグインの記述を削除(デフォルトのconfig.xmlに記述されているwhitelistプラグインはそのまま)
       ※Cordova 9 からプラグインはpackage.jsonファイルで管理されます
    5. cordova platform add android@latest
    6. 旧プロジェクトで使用していたCordova9対応済みのプラグインを一つずつcordova plugin addする
    7. アプリのアイコン等に使用するリソースファイル(string.xml等)を旧プロジェクトからコピー
    8. wwwディレクトリを旧プロジェクトからコピー
    9. AndroidManifest.xmlをマージ
    10. cordova build android
    11. Android Studioでsyncしてチェック、gradleプラグインの更新、build.gradle等修正
    12. cordova build android --release --prod
    13. 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を使ったビルドにも成功しました。