이전 버전과 마찬가지로 Android 16에는 앱에 영향을 미칠 수 있는 동작 변경사항이 포함되어 있습니다. 다음 동작 변경사항은 Android 16 이상을 타겟팅하는 앱에만 적용됩니다. 앱이 Android 16 이상을 타겟팅한다면 이러한 동작을 지원하도록 앱을 수정해야 합니다(적용되는 경우).
앱의 targetSdkVersion과 관계없이 Android 16에서 실행되는 모든 앱에 영향을 미치는 동작 변경사항 목록
도 검토해야 합니다.
사용자 환경 및 시스템 UI
Android 16(API 수준 36)에는 더 일관되고 직관적인 사용자 환경을 만들기 위한 다음 변경사항이 포함되어 있습니다.
더 넓은 화면을 활용하기 위한 선택 해제 옵션 삭제
Android 15에서는 Android 15 (API 수준 35)를 타겟팅하는 앱에 더 넓은 화면을 강제 적용했지만 앱에서 R.attr#windowOptOutEdgeToEdgeEnforcement을 true로 설정하여 선택 해제할 수 있습니다. Android 16 (API 수준 36)을 타겟팅하는 앱의 경우 R.attr#windowOptOutEdgeToEdgeEnforcement가 지원 중단되고 사용 중지되며 앱에서 더 이상 전체 화면 모드를 선택 해제할 수 없습니다.
- 앱이 Android 16 (API 수준 36)을 타겟팅하고 Android 15 기기에서 실행되는 경우
R.attr#windowOptOutEdgeToEdgeEnforcement는 계속 작동합니다. - 앱이 Android 16 (API 수준 36)을 타겟팅하고 Android 16 기기에서 실행되는 경우
R.attr#windowOptOutEdgeToEdgeEnforcement가 사용 중지됩니다.
Android 16에서 테스트하려면 앱이 더 넓은 화면을 지원하는지 확인하고 R.attr#windowOptOutEdgeToEdgeEnforcement 사용을 삭제하여 앱이 Android 15 기기에서도 더 넓은 화면을 지원하도록 합니다. 더 넓은 화면을 지원하려면 Compose 및 Views 안내를 참고하세요.
뒤로 탐색 예측에 마이그레이션 또는 선택 해제 필요
Android 16 (API 수준 36) 이상을 타겟팅하고 Android 16 이상 기기에서 실행되는 앱의 경우 뒤로 탐색 예측 시스템 애니메이션(홈으로 돌아가기, 교차 작업, 교차 활동)이 기본적으로 사용 설정됩니다.
또한 onBackPressed가 호출되지 않고
KeyEvent.KEYCODE_BACK이 더 이상 디스패치되지 않습니다.
앱이 뒤로 이벤트를 가로채고 아직 예측
뒤로로 이전하지 않은 경우 지원되는 뒤로 탐색 API를 사용하도록 앱을 업데이트하거나
앱의 AndroidManifest.xml 파일의
<application> 또는 <activity> 태그에서
android:enableOnBackInvokedCallback 속성을 false로 설정하여 일시적으로 선택 해제합니다.
elegant font API 지원 중단 및 사용 중지
Android 15 (API 수준 35)를 타겟팅하는 앱의 경우 elegantTextHeight
TextView 속성이 기본적으로 true로 설정되어 있어 간결한 글꼴이 가독성이 훨씬 높은 글꼴로 대체됩니다. elegantTextHeight 속성을 false로 설정하여 이를 재정의할 수 있습니다.
Android 16에서는 elegantTextHeight 속성이 지원 중단되며 앱이 Android 16을 타겟팅하면 속성이 무시됩니다. 이러한 API로 제어되는 'UI 글꼴'이 지원 중단되므로 아랍어, 라오어, 미얀마어, 타밀어, 구자라트어, 칸나다어, 말라얄람어, 오디아어, 텔루구어 또는 태국어에서 일관되고 미래에 대비할 수 있는 텍스트 렌더링을 보장하도록 레이아웃을 조정해야 합니다.
elegantTextHeight 속성을 false로 설정하여 기본값을 재정의한 앱의
elegantTextHeight 동작elegantTextHeight 속성을 false로 설정하여 기본값을 재정의하지 않은 앱의
elegantTextHeight 동작핵심 기능
Android 16(API 수준 36)에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.
고정 속도 작업 예약 방식 최적화
Prior to targeting Android 16, when scheduleAtFixedRate
missed a task execution due to being outside a valid
process lifecycle, all missed executions immediately
execute when the app returns to a valid lifecycle.
When targeting Android 16, at most one missed execution of
scheduleAtFixedRate is immediately executed when the app
returns to a valid lifecycle. This behavior change is expected to improve app
performance. Test this behavior in your app to check if your app is impacted.
You can also test by using the app compatibility framework
and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat flag.
기기 폼 팩터
Android 16(API 수준 36)에는 대형 화면 기기에 표시될 때 앱에 적용되는 다음과 같은 변경사항이 포함되어 있습니다.
적응형 레이아웃
이제 Android 앱이 다양한 기기 (예: 휴대전화, 태블릿, 폴더블, 데스크톱, 자동차, TV)와 대형 화면의 창 모드 (예: 화면 분할, 데스크톱 창)에서 실행되므로 개발자는 기기 방향과 관계없이 모든 화면 및 창 크기에 맞게 조정되는 Android 앱을 빌드해야 합니다. 방향 및 크기 조절 제한과 같은 패러다임은 오늘날의 멀티 기기 세계에서 너무 제한적입니다.
방향, 크기 조절, 가로세로 비율 제한 무시
Android 16 (API 수준 36)을 타겟팅하는 앱의 경우 최소 너비가 600dp 이상인 디스플레이에는 방향, 크기 조절, 가로세로 비율 제한이 더 이상 적용되지 않습니다. 앱은 가로세로 비율 또는 사용자가 선호하는 방향과 관계없이 전체 디스플레이 창을 채우며 필러박싱은 사용되지 않습니다.
이 변경사항은 새로운 표준 플랫폼 동작을 도입합니다. Android is moving toward a model where apps are expected to adapt to various 방향, 디스플레이 크기, 가로세로 비율에 맞게 조정될 것으로 예상되는 모델로 이동하고 있습니다. 고정된 방향 또는 제한된 크기 조절과 같은 제한사항은 앱의 적응성을 저해합니다. 앱을 적응형으로 만들어 최상의 사용자 환경을 제공하세요.
앱 호환성 프레임워크를 사용하고
UNIVERSAL_RESIZABLE_BY_DEFAULT 호환성 플래그를 사용 설정하여 이 동작을 테스트할 수도 있습니다.
일반적인 브레이킹 체인지
방향, 크기 조절, 가로세로 비율 제한을 무시하면 일부 기기, 특히 세로 모드 방향으로 잠긴 작은 레이아웃을 위해 설계된 요소에서 앱의 UI에 영향을 미칠 수 있습니다. 예를 들어 늘어난 레이아웃, 화면 밖 애니메이션 및 구성요소와 같은 문제가 발생할 수 있습니다. 가로세로 비율 또는 방향에 관한 가정은 앱에 시각적 문제를 일으킬 수 있습니다. 자세히 알아보기 이러한 문제를 방지하고 앱의 적응형 동작을 개선하는 방법을 자세히 알아보세요.
기기 회전을 허용하면 활동이 더 많이 다시 생성되어 제대로 보존되지 않으면 사용자 상태가 손실될 수 있습니다. UI 상태 저장에서 UI 상태를 올바르게 저장하는 방법을 알아보세요.
구현 세부정보
다음 매니페스트 속성 및 런타임 API는 전체 화면 및 멀티 윈도우 모드의 대형 화면 기기에서 무시됩니다.
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
screenOrientation, setRequestedOrientation(), getRequestedOrientation()의 다음 값은 무시됩니다.
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
디스플레이 크기 조절과 관련하여 android:resizeableActivity="false",
android:minAspectRatio, android:maxAspectRatio는 아무런 영향을 미치지 않습니다.
Android 16 (API 수준 36)을 타겟팅하는 앱의 경우 앱 방향, 크기 조절, 가로세로 비율 제약조건은 기본적으로 대형 화면에서 무시됩니다. 완전히 준비되지 않은 모든 앱은 선택 해제를 통해 이 동작을 일시적으로 재정의할 수 있으며, 이로 인해 호환성 모드로 전환되는 이전 동작이 발생합니다.
예외
Android 16 방향, 크기 조절, 가로세로 비율 제한은 다음과 같은 상황에서 적용되지 않습니다.
- 게임 (
android:appCategory플래그 기반) - 사용자가 기기의 가로세로 비율 설정에서 앱의 기본 동작을 명시적으로 선택하는 경우
sw600dp보다 작은 화면
일시적으로 선택 해제
특정 활동을 선택 해제하려면 PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY 매니페스트 속성을 선언하세요.
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
앱의 너무 많은 부분이 Android 16에 맞게 준비되지 않은 경우 애플리케이션 수준에서 동일한 속성을 적용하여 완전히 선택 해제할 수 있습니다.
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
건강 및 피트니스
Android 16(API 수준 36)에는 건강 및 피트니스 데이터와 관련된 다음과 같은 변경사항이 포함되어 있습니다.
건강 및 피트니스 권한
Android 16 (API 수준 36) 이상을 타겟팅하는 앱의 경우
BODY_SENSORS 권한은 android.permissions.health의 더 세분화된 권한을 사용하며, 이는 헬스 커넥트
에서도 사용됩니다. Android 16부터 이전에 BODY_SENSORS
또는 BODY_SENSORS_BACKGROUND가 필요했던 API에는 이제 해당하는
android.permissions.health 권한이 필요합니다. 이는 다음 데이터 유형, API, 포그라운드 서비스 유형에 영향을 미칩니다.
HEART_RATE_BPMWear OS의 건강 관리 서비스Sensor.TYPE_HEART_RATEAndroid 센서 관리자의heartRateAccuracy및heartRateBpmfromProtoLayouton Wear OSFOREGROUND_SERVICE_TYPE_HEALTH대신 해당하는android.permission.health권한이 필요한BODY_SENSORS
앱에서 이러한 API를 사용하는 경우 해당하는 세분화된 권한을 요청해야 합니다.
- 사용 중 심박수, SpO2 또는 피부 온도 모니터링의 경우:
android.permissions.health의 세분화된 권한을 요청합니다. 예를 들면READ_HEART_RATE대신BODY_SENSORS입니다. - 백그라운드 센서 액세스의 경우:
BODY_SENSORS_BACKGROUND대신READ_HEALTH_DATA_IN_BACKGROUND를 요청합니다.
이러한 권한은 건강, 피트니스, 웰빙 데이터를 위한 Android 데이터 저장소인 헬스 커넥트에서 데이터를 읽는 액세스를 보호하는 권한과 동일합니다.
모바일 앱
READ_HEART_RATE 및 기타 세분화된
권한을 사용하도록 이전하는 모바일 앱은 앱의 개인정보처리방침을 표시하는 활동도 선언해야 합니다. 이는 헬스 커넥트와 동일한 요구사항입니다.
연결
Android 16(API 수준 36)에는 주변기기와의 연결을 개선하기 위해 블루투스 스택에 다음과 같은 변경사항이 포함되어 있습니다.
연결 손실 및 암호화 변경사항을 처리하는 새로운 인텐트
作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。
以 Android 16 为目标平台的应用现在可以:
- 在检测到远程键盘连接丢失时接收
ACTION_KEY_MISSINGintent,以便提供更具信息量的用户反馈并采取适当的措施。 - 每当链接的加密状态发生变化时,都会收到
ACTION_ENCRYPTION_CHANGEintent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到ACTION_ENCRYPTION_CHANGEintent 时成功加密了链接,则必须将该绑定视为已恢复。
适应不同的 OEM 实现
虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。
我们建议您采用以下应用行为:
如果广播
ACTION_KEY_MISSINGintent:系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。
您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。
如果设备在收到
ACTION_KEY_MISSING后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。如果未广播
ACTION_KEY_MISSINGintent:ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。
在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。
블루투스 연결을 삭제하는 새로운 방법
现在,以 Android 16 为目标平台的所有应用都可以使用 CompanionDeviceManager 中的公共 API 解除蓝牙设备配对。如果配套设备作为 CDM 关联进行管理,则应用可以在关联的设备上使用新的 removeBond(int) API 触发蓝牙配对的移除。该应用可以通过监听蓝牙设备广播事件 ACTION_BOND_STATE_CHANGED 来监控配对状态变化。
보안
Android 16(API 수준 36)에는 다음과 같은 보안 변경사항이 포함되어 있습니다.
MediaStore 버전 잠금
对于以 Android 16 或更高版本为目标平台的应用,MediaStore#getVersion() 现在将是每个应用的唯一标识。这会从版本字符串中移除标识属性,以防止滥用和用于指纹识别技术。应用不应对此版本的格式做出任何假设。在使用此 API 时,应用应已处理版本变更,并且在大多数情况下无需更改其当前行为,除非开发者尝试推断超出此 API 预期范围的其他信息。
더 안전한 인텐트
더 안전한 인텐트 기능은 Android의 인텐트 해결 메커니즘의 보안을 개선하기 위해 설계된 다단계 보안 이니셔티브입니다. 목표는 인텐트 처리 중에 검사를 추가하고 특정 기준을 충족하지 않는 인텐트를 필터링하여 악의적인 작업으로부터 앱을 보호하는 것입니다.
Android 15에서 이 기능은 전송 앱에 중점을 두었습니다. 이제 Android 16에서는 제어가 수신 앱으로 전환되어 개발자가 앱 매니페스트를 사용하여 엄격한 인텐트 해결을 선택할 수 있습니다.
두 가지 주요 변경사항이 구현됩니다.
명시적 인텐트는 타겟 구성요소의 인텐트 필터와 일치해야 합니다. 인텐트가 구성요소를 명시적으로 타겟팅하는 경우 해당 구성요소의 인텐트 필터와 일치해야 합니다.
작업이 없는 인텐트는 인텐트 필터와 일치할 수 없음: 작업이 지정되지 않은 인텐트는 인텐트 필터로 확인되지 않아야 합니다.
이러한 변경사항은 여러 앱이 관련되어 있는 경우에만 적용되며 단일 앱 내의 인텐트 처리에는 영향을 미치지 않습니다.
영향
선택적이라는 것은 개발자가 앱 매니페스트에서 명시적으로 사용 설정해야 적용된다는 의미입니다. 따라서 이 기능의 영향은 개발자가 다음을 충족하는 앱으로 제한됩니다.
- 더 안전한 인텐트 기능과 그 이점을 알고 있습니다.
- 더 엄격한 인텐트 처리 관행을 앱에 통합하도록 적극적으로 선택합니다.
이 선택 방식은 현재 보안 수준이 낮은 인텐트 해결 동작을 사용할 수 있는 기존 앱이 중단될 위험을 최소화합니다.
Android 16의 초기 영향은 제한적일 수 있지만 더 안전한 인텐트 이니셔티브에는 향후 Android 버전에서 더 광범위한 영향을 미치기 위한 로드맵이 있습니다. 궁극적으로는 엄격한 의도 해결을 기본 동작으로 만들 계획입니다.
더 안전한 인텐트 기능은 악성 앱이 인텐트 해결 메커니즘의 취약점을 악용하기 어렵게 하여 Android 생태계의 보안을 크게 향상할 수 있습니다.
하지만 선택 해제 및 필수 시행으로의 전환은 기존 앱과의 잠재적인 호환성 문제를 해결하기 위해 신중하게 관리해야 합니다.
구현
개발자는 앱 매니페스트에서 intentMatchingFlags 속성을 사용하여 더 엄격한 인텐트 일치를 명시적으로 사용 설정해야 합니다.
다음은 전체 앱에 대해 기능이 선택되어 있지만 수신기에서 사용 중지/선택 해제된 예입니다.
<application android:intentMatchingFlags="enforceIntentFilter">
<receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
지원되는 플래그에 대한 자세한 내용은 다음을 참고하세요.
| 플래그 이름 | 설명 |
|---|---|
| enforceIntentFilter | 수신 인텐트에 더 엄격한 일치를 적용합니다. |
| 없음 | 수신 인텐트의 모든 특수 일치 규칙을 사용 중지합니다. 여러 플래그를 지정할 때 충돌하는 값은 'none' 플래그에 우선순위를 부여하여 해결됩니다. |
| allowNullAction | 작업이 없는 인텐트가 일치하도록 일치 규칙을 완화합니다. 특정 동작을 달성하기 위해 'enforceIntentFilter'와 함께 사용되는 플래그 |
테스트 및 디버깅
시행이 활성화된 경우 인텐트 호출자가 인텐트를 올바르게 채웠다면 앱이 올바르게 작동해야 합니다.
하지만 차단된 인텐트는 "PackageManager." 태그와 함께 "Intent does not match component's intent filter:" 및 "Access blocked:"과 같은 경고 로그 메시지를 트리거합니다. 이는 앱에 영향을 줄 수 있는 잠재적인 문제를 나타내며 주의가 필요합니다.
Logcat 필터:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
GPU syscall 필터링
为了加固 Mali GPU Surface,我们已在生产版本中屏蔽了已废弃或仅用于 GPU 开发的 Mali GPU IOCTL。 此外,用于 GPU 性能剖析的 IOCTL 已限制为 shell 进程或可调试的应用。如需详细了解平台级政策,请参阅 SAC 更新。
此项变更适用于使用 Mali GPU 的 Pixel 设备(Pixel 6-9)。Arm
已在其 r54p2 release 版本的
Documentation/ioctl-categories.rst 中提供了 IOCTL 的官方分类。此列表将在未来的驱动程序版本中继续维护。
此项变更不会影响受支持的图形 API(包括 Vulkan 和 OpenGL),预计也不会影响开发者或现有应用。 Streamline Performance Analyzer 和 Android GPU 检查器等 GPU 性能剖析工具不会受到影响。
测试
如果您看到类似以下内容的 SELinux 拒绝,则您的应用很可能受到了此项变更的影响:
06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc: denied { ioctl }
for path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts
如果您的应用需要使用被屏蔽的 IOCTL,请提交 bug 并将其分配给 android-partner-security@google.com。
常见问题解答
此项政策变更是否适用于所有 OEM? 此项变更将采用选择启用模式,但任何想要使用此加固方法的原始设备制造商(OEM)都可以使用。如需了解如何实现此项变更,请参阅实现文档。
是否必须在 OEM 代码库中进行更改才能实现此项变更,还是默认随新的 AOSP 版本提供? 平台级变更将默认随新的 AOSP 版本提供。供应商可以选择在其代码库中启用此项变更,以便应用此项变更。
SoC 是否负责让 IOCTL 列表保持最新状态?例如,如果我的设备使用 ARM Mali GPU,我是否需要就任何变更与 ARM 联系? 各个 SoC 必须在驱动程序发布后根据设备更新其 IOCTL 列表。 例如,ARM 会在驱动程序更新后更新其发布的 IOCTL 列表。 不过,OEM 应确保将更新纳入其 SEPolicy,并根据需要将任何选定的自定义 IOCTL 添加到列表中。
此项变更是否会自动应用于所有在售 Pixel 设备,还是需要用户执行操作来切换某些内容以应用此项变更? 此项变更适用于所有使用 Mali GPU 的在售 Pixel 设备(Pixel 6-9)。无需用户执行任何操作即可应用此项变更。
使用此政策是否会影响内核驱动程序的性能? 我们已使用 GFXBench 在 Mali GPU 上对此政策进行了测试,未观察到 GPU 性能发生任何可衡量的变化。
IOCTL 列表是否需要与当前的用户空间和内核驱动程序版本保持一致?是,允许的 IOCTL 列表必须与用户空间和内核驱动程序支持的 IOCTL 同步。如果用户空间或内核驱动程序中的 IOCTL 发生更新,则必须更新 SEPolicy IOCTL 列表以进行匹配。
ARM 已将 IOCTL 分类为“受限”/“检测”,但我们希望在生产用例中使用其中的一些 IOCTL,并/或拒绝其他 IOCTL。 各个 OEM/SoC 负责根据其用户空间 Mali 库的配置,决定如何对其使用的 IOCTL 进行分类。 ARM 的列表可用于帮助决定这些内容,但每个 OEM/SoC 的用例可能有所不同。
개인 정보 보호
Android 16(API 수준 36)에는 다음과 같은 개인 정보 보호 변경사항이 포함되어 있습니다.
로컬 네트워크 권한
LAN의 기기는 INTERNET 권한이 있는 모든 앱에서 액세스할 수 있습니다.
이렇게 하면 앱이 로컬 기기에 쉽게 연결할 수 있지만 사용자 지문 형성, 위치 프록시와 같은 개인 정보 보호에도 영향을 미칩니다.
로컬 네트워크 보호 프로젝트는 새로운 런타임 권한 뒤에 로컬 네트워크 액세스를 게이트하여 사용자의 개인 정보를 보호하는 것을 목표로 합니다.
출시 계획
이 변경사항은 각각 25Q2와 26Q2 의 두 출시 사이에 배포됩니다. 개발자는 25Q2 에 관한 이 가이드를 따르고 의견을 공유해야 합니다. 이러한 보호는 이후 Android 출시에서 적용 되기 때문입니다. 또한 개발자는 다음 가이드를 사용하여 암시적 로컬 네트워크 액세스에 의존하는 시나리오를 업데이트하고 새 권한의 사용자 거부 및 취소에 대비해야 합니다.
영향
현재 단계에서 LNP는 선택 기능입니다. 즉, 선택한 앱만 영향을 받습니다. 선택 단계의 목표는 앱 개발자가 앱의 어떤 부분이 암시적 로컬 네트워크 액세스에 의존하는지 파악하여 다음 출시를 위해 권한을 보호할 수 있도록 준비하는 것입니다.
다음과 같은 방법으로 사용자의 로컬 네트워크에 액세스하는 경우 앱이 영향을 받습니다.
- 로컬 네트워크 주소에서 원시 소켓을 직접 또는 라이브러리 사용 (예: mDNS 또는 SSDP 서비스 검색 프로토콜)
- 로컬 네트워크에 액세스하는 프레임워크 수준 클래스 사용 (예: NsdManager)
로컬 네트워크 주소 로 또는 로컬 네트워크 주소 에서 트래픽을 전송하려면 로컬 네트워크 액세스 권한이 필요합니다. 다음 표에는 몇 가지 일반적인 사례가 나와 있습니다.
| 앱 하위 수준 네트워크 작업 | 필요한 로컬 네트워크 권한 |
|---|---|
| 아웃바운드 TCP 연결 만들기 | 예 |
| 인바운드 TCP 연결 수락 | 예 |
| UDP 유니캐스트, 멀티캐스트, 브로드캐스트 전송 | 예 |
| 인바운드 UDP 유니캐스트, 멀티캐스트, 브로드캐스트 수신 | 예 |
이러한 제한사항은 네트워킹 스택에 깊이 구현되므로 모든 네트워킹 API 에 적용됩니다. 여기에는 네이티브 또는 관리형 코드에서 생성된 소켓, Cronet 및 OkHttp와 같은 네트워킹 라이브러리, 이러한 라이브러리 위에 구현된 API가 포함됩니다. 로컬 네트워크에서 서비스 (즉, .local 서픽스가 있는 서비스)를 확인하려면 로컬 네트워크 권한이 필요합니다.
위 규칙의 예외는 다음과 같습니다.
- 기기의 DNS 서버가 로컬 네트워크에 있는 경우 포트 53에서 서버로 또는 서버에서 트래픽을 전송하는 데 로컬 네트워크 액세스 권한이 필요하지 않습니다.
- Output Switcher를 인앱 선택기로 사용하는 애플리케이션에는 로컬 네트워크 권한이 필요하지 않습니다 (2025년 4분기에 추가 가이드 제공 예정).
개발자 가이드 (선택)
로컬 네트워크 제한사항을 선택하려면 다음 단계를 따르세요.
- 기기를 25Q2 베타 3 이상 빌드로 플래시합니다.
- 테스트할 앱을 설치합니다.
adb에서 Appcompat 플래그를 전환합니다.
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>기기를 재부팅합니다.
이제 앱의 로컬 네트워크 액세스가 제한되고 로컬 네트워크에 액세스하려는 시도는 소켓 오류로 이어집니다. 앱 프로세스 외부에서 로컬 네트워크 작업을 실행하는 API (예: NsdManager)를 사용하는 경우 선택 단계에서는 영향을 받지 않습니다.
액세스를 복원하려면 앱에 NEARBY_WIFI_DEVICES 권한을 부여해야 합니다.
- 앱이 매니페스트에서
NEARBY_WIFI_DEVICES권한을 선언하는지 확인합니다. - 설정 > 앱 > [애플리케이션 이름] > 권한 > 근처 기기 > 허용으로 이동합니다.
이제 앱의 로컬 네트워크 액세스가 복원되고 모든 시나리오가 앱을 선택하기 전과 같이 작동해야 합니다.
로컬 네트워크 보호가 적용되면 앱 네트워크 트래픽에 다음과 같은 영향을 미칩니다.
| 권한 | 아웃바운드 LAN 요청 | 아웃바운드/인바운드 인터넷 요청 | 인바운드 LAN 요청 |
|---|---|---|---|
| 허용됨 | 작동의 원리 | 작동의 원리 | 작동의 원리 |
| 허용되지 않음 | 실패 경험 | 작동의 원리 | 실패 경험 |
다음 명령어를 사용하여 앱 호환성 플래그를 사용 중지합니다.
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
오류
이러한 제한사항으로 인해 발생하는 오류는 로컬 네트워크 주소에 send 또는 send 변형을 호출할 때마다 호출 소켓으로 반환됩니다.
오류 예시는 다음과 같습니다.
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
로컬 네트워크 정의
이 프로젝트의 로컬 네트워크는 Wi-Fi 또는 이더넷과 같이 브로드캐스트 지원 네트워크 인터페이스를 활용하지만 셀룰러 (WWAN) 또는 VPN 연결은 제외하는 IP 네트워크를 나타냅니다.
다음은 로컬 네트워크로 간주됩니다.
IPv4:
- 169.254.0.0/16 // 링크 로컬
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- 링크-로컬
- 직접 연결된 경로
- 스레드와 같은 스텁 네트워크
- 다중 서브넷 (미정)
또한 멀티캐스트 주소 (224.0.0.0/4, ff00::/8)와 IPv4 브로드캐스트 주소 (255.255.255.255)는 모두 로컬 네트워크 주소로 분류됩니다.
앱 소유 사진
当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。