이전 버전과 마찬가지로 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 안내를 참고하세요.
뒤로 탐색 예측을 위해 이전 또는 선택 해제 필요
For apps targeting Android 16 (API level 36) or higher and running on an
Android 16 or higher device, the predictive back system animations
(back-to-home, cross-task, and cross-activity) are enabled by default.
Additionally, onBackPressed
is not called and
KeyEvent.KEYCODE_BACK
is not dispatched anymore.
If your app intercepts the back event and you haven't migrated to predictive
back yet, update your app to use supported back navigation APIs, or
temporarily opt out by setting the
android:enableOnBackInvokedCallback
attribute to false
in the
<application>
or <activity>
tag of your app's AndroidManifest.xml
file.
세련된 글꼴 API 지원 중단 및 사용 중지
Apps targeting Android 15 (API level 35) have the
elegantTextHeight
TextView
attribute set to true
by
default, replacing the compact font with one that is much more readable. You
could override this by setting the elegantTextHeight
attribute to false
.
Android 16 deprecates the
elegantTextHeight
attribute,
and the attribute will be ignored once your app targets Android 16. The "UI
fonts" controlled by these APIs are being discontinued, so you should adapt any
layouts to ensure consistent and future proof text rendering in Arabic, Lao,
Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai.

elegantTextHeight
behavior for apps targeting Android
14 (API level 34) and lower, or for apps targeting Android 15 (API level 35)
that overrode the default by setting the elegantTextHeight
attribute to false
.
elegantTextHeight
behavior for apps targeting Android
16 (API level 36), or for apps targeting Android 15 (API level 35) that didn't
override the default by setting the elegantTextHeight
attribute
to false
.핵심 기능
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)에는 대형 화면 기기에 표시될 때 앱에 적용되는 다음과 같은 변경사항이 포함되어 있습니다.
적응형 레이아웃
With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.
Ignore orientation, resizability, and aspect ratio restrictions
For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.
This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.
You can also test this behavior by using the
app compatibility framework and
enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT
compat flag.
Common breaking changes
Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.
Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.
Implementation details
The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:
screenOrientation
resizableActivity
minAspectRatio
maxAspectRatio
setRequestedOrientation()
getRequestedOrientation()
The following values for screenOrientation
, setRequestedOrientation()
, and
getRequestedOrientation()
are ignored:
portrait
reversePortrait
sensorPortrait
userPortrait
landscape
reverseLandscape
sensorLandscape
userLandscape
Regarding display resizability, android:resizeableActivity="false"
,
android:minAspectRatio
, and android:maxAspectRatio
have no effect.
For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).
Exceptions
The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:
- Games (based on the
android:appCategory
flag) - Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
- Screens that are smaller than
sw600dp
Opt out temporarily
To opt out a specific activity, declare the
PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
manifest property:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:
<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, 포그라운드 서비스 유형에 영향을 미칩니다.
- Wear OS의 건강 관리 서비스에서
HEART_RATE_BPM
- Android 센서 관리자의
Sensor.TYPE_HEART_RATE
- Wear OS의
ProtoLayout
에서heartRateAccuracy
및heartRateBpm
FOREGROUND_SERVICE_TYPE_HEALTH
:BODY_SENSORS
대신 해당android.permission.health
권한이 필요합니다.
앱이 이러한 API를 사용하는 경우 세부 권한을 요청해야 합니다.
- 심박수, SpO2 또는 피부 온도의 사용 중 모니터링의 경우
BODY_SENSORS
대신android.permissions.health
아래의 상세 권한(예:READ_HEART_RATE
)을 요청합니다. - 백그라운드 센서 액세스의 경우
BODY_SENSORS_BACKGROUND
대신READ_HEALTH_DATA_IN_BACKGROUND
를 요청합니다.
이러한 권한은 건강, 피트니스, 웰니스 데이터용 Android 데이터 저장소인 헬스 커넥트에서 데이터를 읽는 액세스를 보호하는 권한과 동일합니다.
모바일 앱
READ_HEART_RATE
및 기타 세부 권한을 사용하도록 이전하는 모바일 앱은 앱의 개인정보처리방침을 표시하기 위해 활동을 선언해야 합니다. 이는 헬스 커넥트와 동일한 요구사항입니다.
연결
Android 16 (API 수준 36)에는 주변기기와의 연결을 개선하기 위해 블루투스 스택에 다음과 같은 변경사항이 포함되어 있습니다.
결합 손실 및 암호화 변경사항을 처리하는 새로운 인텐트
As part of the Improved bond loss handling, Android 16 also introduces 2 new intents to provide apps with greater awareness of bond loss and encryption changes.
Apps targeting Android 16 can now:
- Receive an
ACTION_KEY_MISSING
intent when remote bond loss is detected, allowing them to provide more informative user feedback and take appropriate actions. - Receive an
ACTION_ENCRYPTION_CHANGE
intent whenever encryption status of the link changes. This includes encryption status change, encryption algorithm change, and encryption key size change. Apps must consider the bond restored if the link is successfully encrypted upon receivingACTION_ENCRYPTION_CHANGE
intent later.
Adapting to varying OEM implementations
While Android 16 introduces these new intents, their implementation and broadcasting can vary across different device manufacturers (OEMs). To ensure your app provides a consistent and reliable experience across all devices, developers should design their bond loss handling to gracefully adapt to these potential variations.
We recommend the following app behaviors:
If the
ACTION_KEY_MISSING
intent is broadcast:The ACL (Asynchronous Connection-Less) link will be disconnected by the system, but the bond information for the device will be retained (as described here).
Your app should use this intent as the primary signal for bond loss detection and guiding the user to confirm the remote device is in range before initiating device forgetting or re-pairing.
If a device disconnects after
ACTION_KEY_MISSING
is received, your app should be cautious about reconnecting, as the device may no longer be bonded with the system.If the
ACTION_KEY_MISSING
intent is NOT broadcast:The ACL link will remain connected, and the bond information for the device will be removed by the system, same to behavior in Android 15.
In this scenario, your app should continue its existing bond loss handling mechanisms as in previous Android releases, to detect and manage bond loss events.
블루투스 결합을 삭제하는 새로운 방법
All apps targeting Android 16 are now able to unpair bluetooth devices using a
public API in CompanionDeviceManager
. If a companion device is
being managed as a CDM association, then the app can trigger
bluetooth bond removal by using the new removeBond(int)
API
on the associated device. The app can monitor the bond state changes by
listening to the bluetooth device broadcast event
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:")
개인정보처리방침
Android 16 (API 수준 36)에는 다음과 같은 개인 정보 보호 변경사항이 포함되어 있습니다.
로컬 네트워크 권한
LAN에 있는 기기는 INTERNET
권한이 있는 모든 앱에서 액세스할 수 있습니다.
이렇게 하면 앱이 로컬 기기에 쉽게 연결할 수 있지만 사용자의 지문을 형성하고 위치의 프록시가 되는 등 개인 정보 보호 관련 영향도 있습니다.
로컬 네트워크 보호 프로젝트는 새로운 런타임 권한 뒤에 로컬 네트워크 액세스를 제한하여 사용자의 개인 정보를 보호하는 것을 목표로 합니다.
출시 계획
이 변경사항은 각각 25Q2 및 TBD의 두 출시 사이에 배포됩니다. 개발자는 25Q2에 이 안내를 따르고 의견을 공유해야 합니다. 이러한 보호 조치는 향후 Android 출시에서 적용될 예정이기 때문입니다. 또한 다음 안내를 사용하여 암시적 로컬 네트워크 액세스에 의존하는 시나리오를 업데이트하고 사용자의 거부 및 새 권한 취소에 대비해야 합니다.
영향
현재 단계에서 LNP는 선택 기능이므로 선택한 앱에만 영향을 미칩니다. 선택 단계의 목표는 앱 개발자가 앱의 어떤 부분이 암시적 로컬 네트워크 액세스에 의존하는지 파악하여 다음 출시를 위해 권한으로 보호할 수 있도록 하는 것입니다.
다음 방법을 사용하여 사용자의 로컬 네트워크에 액세스하는 앱은 영향을 받습니다.
- 로컬 네트워크 주소 (예: mDNS 또는 SSDP 서비스 검색 프로토콜)에서 원시 소켓을 직접 또는 라이브러리 사용
- 로컬 네트워크에 액세스하는 프레임워크 수준 클래스 사용 (예: NsdManager)
로컬 네트워크 주소로 전송되는 트래픽과 로컬 네트워크 주소에서 전송되는 트래픽에는 로컬 네트워크 액세스 권한이 필요합니다. 다음 표에는 몇 가지 일반적인 사례가 나와 있습니다.
앱 하위 수준 네트워크 작업 | 로컬 네트워크 권한 필요 |
---|---|
아웃바운드 TCP 연결 만들기 | 예 |
수신 TCP 연결 수락 | 예 |
UDP 유니캐스트, 멀티캐스트, 브로드캐스트 전송 | 예 |
수신 UDP 유니캐스트, 멀티캐스트, 브로드캐스트 수신 | 예 |
이러한 제한사항은 네트워킹 스택 깊숙이 구현되므로 모든 네트워킹 API에 적용됩니다. 여기에는 네이티브 또는 관리 코드에서 생성된 소켓, Cronet 및 OkHttp와 같은 네트워킹 라이브러리, 이러한 라이브러리 위에 구현된 API가 포함됩니다. 로컬 네트워크에서 서비스 (예: .local 접미사가 있는 서비스)를 확인하려면 로컬 네트워크 권한이 필요합니다.
위 규칙의 예외:
- 기기의 DNS 서버가 로컬 네트워크에 있는 경우 포트 53에서 오가는 트래픽에는 로컬 네트워크 액세스 권한이 필요하지 않습니다.
- 출력 전환기를 인앱 선택기로 사용하는 애플리케이션에는 로컬 네트워크 권한이 필요하지 않습니다 (자세한 안내는 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 요청 |
---|---|---|---|
승인됨 | 작동의 원리 | 작동의 원리 | 작동의 원리 |
허용되지 않음 | 실패 경험 | 작동의 원리 | 실패 경험 |
다음 명령어를 사용하여 App-Compat 플래그를 사용 중지합니다.
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)는 모두 로컬 네트워크 주소로 분류됩니다.
앱 소유 사진
When prompted for photo and video permissions by an app targeting SDK 36 or higher on devices running Android 16 or higher, users who choose to limit access to selected media will see any photos owned by the app pre-selected in the photo picker. Users can deselect any of these pre-selected items, which will revoke the app's access to those photos and videos.