DXライブラリ＋VCで作ったAndroidアプリをストアに登録する方法

# DXライブラリとは

- 筆者はイラストに動きをつける[アニメーションソフト 9VAeきゅうべえ](https://qiita.com/danjiro/items/253e5a33a38599098274)を C言語で開発している。描画ライブラリを差し替えることで、Windows, Mac, Linux, iOS に移植した。Androidでも C から呼べる描画ライブラリがないか探した結果、Xamarin では不可能（C#ならできる）だが、[DXライブラリ](https://dxlib.xsrv.jp/index.html)ならできることがわかった。
- DXライブラリはゲーム作成用に Windowsで開発されたもので、Android、任天堂Switch、PlayStation 版もあり、今でも更新が続けられているすばらしいソフトだ。
- 日本語ドキュメントがしっかりしており、Android版のサンプルプロジェクト（Visual Studio）をダウンロードし、すぐAndroidアプリを作成し、実機デバッグまでできた。 （[9VAeきゅうべえの移植](http://dnjiro.hatenablog.com/entry/2018/06/19/080049?_ga=2.24976316.701728141.1550397275-1162394806.1528353133)は大変だったが・・・）
- [完成したAPKをネットにアップ](http://dnjiro.hatenablog.com/entry/9vae-android?_ga=2.192569260.701728141.1550397275-1162394806.1528353133)すれば、開発元不明のアプリのインストールを許可するとすぐインストールできた。
- **デバッグ版の開発と公開はとても簡単**だった。すばらしい。


![crab-win.svg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67734/8354ea98-8bb7-29a3-bd93-a3a1d77ca1d2.gif)

- 2021年から、AAB形式でないと、Playストアに登録できなくなった。[Android Studio で作る必要がある。**新しい作り方はこちら**](https://qiita.com/danjiro/items/7c7fae8bc8db916b3818)



# DXライブラリで作ったアプリを Playストアに登録する([以下は古いです。新しい方法はこちら](https://qiita.com/danjiro/items/7c7fae8bc8db916b3818))

ところが、[Google Play Store](https://play.google.com/store/apps) にアプリを登録するにはいろんな知識が必要だった。つまづいた点をあげると

- VisualStudio でAPKに署名する記事は、みな Xamarin 用で、そのとおり実行できない。
- コマンドプロンプトから APK に署名すると、いろんなエラーが出る。
- 結局、VisualStudio のリリースモードで作成しても、デバッグ用の署名がAPKにつくらしい。しかも、デバッグ情報が含まれていてストアにアップできない
- 署名は、 [Google Play アプリ署名](https://support.google.com/googleplay/android-developer/answer/7384423?hl=ja)を使うようにすすめられるが、Visual Studio でなにをすればよいのかわからない。

という状態で、試行錯誤した結果、なんとかできたので、その方法を紹介する。

Google Play Store について、最初は、この記事[「Xamarin.Forms の Android アプリを Google Play にリリースしてみた」](https://ytabuchi.hatenablog.com/entry/2015/08/31/162626)を参考にして始めたが、途中から、Google Play Store のドキュメントだけでリリースまでできた[（参考になったGoogleドキュメント）](https://developer.android.com/guide) アップしたアプリはこちら。

[9VAeきゅうべえ Android版](https://play.google.com/store/apps/details?id=com.qvae)

# VisualStudio で APK に署名する方法

## Release モードの Ant をリリース用にする

VisualStudio のメニューバーの下に「Debug/Release」の切り替えがあり、これを「Release」にすれば、リリースモードになるかと思ったら、Ant がデバッグのままらしい。Ant は、APKを作成する作業で、最初はデバッグ用署名キーしかないので「Release」にしてもデバッグ設定になっている。

1. 右側のソリューションエクスプローラの、asset がはいった Packaging グループの親を右ボタンクリック、プロパティを開く。
2. Ant タブをクリック、構成を「Release」にすると、「Antビルドのターゲット」が「Debug（デバッグキーで署名）」となっているので、これを「Release（リリースモード）」に変更する。
3. これで、実機実行ボタンをクリックすると、.apk がなくて配置できないという、エラーが出る。開発者の署名キー（keystore） がないため署名できず、apk が作成できない。ここで開発者の keystore を用意しないといけないことがわかる。

4. ビルド出力をみると「No key.store and key.alias property found」と表示されている。この情報を property で設定する必要がある。

## keytool を使って、keystore を作成

- 開発者の署名 keysore は、keytool という java コマンドで作成する。
- keystore.exe のフルパスをサーチし、コマンドプロンプトから、次の命令を実行する。

```shell
cd xxxx.keystore を作成する場所に移動

"C:\Program Files\Java\jdk1.8.0_152\bin\keytool" -genkey -v -keystore xxxx.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias xxxx-alias
```

- C:\Program Files\... は、環境によって異なる。
- xxxx.keystore は、作成するキーストアファイル名（Ant のkey.storeに対応）
- xxxx-alias は、署名に必要な alias 名（Ant の key.aliasに対応）

以下の情報の入力が求められる

1. パスワード２回
2. 名前
3. 部署名
4. 所属名
5. 市町村
6. 府県
7. 国名（JP）
8. 「はい」
9. alias のパスワード

これで、xxxx.keystore ファイルが作成できた。

## Ant 用キーストア情報を、property に記述

Ant は、Packagingグループ の中にある **project.properties**ファイル の文字列をみて動作するようだ。この中に次の４行を追記する。xxxxの部分は適当に修正。左側の文字列は、build.xml で定義されている。

```
key.store=C:/xxx/xxx/xxx/xxxx.keystore
key.store.password=xxxxxxxx 
key.alias=xxxx-alias
key.alias.password=xxxxxxxx
```

key.store：keystoreのフルパス（区切りは / ）
key.store.password：最初につけたパスワード 
key.alias=xxxx-alias：alias
key.alias.password：aliasのパスワード

## AndroidManifest にデバッグ禁止を追加

これだけではデバッグ可能の状態であるため、Play Store にアップロードできない。**AndroidManifest.xml** の \<manifest タグに、以下を追加する。


```xml
android:debuggable="false"
```

## AndroidManifest の android:versionCode 確認

- android:versionCode が前回アップしたAPKと同じ場合はアップロードできない。



## 作成したAPKの署名を確認する方法

keytool で確認できる。keytool のパスは環境によって修正

```shell
"C:\Program Files\Java\jdk1.8.0_152\bin\keytool" -list -printcert -jarfile xxxx.apk 

```
これで開発者名が表示され、エラーがなければ、OK

# Google Pay Console に 署名付き APK をアップロード


従来は、自分が署名した、APKを登録すればそれでおわりだったようだが、今は [Google Play アプリ署名](https://support.google.com/googleplay/android-developer/answer/7384423?hl=ja)を使うようにすすめられる。Google Pay Console  の左側の「アプリの署名」をクリックすると説明してくれる。これに同意すると、Googleから提供された証明書を使って、もう一度署名しないといけない。

## keystore にアップロード証明書を追加

1. いったん、自分で署名したAPKをアップロードする。<br>(1)Google Play Console > アプリのリリース<br>(2)内部テスト版トラック＞管理<br>(3)「Googleでアプリ署名キーの管理、保護を行う」＞「次へ」＞「同意する」<br>「ファイルを選択」ここに署名したAPKを入れる<br>ターゲットAPIが低い場合、AndroidManifest.xml の「android:targetSdkVersion」を28以上にする。
2. その情報を使って、Google が開発用証明書（**deployment_cert.der**）とアップロード用証明書（**upload_cert.der**）を作成してくれるのでこれをダウンロードする。（アプリの署名＞「アプリへの署名証明書：証明書をダウンロード」「アップロード証明書：証明書ダウンロード」）
3. アップロード用証明書（**upload_cert.der**）を使って、もう一度、xxxx.keystore を作り直し、以後、このアップロード用 keystore で署名つき APK を作成する。
4. アップロード用 keystore は次のコマンドで作成できるようだ。Googleから取得した「upload_cert.der」と、最初の署名につかった 「xxxx.keystore」を同じ場所にいれて以下を実行。＞パスワード入力＞すでに証明書がありますに対して「はい」。これで、 xxxx.keystore が書き換えられた。

```shell
"C:\Program Files\Java\jdk1.8.0_152\bin\keytool" -importcert -file upload_cert.der -keystore xxxx.keystore

```
この xxxx.keystore を使って、もう一度、APKを作成しなおして、アップロードすると受け付けられた。


# リリースまでの流れ

- Google Pay Console の「リリース管理」のところに、項目がリストされている。必要な項目全部にチェックがつかないと次に進めないようになっており、何が不足しているかわかりやすい。

- 言語の中で英語が何種類もあるが、米国英語を作成すれば、デフォルトが日本語でイギリス英語が未定義でも、米国英語が表示されるようだ。
- 段階的リリースとして、内部、アルファ、ベータ、製品版の順番がある。内部テストはすぐ実行できるように書いてあるが、インストール用のURLアドレスが表示されるまで、少し時間がかかった。このアドレスをメールでテスターに送信すると、それをクリックすれば、ストアに表示されるのと同じ画面でインストールできる。紹介文、タイトル文字、スクリーンショットなどが確認できる。
- テスターの登録は「内部テストトラック」の最初にある。APKをアップしたあと上の「＜」で戻ると「テスターの管理」がありテスターのメールアドレスを「,」で区切って登録する。
- 内部テストが終わって、製品リリースに進もうとすると、１０台、１０種類の Android端末でのテストが完了しており、クラッシュしたとか、ボタンサイズが小さいとか、リリース前レポートができていた。クラッシュした端末をクリックすれば、OSバージョン、メモリ量がわかり、OSの最低バージョンが適当だったかがわかる。
- メモリーが少ない低価格仕様、Android Go では起動できなかった。これは「端末カタログ」から除外できるようだ。メモリー不足で動作しない場合は少ないメモリーの機種を除外できる。

APKアップロードの段階から自動的に受け入れテストを開始しており感心した。


# Androidアプリの64bit版対応について

- 2019年２月にはここに記載した方法で掲載できたが、2019年８月以降は、[64bit版対応しないと受け付けられない](https://pc.watch.impress.co.jp/docs/news/1164859.html)ことになった。
- 64bit対応について、Googleは[Android App Bundle](https://developer.android.com/topic/performance/reduce-apk-size?hl=ja)をつかって32bitと64bitを同時にサポートすることを推奨しているが、Visual Studio で作ることができないようだ。[bundletool](https://developer.android.com/studio/command-line/bundletool)を使うとコマンドラインで作れるかもしれないが、複数の APKから Android App Bundleを作成するツールがないと難しそう。
- ところが32bit用APKと64bit用APKを別々に作成して、いっしょに登録すれば、 64bit 対応の警告なしで公開することができた。

## 32bit版と64bit版APKを同時にアップロードする方法

この方法を「[Multiple APK support](https://sites.google.com/site/androiddevelopersclub/docs/multiple-apk-support)」というらしい。いくつかポイントをメモ。

- DXライブラリは、64bit対応しており、Visual Studio でプラットフォームを「ARM」から「ARM64」に変更するだけで、64bit版APKを作成できた。（ビット演算、ポインタ処理、バイト長など32bit/64bitでソース修正が必要だったが、署名など ソース以外の修正は不要だった。）
- ただし、AndroidManiest.xml について次の修正が必要だった。

|タグ|32bit版|64bit版|
|:--:|:--:|:--:|
|android:versionCode|xxx|xxx+1|
|android:minSdkVersion|21|26|
|android:targetSdkVersion|29|29|

- android:versionCode はアップロードするごとに大きい値にしなければならない。同じ値だと２つ同時にアップロードできない。**小さい値のAPKからアップロードしないといけない**
- targetSdkVersionを２９以上にしないとアップロードできない（2020.8）。
- targetSdkVersionを２８以上にしないとアップロードできない（2019.10）。
- android:minSdkVersion は動作に必要な最低APIレベル。 android:targetSdkVersion は作成するAPIレベル。これらはアプリによって適当な値にすべき（上は 9VAeの例）だが、両方が同じ値だと、後からアップロードしたAPKによって、先にアップロードしたAPKが打ち消されてしまう。上の例だと、32bit版が API21-29, 64bit版が API26-29 として、APIレベルが違うので同時に存在できる。API26-29が重なっているが、そこでは、versionCodeが大きい方が選ばれる。つまり、64bit版のversionCodeを大きくしておけば、64bit版が選ばれることになる。
- Androidには、X86, X64 版もあるため、これらのAPKも同時にあげておくことも考えられるが、Multiple APK で、４つAPKをあげると、ダウンロードサイズが4倍になってしまうようだ。そのため、9VAeは、ARM版、ARM64版しかあげていない。


# アップデートの手順

Google Play Consoleで次の手順で行う


## Google Play Console (1)

### 内部テスト

2. リリース管理＞アプリのリリース
3. 内部テストトラック＞管理＞「リリースを作成」
4. 追加するapkファイルを選択<br>(バージョン番号を新しくしないとアップできない)
5. リリース名、リリース新機能を記述＞「保存」＞「確認」
6. 「内部テストとして段階的な公開を確認」

## Play ストア（テスター）

上の作業で、テスターのスマホで、プレイストアからアプリ更新できるようになる。

2. 左上の「三」ボタン＞マイアプリ＆ゲーム＞リリースしたアプリ＞「更新」＞「開く」＞動作を確認する

## Google Play Console (2)

### リリース前レポート 

1. リリース前レポート＞<br>自動テストの結果が報告される。
2. クラッシュなどがあれば修正し、新しいトラックを追加する

### 製品版の公開

1.  製品版トラック＞管理＞「リリースを作成」
2.  「ライブラリーから追加」
3.  テスト完了したAPKを選択＞「追加」
5. リリース名、リリース新機能を記述して「保存」＞「確認」
6. 「内部テストとして段階的な公開を確認」
- 「製品版として公開を開始」