androidアプリのapkのビルドと、リリース手順メモ

##はじめに
cordovaを使ったアプリ開発で、初めてAndroidをリリースする為、
今後の必ず忘れると思うのでアプリのビルド方法と、リリース方法をメモしておきます。

##アプリをビルド

まずリリース用のアプリをビルドする。

通常の場合

```
cordova build --release
```
crosswalkを使った場合
(プロジェクトのルートディレクトリに移動後）

```
cordova/build --release

```

プロジェクト/bin/hogehoge-release-unsigned.apkが書き出される。


####ビルドする前にチェック
スマホのみに限定や、対応バージョンの設定などを確認して、設定を変更する。
<a href="http://dev.classmethod.jp/smartphone/android/android-tips-18-install-target/"> インストール可能な端末を限定する</a>

##鍵を作成

```
keytool -genkey -v -keystore <鍵ファイル名> -alias <エイリアス名> -keyalg RSA -validity <有効期間>
```

####下記の鍵を作成する場合。
有効期間：10000日間
鍵ファイル名：.keystore
エイリアス名：test
```
keytool -genkey -v -keystore .keystore -alias test -keyalg RSA -validity 10000
```
※鍵ファイル名は「test.keystore」のような設定も可能

鍵生成コマンド実行後、下記QAを進める。
パスワードは忘れないようにメモしておく。

**・・・でよろしいですか。**の後は、**「y」**を入力。

>キーストアのパスワードを入力してください:
>新規パスワードを再入力してください:
>姓名は何ですか。
>  [Unknown]:  test
>組織単位名は何ですか。
>  [Unknown]:
>組織名は何ですか。
>  [Unknown]:
>都市名または地域名は何ですか。
>  [Unknown]:
>都道府県名または州名は何ですか。
>  [Unknown]:
>この単位に該当する2文字の国コードは何ですか。
>  [Unknown]:
>CN=asumo, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknownでよろしいですか。
>  [いいえ]:y
>testの鍵パスワードを入力してください
>	(キーストアのパスワードと同じ場合はRETURNを押してください):

####鍵の確認方法

```
keytool -list -v -keystore <鍵ファイル名> -storepass <パスワード>
```

##署名を作成する

署名を作成し、鍵、アプリを紐付ける。

```
jarsigner -verbose -keystore <鍵ファイル名> <apkファイル> <エイリアス名>
```
####下記の署名を作成する場合。
鍵ファイル名：.keystore
エイリアス名：test
apk名:test-release-unsigned.apk
※apkは、binディレクトリ内にあり、鍵ファイルの階層とは別にある

```
jarsigner -verbose -keystore .keystore ./bin/test-release-unsigned.apk test
```
署名作成後に下記警告が発生する場合がある。
>警告:
>-tsaまたは-tsacertが指定されていないため、このjarにはタイムスタンプが付加されていません。タイムスタンプがないと、署名者証明書の>有効期限(2042-12-15)後または将来の失効日後に、ユーザーはこのjarを検証できない可能性があります。

####解決方法
下記を追加する

```
-tsa http://timestamp.digicert.com
```
こちらのコマンドを実行

```
jarsigner -verbose　-tsa http://timestamp.digicert.com -keystore <鍵ファイル名> <apkファイル> <エイリアス名>
```


####署名の確認方法

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

##アプリを最適化する
zipalignコマンドで最適化する

```
zipalign -v 4 <元のapkファイル> <最適化後のapkファイル>
```
もし下記のエラーがでた場合、Android SDK ManagerからBuild-toolsをインストールする。

```
bash: zipalign: command not found
```

私の場合下記にzipalignコマンドがありました。

```
/Applications/adt-bundle-mac-x86_64-20140702/sdk/build-tools/2X.XX/zipalign
```

####なぜ最適化する必要があるのか？

下記から引用

<a href="http://qiita.com/kazuqqfp/items/8eae69e309c6ed75d661" target="_blank">Androidにおいてなぜzipalignをやる必要があるのか</a>
>配布するapkファイルはzipalignコマンドで最適化する事が推奨されており、
>最適化されていないapkファイルをgoogleのディベロッパーコンソールでアップしようとすると警告が出る。
>

##アプリが最適化されているか確認する

最適化されていれば、「Verification succesful」と表示される。

```
zipalign -c -v 4 <apkファイル>
```

##リリースファイルを実機で確認

リリースビルドしたファイルは、リリース前に実機でも必ず確認する。

##Google Play デベロッパー コンソールにログイン

<a href="https://accounts.google.com/ServiceLogin?service=androiddeveloper&passive=1209600&continue=https://play.google.com/apps/publish/?hl=ja&followup=https://play.google.com/apps/publish/?hl=ja&hl=ja" target="_blank">Google Play デベロッパー コンソール</a>

Google Playに必要情報を入れていきます。

####①アプリの追加
メニューの「すべてのアプリのページ>新しいアプリを追加」を押す

新規アプリを追加する

タイトル（アプリ名）入力して「ストアの掲載情報を準備」を押す

![すべてのアプリ   Google Play Developer Console.png](https://qiita-image-store.s3.amazonaws.com/0/11290/c2c5a4b7-1279-fd0c-3c0c-d616e67ca27c.png)

####②ストアの掲載情報、コンテンツのレーティング、価格と販売配布地域を入力する

![ストアの掲載情報   asumo   Google Play Developer Console.png](https://qiita-image-store.s3.amazonaws.com/0/11290/99bcc15b-e6e8-3d81-e256-22824a5cb6e4.png)

####③apkファイルをアップ
メニューの「APK>製品版」を押し、「製品版に最初のAPKをアップロード」を選択。

![APK   asumo   Google Play Developer Console.png](https://qiita-image-store.s3.amazonaws.com/0/11290/0bc51532-267a-4139-18da-24ee18ab5a75.png)

####④アプリを公開
![APK   asumo   Google Play Developer Console.png](https://qiita-image-store.s3.amazonaws.com/0/11290/e34a0080-6cbf-39cb-3376-79496c052f85.png)

必要情報が全て入力済みの場合、アプリを公開が活性化します。
アプリを公開ボタンをクリックすると2時間ほどでgoogle Playに表示されます。

アプリを公開が非活性の場合は、「公開できない理由」を参考に必要情報を入力します。

#####■注意
通常の「標準公開」の場合は、公開処理後すぐにgoogle Playに公開されます。
すぐに公開したくない場合は、「時限公開」を選択してください。
下記が参考になります。
><a href="http://qiita.com/konifar/items/4f8da43e98c573ceb7c4">Google Play Developer Consoleの時限公開機能を試してみた</a>

##arm/x86のapkファイルを同じアプリでリリースする
今回一番調べたかったのはこれです。

crosswalkでビルドする際に、armとx86で別々にビルドする必要あります。
その際に、同一のアプリとして複数のapkを登録するには、
apkを登録時に**アドバンスモード**で登録します。

複数登録すると下記のようになります。
キャプチャのメッセージにあるように、armとx86の両方に対応している端末は、versionCodeの高いものが優先されます。
下記の場合はx86が優先されます。

![APK   エレファンタ・スティックアタック7   Google Play Developer Console.png](https://qiita-image-store.s3.amazonaws.com/0/11290/2a22795b-895b-aa47-192c-4ad3010820fe.png)


シンプルモードの場合、versionCodeが高いものが優先されて公開され、
versionCodeの低いものは無効となります。

##その他

###◎versionCodeについて
AndroidManifest.xmlに定義されている**versionCode**は、アプリをアップデートする際は必ず前回より大きくなっていなければならない。
付け方に特に決まりはなく、下記のようなドットで区切ったものでも大丈夫。

```
android:versionCode="1.1" 
```

####追記
versionCodeをドットで区切った場合、下記のエラーが発生しました。

```
Error: Float types not allowed (at 'versionCode' with value '1.2').
```

###◎アプリのアイコン書き出しに便利なツール
<a href="http://makeappicon.com/download/9011b9a3766c46f79119c6c5a5d12f5d">MakeAppicon</a>