【Androidアプリ開発者向け】Important reminder about Android targetSdkVersion requirement について調べてみた

# Googleから送られてきたメール

2011年～2013年ごろに[Androidアプリ](https://play.google.com/store/apps/developer?id=hamham)をいくつか作っていて、2015年1月のアップデートを最後に放置していたのですが、先日（2018年8月2日）、Google Play Teamからこんなメールが送られてきました。

> Hello Google Play Developer,

> This is a [reminder](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html) that starting **November 1, 2018**, updates to apps and games on Google Play will be required to target Android Oreo (API level 26) or higher. After this date, the Play Console will prevent you from submitting new APKs with a targetSdkVersion less than 26.

> Configuring your app to target a recent API level ensures that users benefit from significant security and performance improvements, while still allowing your app to run on older Android versions (down to the minSdkVersion).

> **Action required**

> Please ensure that your apps are configured to target at least Android 8.0 (API level 26) by **November 1, 2018**. For technical advice on how to change your app's target API level to meet these requirements, refer to the [migration guide](https://developer.android.com/distribute/best-practices/develop/target-sdk).

> **Affected apps**

> The apps included below have one or more APKs—in production or testing tracks—that aren't currently targeting API level 26 or higher. Apps are listed with the maximum version code and corresponding targetSdkVersion. If you have more than 20 apps that could be affected in your account, please check the [Play Console](https://play.google.com/apps/publish) for a full list.

> foo.bals2　　6　　4
> foo.bar　　19　　4
> foo.bar.atm2　　5　　9
> foo.bar.soudan　　7　　9

英語だったのでまともに読んでなかったのですが、パッケージ名も名指しで**Affected apps**と書いているので、公開中のアプリにも影響があるのではないかと思って調べてみました。

# 数字の意味するところは？

> foo.bar.atm2　　5　　9

左から**「パッケージ名」**、**「versionCodeの値」**、**「targetSdkVersionの値」**になります。
versionCodeはアプリのアップデートごとに整数で増やしていくもので、アプリごとに異なるのであまり関係ないです。
今回のメールは**「targetSdkVersion」の扱いが2018年11月1日から変わる**と言っています。

# targetSdkVersionって？

自分のアプリのコードがどうなってたか見てみました。

```xml:AndroidManifest.xml
    <uses-sdk
        android:minSdkVersion="9"/>
```

```build.gradle
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 9
    }
```

AndroidManifest.xmlでは省略してましたが、build.gradleで勝手に(？)補完されてるようです。
[公式ドキュメント](https://developer.android.com/guide/topics/manifest/uses-sdk-element)によると省略している場合はminSdkVersionに合わせられるとのこと。
> **android:targetSdkVersion**
> アプリのターゲットとなる API レベルを指定する整数。設定しない場合、既定値は minSdkVersion で指定した値になります。

**minSdkVersion**っていうのは**「これ以下のバージョンのAndroid端末にはインストールできないよ！」**っていうのを指定するパラメータです。
「9」というのは「Android 2.3」を示してます。
まあ、いまどきAndroid 2.3以下を使っている人はほぼいないのでほとんどの機種で使えると考えられます。

**targetSdkVersion**っていうのは少しややこしいですが、**「これより上のバージョンのAndroid端末を使っていても互換性を保ってね！」**っていうのを指定するパラメータです。
ここでは「APIレベル9」なので「Android 2.3」の互換性を保ってほしいと言っています。
最近だと、Android 7（APIレベル24）やAndroid 8（APIレベル26）を使っている人が多いと思いますが、それでも**「Android 2.3互換で動かしてね！」**ってことです。

# 2018年11月1日から変わること
**「targetSdkVersionを26以上（Android 8以上）にしないとダメだよ！」**っていうルールになります。
これを守ってないアプリは、アップデートを公開しようとした際にGoogle Playでハネられると考えられます。

自分のアプリを次回アップデートする際は、targetSdkVersionを9（Android 2.3）から26以上（Android 8以上）に変更しなければなりません。**見た目や使える機能も変わるのでいろいろとコードの修正が必要そう**です。



# 既に公開中のアプリに影響あるの？
これが自分が一番知りたかったことです。[日本語のGoogleの公式ブログ](https://developers-jp.googleblog.com/2017/12/improving-app-security-and-performance.html)をみてみます。

> 2018 年 11 月: 既存のアプリのアップデートで、ターゲット API レベル 26 以降が必須になります。
> **この変更はアップデートを行っていない既存のアプリには影響しません。**また、デベロッパーが任意の minSdkVersion を使用できる点は変わらないので、古いバージョンの Android 向けにアプリをビルドできる点も変わりません。

**「アップデートしないアプリは公開停止しちゃうよ！」とは言っていない**ので、アップデートせずに放置する分には引き続き公開されたままになります。
これでちょっと安心しました。

# さいごに
アップデートを放置している開発者にとって今回のアナウンスはヒヤヒヤしました。
Androidのアプリ開発環境周りも数年前からガラりと変わったようなので、そろそろ技術キャッチアップすべく開発再開も考えてみたいと思います。

# 参考URL
- [Google PlayのtargetSdkVersion新ルールを整理する](https://backport.net/blog/2018/04/13/target_sdk_version_new_rule/)
- [AndroidのバージョンとAPIレベルの対応関係](https://so-zou.jp/mobile-app/tech/android/data/api-level/)
- [【Androidアプリ】ターゲットAPIレベルを26にしたら、FileUriExposedExceptionが発生してクラッシュした](https://qiita.com/PET_HAL/items/ea4441a8adf56b4c380a)
- [今後の Google Play でのアプリのセキュリティおよびパフォーマンスの改善について](https://developers-jp.googleblog.com/2017/12/improving-app-security-and-performance.html)
- [基本をおさえる！Androidアプリで指定するバージョンについて(compileSdk,buildToolsVersion,....)](https://qiita.com/takahirom/items/e00126586c13aebf1a6b)