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

##はじめに
長年放置していたアンドロイドアプリをアップデートしようとしたら、下記のメッセージが出てアップデートができない。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 prepare`と`cordova 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"`を指定すると、ランチャーアイコンが表示された。

```xml: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>
```

```xml: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`（実機の場合）

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

```diff: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">
```

```diff: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に寄贈されてという流れらしい。ふーん。