Android11の変更点ピックアップ

初投稿です。

Android11の登場に向けて、優先的に対応しておいた方が良さそうだと思う変更点をピックアップします。
既存アプリへの対応という観点で見ているので、新機能にはあまり触れていません。
（今後もドキュメントの変更に応じて加筆修正するかもしれません）

# 主な情報引用元

Android11上でアプリを動かす際に適応される項目。
https://developer.android.com/about/versions/11/behavior-changes-all?hl=ja

targetSdkVersion=30とした時に適応される項目。
https://developer.android.com/about/versions/11/behavior-changes-11?hl=ja

プライバシー関連。
https://developer.android.com/preview/privacy?hl=ja

ちなみに、上記ドキュメントは更新頻度がそれなりに高いため、定期的にチェックした方が良いです。

# Android11上の変更点

### ファイル記述子サニタイザー（fdsan）
https://developer.android.com/preview/behavior-changes-all?hl=ja#fdsan

`fdsan` が何者かよく理解していないのですが、
> エラーを検出すると中断するようになります。以前は、警告をログに記録して、続行していました。

上記の変更内容が嫌な予感してます。
アプリ自体をクラッシュさせるということであれば、大きな挙動変更点かと思います。
変なメモリ解放とかやっていなければ特に問題はなさげですが、注意ポイントです。

### マップ v1 共有ライブラリの削除

これは `Google Maps Android API v1` のことかと思います。

Android10で機能しなくなり、11で完全に消えるとのことです。
GCPの `Maps SDK for Android` へ移行してくれと注意喚起されています。

対応する `<uses-liblary>` をマニフェストから外さないと、
GooglePlayでユーザーにアプリが表示されない場合があるとのことなので、ちゃんと外しておきましょう。

# targetSdkVersion=30の変更点

### カスタム トーストビューのブロック

デザインをカスタマイズした `toast` を、
バックグラウンドから動かすことができなくなったようです。
代わりに `SnackBar` が推奨されています。

その他、 `text toast` にも変更点があり、
`getView()` 等の一部のメソッドが機能しなくなっています。
詳しくは以下を確認してください。
https://developer.android.com/reference/android/widget/Toast

### APK 署名スキーム v2 が必要

APKをビルドする際、Scheme v1だけでなくv2も署名してくださいとのことです。
Android Studioで署名付きビルドをする際、チェックボックスで選択可能ですね。

Android Studio 2.2（gradle plugin 2.2）以降では、
デフォルトの挙動が `v1 + v2` となっているので、
明示的にスキーム設定を無効にしていなければ、特に心配する必要はありません。
（情報元）
https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.SigningConfig.html （リンク無効ですが一応）
https://developers-jp.googleblog.com/2016/11/understanding-apk-packaging-in-android-studio-2-2.html

（追記）
gradle pluginのバージョンによって、動作が異なるようです。
例えば、v4.0でtargetSdkVersionが24以上、さらにスキームの明示がない場合、v2のみとなります。
minSdkVersion次第では、自動的にv1が付与されることもあるようです。
https://developer.android.com/studio/releases/gradle-plugin?hl=ja#4-0-signing-config

### メディア インテントのアクションにはシステムのデフォルト カメラが必要

以下のintentに対応できるのが、プリインストールのカメラアプリだけになるそうです。

- android.media.action.VIDEO_CAPTURE
- android.media.action.IMAGE_CAPTURE
- android.media.action.IMAGE_CAPTURE_SECURE

### デバイス間のファイル転送

`allowBackup` の挙動が変更される模様です。
アプリのセーブデータ等をバックアップ不可にするとのことで、
FCMの仕様上の都合（registration_idの記録封じ）等で、このフラグを `false` にしている方はそれなりにいらっしゃると思います。

ただ、 `デバイス間` と書かれているので、
同一のOS同士のファイル転送だけが無効化できなくなったのだと思います。
クラウドへのバックアップは問題なく封じることが出来るはずです。

# プライバシー関連

直近一ヶ月の間にも続々と内容が更新され、かつ、例年と比較してボリュームが膨大なので、
特に注視しておいた方が良い項目です。

### 対象範囲別ストレージの適用

targetSdkVersion=30の時、`requestLegacyExternalStorage` フラグが無視されます。
つまり、対象範囲別ストレージが強制的に反映されることになります。
Android10以前のデバイスではフラグは有効なのですが、この点が地味に厄介で、
Android10以前と11以降で、処理を分けなければいけない場面が出てくるかと思います。

最も影響を受けるのはメディアファイルを扱っている場合ですが、ユースケース毎の対応が用意されています。
https://developer.android.com/training/data-storage/use-cases?hl=ja

### 他のアプリのプライベート ディレクトリへのアクセス

表題の通り、他アプリの外部ストレージディレクトリにはアクセスできなくなります。

### 権限

> アプリが Android 11 をターゲットとしている場合、WRITE_EXTERNAL_STORAGE 権限と WRITE_MEDIA_STORAGE 特権の両方で、追加のアクセス権を提供しなくなりました。

徹底的にファイル書き込みを封じに来てますね。
代替っぽい権限として、後述の `MANAGE_EXTERNAL_STORAGE` が追加されていますが。

### すべてのファイルへのアクセス

`MANAGE_EXTERNAL_STORAGE` 権限が追加。
`Added in API level 30` なので、Android11 OSで利用可能。

付与すると、 `他のアプリの専用ディレクトリ以外` であれば、
大抵のディレクトリへの読み書きが出来るようになる模様です。

ただし、プライバシーポリシーに利用制限が存在するので注意が必要です。
これを守らないとAPKファイルのアップロードが出来ない可能性があります。
https://support.google.com/googleplay/android-developer/answer/9956427?hl=ja

# 機能全般

### パッケージの公開設定

targetSdkVersion=30から、他アプリとの連携に `queries` を利用する必要があります。
この項目、そこそこ大きい変更点で他アプリ呼び出し時に制限がかかります。
https://developer.android.com/training/package-visibility/use-cases?hl=ja

Custom URL Scheme（DeepLink）等を利用している場合も動作影響があると思われるので注意です。

なお、問題は他にもあり、

- Android Studio 3.6.1以上
- Android Gradle プラグインの最新リリース（最新ってどの時点のですかね）

この２つがビルド条件に含まれている事の方が大きな影響があります。
特に、Gradle Pluginが一気に新しくなると、
使用できなくなるライブラリがあってもおかしくありません。
今までこまめにアップデートしていれば、問題にならなそうですが。

### OpenGL ES に ANGLE を使用する

OpenGL ES利用時、ベンダーのNativeドライバかVulkanかを選択出来るようなります。
Android 11 beta2.5時点では、初期ドライバがNativeとの事なので、
今のところは影響はないと思われますが、将来的にこちらがデフォルトになる可能性もありそうです。