ローカル エリア ネットワーク(LAN)上のデバイスには、INTERNET
権限を持つアプリからアクセスできます。これにより、アプリはローカル デバイスに簡単に接続できますが、ユーザーのフィンガープリントの作成や位置情報のプロキシなど、プライバシーに関する影響もあります。
ローカル ネットワーク保護プロジェクトは、新しいランタイム権限によってローカル ネットワークへのアクセスを制限することで、ユーザーのプライバシーを保護することを目的としています。
影響
Android 16 では、この権限はオプトイン機能です。つまり、オプトインしたアプリのみが影響を受けます。オプトインの目的は、アプリのどの部分が暗黙的なローカル ネットワーク アクセスに依存しているかをアプリ デベロッパーが把握し、将来の Android リリースでそれらの部分を権限で保護する準備をできるようにすることです。
アプリが次の方法でユーザーのローカル ネットワークにアクセスする場合、アプリは影響を受けます。
- ローカル ネットワーク アドレス(
Multicast DNS (mDNS)
やSimple Service Discovery Protocol (SSDP)
など)でのロー ソケットの直接使用またはライブラリ使用。 - ローカル ネットワークにアクセスするフレームワーク レベルのクラス(
NsdManager
など)の使用。
影響の詳細
ローカル ネットワーク アドレスとの間のトラフィックには、ローカル ネットワーク アクセス権限が必要です。次の表に、一般的なケースを示します。
アプリの低レベル ネットワーク オペレーション | ローカル ネットワークへのアクセス権が必要です |
---|---|
アウトバウンド TCP 接続を行う | はい |
受信 TCP 接続を受け入れる | はい |
UDP ユニキャスト、マルチキャスト、ブロードキャストの送信 | はい |
受信 UDP ユニキャスト、マルチキャスト、ブロードキャスト | はい |
これらの制限はネットワーク スタックの奥深くに実装されているため、すべてのネットワーク API に適用されます。これには、プラットフォームまたはマネージド コードで作成されたソケット、Cronet や OkHttp などのネットワーキング ライブラリ、それらの上に実装された API が含まれます。.local
接尾辞を持つローカル ネットワーク上のサービスを解決するには、ローカル ネットワークの権限が必要です。
上記のルールの例外:
- デバイスの DNS サーバーがローカル ネットワーク上にある場合、そのサーバーとの間のトラフィック(ポート 53)にはローカル ネットワーク アクセス権限は必要ありません。
- アプリ内ピッカーとして出力スイッチャーを使用するアプリは、ローカル ネットワーク権限を必要としません(詳細なガイダンスは今後のリリースで提供予定です)。
ガイダンス
ローカル ネットワークの制限を有効にする手順は次のとおりです。
- Android 16 ベータ版 3 以降のビルドにデバイスを書き込む
- テスト対象のアプリをインストールする
adb を使用して Appcompat 構成を切り替える
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
デバイスを再起動する
これで、アプリのローカル ネットワークへのアクセスが制限され、ローカル ネットワークにアクセスしようとするとソケット エラーが発生します。アプリのプロセス外でローカル ネットワーク オペレーションを実行する API(NsdManager
など)を使用している場合、オプトイン中に影響を受けることはありません。
アクセス権を復元するには、アプリに NEARBY_WIFI_DEVICES
権限を付与する必要があります。
- アプリの
manifest
でNEARBY_WIFI_DEVICES
権限が宣言されていることを確認します。 - [設定] > [アプリ] > [[アプリ名]] > [権限] > [付近のデバイス] > [許可] に移動します。
これで、アプリのローカル ネットワークへのアクセスが復元され、アプリを有効にする前と同じようにすべてのシナリオが動作するはずです。アプリのネットワーク トラフィックへの影響は次のとおりです。
権限 | アウトバウンド LAN リクエスト | アウトバウンド/インバウンドのインターネット リクエスト | インバウンド LAN リクエスト |
---|---|---|---|
許可 | Works | Works | Works |
Not Granted(未許可) | ハプニング集 | Works | ハプニング集 |
次のコマンドを使用して、AppCompat 構成を切り替えます。
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
エラー
これらの制限によって発生したエラーは、呼び出し元ソケットがローカル ネットワーク アドレスに対して send
または send
バリアントを呼び出すたびに返されます。
エラーの例:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
バグ
以下の内容について、バグやフィードバックを送信できます。
- LAN アクセスの不一致(特定のアクセスが「ローカル ネットワーク」アクセスと見なされるべきではないと思われる場合)
- LAN アクセスをブロックする必要があるのにブロックされないバグ
- LAN アクセスがブロックされるべきではないのにブロックされるバグ
この変更による影響を受けないものは次のとおりです。
- インターネットへのアクセス
- モバイル ネットワーク