私がアプリをリリースする前に毎回確認している5つの項目

個人でAndroidアプリを開発・配信しています。
本投稿では、AndroidアプリをGoogle Playにリリースする際に、確認している5つの項目をご紹介します。特に、リリース済みのアプリをアップデートする際に確認すべき項目です。

ご存知の方にとっては、当たり前の内容になるかと思います(^-^;)
しかし個人では、充分に網羅したテストを実施することは難しく、特に言語や端末に依存したバグは見落としやすいです。また更新漏れにより誤った情報を公開してしまうこともあります。
下記をリリース前に確認することで、少なくとも上述のバグ混入は防げるかと思います。

もっと他に確認すべき事項があればご助言頂けると幸いです。

# アプリのバージョンが正しいか

言うまでもありませんが、ユーザーに表示される値なので重要です。
build.gradeの`versionName`でバージョン値を指定できるので、この値がリリースの度に正しく指定されているかを確認します。（例 1.1 → 1.2にインクリメントされているか）

【補足】`versionCode`の方は変更を忘れた場合、Google Playでapkをアップロードする際に弾いてくれるため否が応でもインクリメントする必要があります。

```build.gradle
android {
    defaultConfig {
        versionCode 3
        versionName "1.2"
    }
}
```

# string.xmlに漏れがないか

多言語対応しているアプリでは、下記のように複数のstring.xmlを保持していると思います。文字列を追加・変更する際に、すべてのstring.xmlで定義されていることを確認します。
Git等のバージョン管理システムで、差分を確認できるとわかりやすいです。

例えば、下記のように`res/values-en/strings.xml`に追加漏れがあった場合、言語設定が英語に設定されている端末では`res/values/strings.xml`の値が表示されます。
（下記の場合はデフォルトが英語なので問題ありませんが^^;）

余談ですが、私が機能開発で文字列を追加する際は、まず日本語の`string.xml`だけに追加していき、開発が完了した後にまとめて各言語の`string.xml`に追加するようにしています。

```xml:res/values/strings.xml
<resources>
    <string name="comic_hagaren">Full Metal Alchemist</string>
    <string name="comic_arslan">The Heroic Legend of Arslan</string>
</resources>
```

```xml:res/values-en/strings.xml
<resources>
    <string name="comic_hagaren">Full Metal Alchemist</string>
    <!-- 例えば、ここに存在すべき"comic_arslan"の追加を忘れてしまう -->
</resources>
```

```xml:res/values-ja/strings.xml
<resources>
    <string name="comic_hagaren">鋼の錬金術師</string>
    <string name="comic_arslan">アルスラーン戦記</string>
</resources>
```

# レイアウトのリソースファイルに漏れがないか

前述の文字列と同じ話です。

タブレット端末等もサポートする場合は、下記のように画面サイズごとにレイアウトリソースファイルを作成します。
画面／画面要素を追加・変更する際に、すべての全サイズに存在することを確認します。

- `res/layout/activity_main.xml`
- `res/layout-sw600dp/activity_main.xml`
- `res/layout-sw600dp-w720dp/activity_main.xml`
- `res/layout-sw720dp/activity_main.xml`
- `res/layout-w600dp/activity_main.xml`

例えば、`R.id.new_btn`要素が特定のサイズで定義されていない場合、下記のコードのようにJavaからそのButtonを参照するとアプリが落ちてしまいます。

```java:Example.java
 ((Button) findViewById(R.id.new_btn)).setOnClickListener(this); // アプリが落ちる
```

参考： 複数画面をサポートする | Android Developers
https://developer.android.com/guide/practices/screens_support.html

# 更新履歴が最新に反映されているか

アプリ内で更新履歴を表示するアプリも多いかと思います。
更新履歴を管理する手段は色々あると思いますが、私は下記のようにassetsフォルダに配置したtxtファイルで管理しており、これを読み込んでアプリに表示しています。
更新履歴に限らず、アプリ内の静的なコンテンツはなるべくassetsフォルダに集約し、Git等でバージョン管理することで更新漏れを減らすことができるのではないかと思います。

![popnApp - [C__Users_kazu_AndroidStudioProjects_popnApp] - [app] - ..._app_src_main_java_jp_co_kakakaka_poplab_activity_CalculateSuddenActivity.java - Android Studio 2.0_20171202_202829.png](https://qiita-image-store.s3.amazonaws.com/0/214985/ad3b3c61-107c-c75c-ada3-f617f21eff33.png)


# リリースビルドしたアプリで動作確認したか

**これが一番重要です。**
私のように、特に意識せずに`build.gradle`でビルドタイプを指定している場合、リリースビルドしたアプリでは特定の機能が動作しないバグに遭遇します。

これはproguardが関係している可能性が高いです。例えば、外部ライブラリを使用する場合に`proguard-rules.pro`に必要な記載が抜けているとアプリが正常に動作しません。
具体的に、私はDropboxやGoogle DriveのAPIを使用した際に、この問題に直面しました。

そのため、リリースビルドしたアプリでも必ず動作確認するようにします。勿論、`build.gradle`の定義そのものを変更するのもありだと思います。

```build.gradle
android {
    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
```

# まとめ
これら5つの項目を習慣づけて確認することで、言語・端末・ビルドタイプに依存した問題、及び更新忘れを防止できると思います。

- アプリのバージョンが正しいか
- string.xmlに漏れがないか
- レイアウトが全サイズに適用されているか
- 更新履歴が最新に反映されているか
- リリースビルドしたアプリで動作確認したか