Apache Cordovaのアップグレードに四苦八苦した話

  • 1
    いいね
  • 0
    コメント

はじめに

長年放置していたアンドロイドアプリをアップデートしようとしたら、下記のメッセージが出てアップデートができない。cordovaライブラリのバージョンに脆弱性があるので、ライブラリのバージョンを上げないとアプリをアップデートできないとのこと。

2015/08/31以降、Google Play では Apache Cordova の 3.5.1 より前のバージョンを使用する新しいアプリやアップデートの公開をすべてブロックします(詳しくは下記をご覧ください)。

今のcordovaのバージョンは2.6.0、かなり古いなー、、(汗)
というわけで、cordovaのバージョンを上げてみる。小さなアプリなので、cordovaアプリを新規で作成してから、元のプロジェクトのファイルを上書きするという方針でいくことにした。GUIツールは使わずにコンソールで作業する。

手順

cordova CLIをインストール

npm install cordova してから、
ln -s ~/node_modules/cordova/bin/cordova /usr/local/bin でパスを通す。
ちなみに公式ドキュメントはこちら。https://cordova.apache.org/docs/ja/latest/guide/cli/ 日本語やばい。「人造人間 SDK」とか胸熱。

cordovaプロジェクトを作成

    $ cordova create hello com.example.hello HelloWorld
    $ cd hello
    $ cordova platform add android
    $ cordova prepare              # or "cordova build"

cordova preparecordova buildの違いは、コンパイルまでするかどうか。他のSDKでビルドする場合はprepareでOK。

上のコマンドを実行すると以下のエラーが出たので、Android StudioからAndroid SDK Platform 24をインストール。

  • What went wrong: A problem occurred configuring root project 'android'. You have not accepted the license agreements of the following SDK components: [Android SDK Platform 24].

元のプロジェクトから必要なファイルをコピー

今回は、
- www
- drawable(アイコン)
- values(stringsファイル)をコピーした。
cp -r original_app/assets/www/* new_app/www/
cp -r original_app/res/drawable* new_app/platforms/android/res/
cp -r original_app/res/values/* new_app/platforms/android/res/values/

drawable-*を作成したら、自動でres/midmap-*というディレクトリが作られてアイコンがコピーされていた。調べてみると、android4.0からはdrawbleではなく、midmapの使用が推奨されているらしい。とりあえず今回はdrawableのままでいく。

ちなみにAndroidマニフェストを上書きすると、こんなエラーが出た。他にもいろいろエラーが出たので、元のプロジェクトからマニフェストを上書きするとうまくいかないと思う。新しいマニフェストを基本に必要な箇所を追加していくのが吉。 

  • What went wrong: Execution failed for task ':processDebugManifest'. Manifest merger failed : uses-sdk:minSdkVersion 7 cannot be smaller than version 14 declared in library [android:CordovaLib:unspecified:debug]

アイコンを変更

config.xmlを変えただけだと、ランチャーアイコンがcordovaのデフォルトのまま。AndroidManifestにandroid:icon="@drawable/icon"を指定すると、ランチャーアイコンが表示された。

config.xml
    <platform name="android">
        <allow-intent href="market:*" />
        <icon src="platforms/android/res/drawable-ldpi/icon.png" density="ldpi" />
        <icon src="platforms/android/res/drawable-mdpi/icon.png" density="mdpi" />
        <icon src="platforms/android/res/drawable-hdpi/icon.png" density="hdpi" />
        <icon src="platforms/android/res/drawable-xhdpi/icon.png" density="xhdpi" />
    </platform>
platforms/android/AndroidManifest.xml
<application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:supportsRtl="true">

実行してみる

cordova run android
cordova run android --device(実機の場合)

無事に動いたので、アプリのバージョンを上げる。

config.xml
-<widget id="..." version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+<widget id="..." version="1.1.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
platforms/android/AndroidManifest.xml
-<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="..." xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest android:hardwareAccelerated="true" android:versionCode="10100" android:versionName="1.1.0" package="..." xmlns:android="http://schemas.android.com/apk/res/android">

APKを作成

こちらを参考に: http://phiary.me/cordova-android-release-build-apk-for-google-play/

まずはリリース用をビルドする。
cordova build android --releaseで、
platforms/android/build/outputs/apk/android-release-unsigned.apkに署名前のAPKが作成される。

次に、jarsigner -verbose -keystore android.keystore android-release-unsigned.apk app_nameで、署名を付ける。
このとき、

Enter Passphrase for keystore:
Enter key password for app_name:

と聞かれるが、ずいぶん前のことなのでパスワードを忘れていた。気合いで何とか思い出した。。。

jarsigner -verify -verbose -certs android-release-unsigned.apk
で署名を確認できる。

最後に、zipalignをしてAPKが完成。ちなみにzipalignとは、androidのデータアクセスを最適化するための処理。
~/Library/Android/sdk/build-tools/25.0.2/zipalign -v 4 android-release-unsigned.apk android-release.apk

あとはストアにAPKをアップロードだけ。お疲れ様でした!

おわりに

昔はPhoneGapという名前だったような・・・と思って調べてみたら、PhongeGapを開発していた会社がアドビに買収されて、アドビからApacheに寄贈されてという流れらしい。ふーん。

この投稿は Android Advent Calendar 201615日目の記事です。