Android 11 プラットフォームには、アプリに影響を与える可能性のある動作変更が含まれています。下記の動作変更は、targetSdkVersion
に関係なく、Android 11 上で稼働するすべてのアプリに適用されます。該当する場合は、アプリをテストし、必要に応じて修正して、適切に対応してください。
Android 11 をターゲットとするアプリにのみ影響する動作変更のリストについても必ずご確認ください。
プライバシー
Android 11 では、ユーザーのプライバシーを強化するために、以下のような変更や制限が導入されています。
- 1 回だけのアクセス許可: 位置情報、マイク、カメラへの一時的なアクセス権を付与するオプションをユーザーに提供します。
- 権限ダイアログの表示: アクセス許可が複数回拒否されると、[次回から表示しない] が選択されたことになります。
- データアクセスの監査: アプリ固有のコードと依存ライブラリのコードの両方で、アプリがプライベート データにアクセスする場所に関する分析情報を取得します。
- システム アラート ウィンドウの権限: アプリの特定のクラスには、リクエストに応じて
SYSTEM_ALERT_WINDOW
権限が自動的に付与されます。また、ACTION_MANAGE_OVERLAY_PERMISSION
インテントのアクションが指定されたインテントは、常にユーザーをシステム設定の画面に移動します。 - 永続的な SIM ID: Android 11 以降では、リセット不可能な ICCID に対する
getIccId()
メソッドを介したアクセスは制限されています。このメソッドは null 以外の空白文字列を返します。デバイスに装着されている SIM を一意に識別するには、代わりにgetSubscriptionId()
メソッドを使用します。サブスクリプション ID は、装着済みの SIM(物理 SIM、電子 SIM など)を一意に識別するためのインデックス値(1 から開始)を提供します。この識別子の値は、デバイスが初期状態にリセットされない限り、特定の SIM に対して安定的な値を示します。
詳細については、プライバシーに関するページをご覧ください。
接触通知システム
Android 11 は、濃厚接触の可能性を通知するシステムを考慮してプラットフォームを更新します。ユーザーは、デバイスの位置情報の設定を有効にしなくても、Android 11 で濃厚接触の可能性を通知するアプリを実行できるようになりました。これは、濃厚接触の可能性を通知するシステムのみの例外です。このシステムを利用するアプリが、Bluetooth スキャンによってデバイスの位置情報を推測できないように設計されているためです。
ユーザーのプライバシーを保護するため、他のすべてのアプリでは、デバイスの位置情報の設定がオンになっており、ユーザーが位置情報へのアクセスを許可していない限り、従来どおり Bluetooth スキャンが禁止されます。詳しくは、濃厚接触の可能性を通知するシステムに関する更新(記事)をご覧ください。
セキュリティ
SSL ソケットはデフォルトで Conscrypt SSL エンジンを使用する
Android の SSLSocket
のデフォルト実装は Conscrypt をベースとしています。Android 11 以降、この実装は Conscrypt の SSLEngine
の最上位に組み込まれます。
Scudo 強化アロケータ
Android 11 は内部で、ヒープ割り当ての処理に Scudo 強化アロケータを使用します。Scudo はメモリの安全性に関する一部の種類の違反を検出して緩和する機能を備えています。Scudo 関連のクラッシュ(たとえば、Scudo ERROR:
)がネイティブ コードでのクラッシュ レポートで報告される場合は、Scudo に関するトラブルシューティングのドキュメントをご覧ください。
アプリの使用統計情報
ユーザーの保護を強化するため、Android 11 では、各ユーザーのアプリの使用統計情報を認証情報暗号化ストレージに保存します。したがって、システムもアプリもそのデータにアクセスできるのは、isUserUnlocked()
が true
を返す場合のみで、これは、次のいずれかが行われた後になります。
- システムの起動後、ユーザーが初めてデバイスのロックを解除する。
- ユーザーがデバイス上のアカウントに切り替える。
アプリがすでに UsageStatsManager
のインスタンスにバインドされている場合は、ユーザーがデバイスのロックを解除した後に、アプリがこのオブジェクトのメソッドを呼び出すことを確認します。そうでない場合、API は null または空の値を返すようになりました。
5G のエミュレータ サポート
Android 11 では 5G API が追加され、アプリで最先端の機能を追加できます。追加した機能をテストするために、Android SDK エミュレータの新しい機能を使用できます。新しい機能は、エミュレータ バージョン 30.0.22 で追加されました。5G ネットワーク設定を選択すると、TelephonyDisplayInfo
が OVERRIDE_NETWORK_TYPE_NR_NSA
に設定され、推定帯域幅が変更されます。また、NET_CAPABILITY_TEMPORARILY_NOT_METERED
ステータスの変化にアプリが適切に応答することを確認できます。
パフォーマンスとデバッグ
JobScheduler API 呼び出しの制限のデバッグ
Android 11 ではデバッグのサポートとして、JobScheduler
API の呼び出しが特定のレート制限を超えた可能性をアプリが特定できるようにしています。デベロッパーはこの機能を利用して、パフォーマンスの潜在的な問題を特定できます。debuggable
マニフェスト属性を true に設定しているアプリでは、JobScheduler
API 呼び出しがレート制限を超えると RESULT_FAILURE
が返されます。正当なユースケースが影響を受けないように制限が設定されます。
ファイル記述子サニタイザー(fdsan)
Android 10 で fdsan
(ファイル記述子サニタイザー)が導入されました。
fdsan
は、use-after-close や double-close など、ファイル記述子のオーナー権限の処理の誤りを検出します。Android 11 では fdsan
のデフォルト モードが変更されています。fdsan
はエラーを検出すると中断するようになります。以前は、警告をログに記録して、続行していました。アプリで fdsan
が原因でクラッシュが発生する場合は、fdsan documentation
をご確認ください。
非 SDK インターフェースの制限
Android 11 では、Android デベロッパーの協力や最新の内部テストに基づいて、制限対象となる非 SDK インターフェースのリストが更新されています。Google は、非 SDK インターフェースを制限する前に、可能な限り、その代わりとなる公開インターフェースを利用可能にしています。
Android 11 をターゲットとしないアプリの場合、この変更内容の一部は、すぐに影響するとは限りません。ただし、現時点で(アプリのターゲット API レベルに応じて)一部の非 SDK インターフェースを利用できていても、非 SDK のメソッドまたはフィールドをそのまま使用し続けると、将来的にアプリが機能しなくなるリスクが高くなります。
アプリが非 SDK インターフェースを使用しているかどうか不明な場合は、アプリをテストして確認できます。アプリが非 SDK インターフェースに依存している場合は、SDK の代替インターフェースへの移行を計画してください。ただし Google も、一部のアプリには非 SDK インターフェースを使用する正当なユースケースがあると承知しています。アプリの機能で使用している非 SDK インターフェースの代替インターフェースが見つからない場合は、新しい公開 API をリクエストしてください。
Android の今回のリリースの変更点について詳しくは、非 SDK インターフェースの制限に関する Android 11 での変更点をご覧ください。非 SDK インターフェース全般について詳しくは、非 SDK インターフェースの制限をご覧ください。
マップ v1 共有ライブラリの削除
Android 11 ではマップ共有ライブラリの V1 が完全に削除されました。このライブラリはすでにサポートが終了し、Android 10 のアプリでは機能しなくなっています。Android 9(API レベル 28)以下を実行するデバイスでこの共有ライブラリに依存していたアプリでは、代わりに Maps SDK for Android を使用してください。
他のアプリとの連携
コンテンツ URI の共有
アプリが別のアプリとコンテンツ URI を共有する場合、インテントでインテント フラグ(FLAG_GRANT_READ_URI_PERMISSION
、FLAG_GRANT_WRITE_URI_PERMISSION
)のうち少なくとも 1 つを設定して、URI アクセス権限を付与する必要があります。これにより、別のアプリが Android 11 をターゲットとしている場合でも、コンテンツ URI にアクセスできます。アプリの所有でないコンテンツ プロバイダにコンテンツ URI が関連付けられている場合でも、アプリにインテント フラグを含める必要があります。
アプリがコンテンツ URI に関連付けられているコンテンツ プロバイダを所有している場合は、コンテンツ プロバイダがエクスポートされていないことを確認します。この操作は、セキュリティに関するおすすめの方法として以前から推奨しています。
ライブラリの読み込み
絶対パスで ICU 共通ライブラリを読み込む
API 28 以前をターゲットとするアプリは、dlopen(3)
を使用して、絶対パス「/system/lib/libicuuc.so」で libicuuc
を読み込むことはできません。このようなアプリの場合、dlopen("/system/lib/libicuuc.so", ...)
は null ハンドルを返します。
代わりに、ライブラリを読み込むには、ライブラリ名をファイル名として使用してください(例: dlopen("libicuuc.so", ...)
)。