CordovaでAndroidのキーファイルを指定して署名

あらすじ

Androidのアプリケーションを作成する際に、ストアに公開する際にはパッケージを署名する必要があります。

この際に、自分は最初にMonacaで開発を行っていたプログラムいろいろあって(有料プランじゃないと一部プラグインしか追加できない)Cordovaに環境を移行しました。

そこで、Monacaでパッケージを作成していたのに対して、同様にローカルのCordovaでパッケージを作成したさいに、同様のキーファイルを用いて署名する必要がありました。その際のやりかたです。

 

やりかた

前提として、Monacaでキーファイルが生成されているとします。Cordovaでもキーファイルを生成することができますが、すでに公開されているアプリを更新する際などには同様のキーファイルを用いる必要があります。

また、署名にはキーファイルを生成した時に用いた

  • エイリアス: *****
  • エイリアスパスワード: *****
  • キーストアパス: *****

が必要になります。たぶん、1つでも忘れていると署名できなくなるので…諦めて新しいキーファイルを作成して別のアプリとして公開しましょう。。。

 

Monacaでキーファイルをダウンロード

まずは、Monacaで作成したキーファイルをダウンロードしてきます。

monaca-downlord-key-%e3%83%a2%e3%82%b5%e3%82%99%e3%82%a4%e3%82%af

設定… -> Androidキーストアの設定…

と進み、エクスポートをクリックします。すると、Exportというダイアログが用事されるのでエクスポートをクリックします。[keystore.private]がダウンロードされるのでこれを署名に用います。

 

Cordovaでのパッケージ生成方法

参考サイト: Cordova で Android リリースビルドして Google Play リリース用 apk を作る方法 | phiary

hoge という名前のアプリケーションをビルドするとします。

  1. リリースビルドのパッケージを作成
    cordova build android --release
    

    この操作で[ 開発ルート/platforms/android/build/outputs/apk/]にandroid-release-unsigned.apk が生成されます。

  2. 署名
    さきほどのディレクトリに移動して、

    jarsigner -verbose -keystore <ダウンロードしたkeystore.privateを指定> <apkファイル> <エイリアス名> -sigalg SHA1withRSA -digestalg SHA1
    # 例(keystore.privateが同じディレクトリにあるとして)
    # jarsigner -verbose -keystore keystore.private android-release-unsigned.apk HOGE -sigalg SHA1withRSA -digestalg SHA1
    

    この際に

    -tsaまたは-tsacertが指定されていないため、このjarにはタイムスタンプが付加されていません。タイムスタンプがないと、署名者証明書の有効期限(2044-03-05)後または将来の失効日後に、ユーザーはこのjarを検証できない可能性があります。

    と出てきましたが、とりあえず放置しました。(多分ダイジョブでしょ…

    また、署名の確認を以下のコマンドで行うことができます。

    jarsigner -verify -verbose -certs <ファイル>
    

    署名されていないと、最後に

    jarは署名されていません。(シグネチャが見つからないか、構文解析できません)
    

    と出てきます。無事に署名されていると…jarが検証されました。と表示されたあとに上記のタイムスタンプうんぬんの警告が再びでてきました。

  3. 最適化
    以下のコマンドで最適化(圧縮?)を行います。この操作によって、アクセス効率が向上したりする(らしい)
    参考: Androidにおいてなぜzipalignをやる必要があるのか – Qiita

    zipalign -v 4 <元のapkファイル> <最適化後のapkファイル>
    # 例 zipalign -v 4 android-release-unsigned.apk android-release.apk
    # この際のandroid-release-unsigned.apkは先程のコマンドで署名済み
    

    自分の環境ではzipalignにパスが通っていなかったのでパスを通しました。zipalignはandroid sdkのbuild-tools以下にありました。
    (/Users/(ユーザ名)/Library/Android/sdk/build-tools/25.0.0/zipalign)

 

これで署名されたパッケージの完成です。このパッケージをgoogle playにアップロードすることでパッケージを更新することができます。

 

余談

MonacaとCordovaではAndroidのversionCodeの付け方が異なります。バージョンコードとは、通常利用するバージョン(1.0.3みたいなの)とは異なり、Android独自のバージョン?を管理する値です。

Monacaはわかりませんが、Cordovaでは指定しなかった場合に[PATCH + MINOR * 100 + MAJOR * 10000]の式で計算された値が利用されるようです。
(例: 1.12.7なら 7+4*100+1*10000 = 11207)

ここで、自分の場合は0.1.2までMonacaで開発を行い、0.1.3をアップロードしようとした際にversionCodeが増えてないよ的なエラーでパッケージの更新ができませんでした。

Monacaで0.1.2は1028だったかな?と処理されていたので、Cordovaで先程の式で計算すると0.1.3は103となりバージョンが下がってしまいます。)

これは、config.xmlのwidgetタグ内にversionCodeを追加してバージョンを指定することで解決しました。めでたし。

 

参照: Config.xml ファイル – Apache Cordova

 

2017/1/11 追記

古いバージョンのAndroid (4.0~4.3くらい)にインストールする際に103エラーが出てインストールできない問題が発生しました。これに対し、パッケージの署名を行う際に「 -sigalg SHA1withRSA -digestalg SHA1」を追加することで解決しました。
本文中のコマンドもこれに合わせて訂正を行いました。

変更前

jarsigner -verbose -keystore <ダウンロードしたkeystore.privateを指定> <apkファイル> <エイリアス名>

変更後

jarsigner -verbose -keystore <ダウンロードしたkeystore.privateを指定> <apkファイル> <エイリアス名> -sigalg SHA1withRSA -digestalg SHA1

参考サイト:   Android旧機種にアプリをインストールする際、 103 エラー  | さわやかサタデー

Pocket
このエントリーを Google ブックマーク に追加

One thought on “CordovaでAndroidのキーファイルを指定して署名

  1. Pingback: CordovaでCrossWalkを使う。(AjaxをAndroid4.X使う | たくのこ Web

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です