이전 버전과 마찬가지로 Android 17에는 앱에 영향을 미칠 수 있는 동작 변경사항이 포함되어 있습니다. 다음 동작 변경사항은 Android 17 이상을 타겟팅하는 앱에만 적용됩니다. 앱이 Android 17 이상을 타겟팅하는 경우 이러한 동작을 지원하도록 앱을 수정해야 합니다(해당하는 경우).
앱의 targetSdkVersion과 관계없이 Android 17에서 실행되는 모든 앱에 영향을 미치는 동작 변경사항 목록도 검토해야 합니다.
핵심 기능
Android 17에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.
MessageQueue의 새로운 잠금 해제 구현
Beginning with Android 17, apps targeting Android 17 (API level 37)
or higher receive a new lock-free implementation of
android.os.MessageQueue. The new implementation improves performance and
reduces missed frames, but may break clients that reflect on MessageQueue
private fields and methods.
For more information, including mitigation strategies, see MessageQueue behavior change guidance.
이제 정적 최종 필드를 수정할 수 없음
Apps running on Android 17 or higher that target
Android 17 (API level 37) or higher cannot change static final fields. If
an app attempts to change a static final field by using reflection, it will
cause an IllegalAccessException. Attempting to modify one of these fields
through JNI APIs (such as SetStaticLongField()) will cause the app to crash.
접근성
Android 17에서는 접근성을 개선하기 위해 다음과 같이 변경됩니다.
복잡한 IME 물리적 키보드 입력의 접근성 지원
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
개인 정보 보호
Android 17에는 사용자 개인 정보 보호를 개선하기 위한 다음과 같은 변경사항이 포함되어 있습니다.
ECH (Encrypted Client Hello) 사용 설정됨
Android 17에서는 TLS 핸드셰이크에서 서버 이름 표시 (SNI)를 암호화하여 사용자 개인 정보 보호를 강화하는 TLS 확장 프로그램인 암호화된 클라이언트 Hello(ECH)에 대한 플랫폼 지원을 도입합니다. 이 암호화는 네트워크 관찰자가 앱이 연결되는 특정 도메인을 쉽게 식별하지 못하도록 합니다.
Android 17 (API 수준 37) 이상을 타겟팅하는 앱의 경우 TLS 연결에 ECH가 사용됩니다. ECH는 앱에서 사용하는 네트워킹 라이브러리 (예: HttpEngine, WebView, OkHttp)에 ECH 지원이 통합되어 있고 원격 서버에서도 ECH 프로토콜을 지원하는 경우에만 활성화됩니다. ECH를 협상할 수 없는 경우 클라이언트는 무작위 콘텐츠가 포함된 ECH 확장 프로그램을 전송합니다 (ECH GREASE라는 메커니즘). ECH GREASE 작동 방식에 관한 자세한 내용은 RFC 9849를 참고하세요.
앱이 이 동작을 맞춤설정할 수 있도록 Android 17에서는 네트워크 보안 구성 파일에 새로운 <domainEncryption> 요소를 추가합니다.
개발자는 <base-config> 또는 <domain-config> 태그 내에서 <domainEncryption>를 사용하여 전역 또는 도메인별로 ECH 모드 (예: "enabled" 또는 "disabled")를 선택할 수 있습니다.
자세한 내용은 암호화된 클라이언트 Hello 문서를 참고하세요.
Android 17을 타겟팅하는 앱에 로컬 네트워크 권한 필요
Android 17에서는 승인되지 않은 로컬 네트워크 액세스로부터 사용자를 보호하기 위해 ACCESS_LOCAL_NETWORK 런타임 권한을 도입합니다. 이 권한은 기존 NEARBY_DEVICES 권한 그룹에 속하므로 이미 다른 NEARBY_DEVICES 권한을 부여한 사용자에게는 다시 메시지가 표시되지 않습니다. 이 새로운 요구사항은 악성 앱이 무제한 로컬 네트워크 액세스를 활용하여 은밀한 사용자 추적 및 지문 생성을 하는 것을 방지합니다. 이 권한을 선언하고 요청하면 앱이 스마트 홈 기기나 전송 수신기 등 로컬 영역 네트워크 (LAN)의 기기를 검색하고 연결할 수 있습니다.
이제 Android 17 (API 수준 37) 이상을 타겟팅하는 앱에는 LAN 기기와의 통신을 유지하는 두 가지 경로가 있습니다. 시스템 중재, 개인 정보 보호 기기 선택기를 채택하여 권한 메시지를 건너뛰거나 런타임에 이 새로운 권한을 명시적으로 요청하여 로컬 네트워크 통신을 유지합니다.
자세한 내용은 로컬 네트워크 권한 문서를 참고하세요.
실제 기기에서 비밀번호 숨기기
If an app targets Android 17 (API level 37) or higher and the user is using
a physical input device (for example, an external keyboard), the Android
operating system applies the new show_passwords_physical setting to all
characters in the password field. By default, that setting hides all password
characters.
The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.
If the user is using the device's touchscreen, the system applies the new
show_passwords_touch setting.
표준 SMS 메시지의 OTP 보호
Android 17부터 Android는 표준 SMS 메시지 (WebOTP 또는 SMS Retriever 형식을 사용하지 않는 OTP가 포함된 SMS 메시지)에 적용되도록 SMS OTP 보호를 확장합니다. Android 17 (API 수준 37) 이상을 타겟팅하는 대부분의 앱의 경우 이러한 SMS 메시지는 수신 후 3시간이 지나야 사용할 수 있습니다. 이 지연은 OTP 도용을 방지하기 위한 것입니다. 이 3시간 지연 동안 SMS_RECEIVED_ACTION 브로드캐스트가 보류되고 SMS 제공자 데이터베이스 쿼리가 필터링됩니다. SMS 메시지는 지연 후 이러한 앱에서 사용할 수 있습니다.
기본 SMS 지원 앱, 연결된 기기 지원 앱 등 특정 앱은 이 지연에서 제외됩니다. OTP 추출을 위해 SMS 메시지 읽기에 의존하는 모든 앱은 기능을 계속 사용하려면 SMS Retriever 또는 SMS User Consent API를 사용하도록 전환해야 합니다.
보안
Android 17에서는 기기 및 앱 보안이 다음과 같이 개선되었습니다.
활동 보안
Android 17에서 플랫폼은 '기본적으로 보안' 아키텍처로 계속 전환하여 피싱, 상호작용 가로채기, 혼동된 대리인 공격과 같은 심각한 악용을 완화하도록 설계된 다양한 개선사항을 도입합니다. 이 업데이트에서는 개발자가 앱 호환성과 사용자 보호를 유지하기 위해 새로운 보안 표준을 명시적으로 선택해야 합니다.
개발자에게 미치는 주요 영향은 다음과 같습니다.
- BAL 강화 및 개선된 선택: 보호를
IntentSender로 확장하여 백그라운드 활동 실행 (BAL) 제한사항을 개선하고 있습니다. 개발자는 기존MODE_BACKGROUND_ACTIVITY_START_ALLOWED상수에서 이전해야 합니다. 대신 호출 앱이 표시되는 시나리오로 활동 시작을 제한하여 공격 노출 영역을 크게 줄이는MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE과 같은 세분화된 컨트롤을 채택해야 합니다. - 채택 도구: 개발자는 엄격 모드와 업데이트된 린트 검사를 활용하여 기존 패턴을 식별하고 향후 타겟 SDK 요구사항에 대비해야 합니다.
기본적으로 CT 사용 설정
If an app targets Android 17 (API level 37) or higher, certificate transparency (CT) is enabled by default. (On Android 16, CT is available but apps had to opt in.)
더 안전한 네이티브 DCL—C
If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.
All native files loaded using System.load() must be marked as read-only.
Otherwise, the system throws UnsatisfiedLinkError.
We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.
CP2 데이터 보기에서 개인 식별 정보 필드 제한
Android 17(API 수준 37) 이상을 타겟팅하는 앱의 경우 연락처 제공자 2(CP2)는 데이터 뷰에서 개인 식별 정보(PII)가 포함된 특정 열을 제한합니다. 이 변경사항이 사용 설정되면 사용자 개인 정보 보호를 위해 이러한 열이 데이터 뷰에서 삭제됩니다. 제한된 열에는 다음이 포함됩니다.
ContactsContract.Data에서 이러한 열을 사용하는 앱은 RAW_CONTACT_ID와 조인하여 ContactsContract.RawContacts에서 추출할 수 있습니다.
CP2에서 엄격한 SQL 검사 적용
For apps targeting Android 17 (API level Android 17 (API level 37)) and
higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when
the ContactsContract.Data table is accessed without
READ_CONTACTS permission.
With this change, if an app doesn't have READ_CONTACTS
permission, StrictColumns and
StrictGrammar options are set when querying
the ContactsContract.Data table. If a query
uses a pattern that isn't compatible with these, it will be
rejected and cause an exception to be thrown.
미디어
Android 17에는 미디어 동작이 다음과 같이 변경되었습니다.
백그라운드 오디오 강화
Android 17부터 오디오 프레임워크는 오디오 재생, 오디오 포커스 요청, 볼륨 변경 API를 비롯한 백그라운드 오디오 상호작용에 관한 제한사항을 적용하여 이러한 변경사항이 사용자가 의도적으로 시작되도록 합니다.
일부 오디오 제한사항은 모든 앱에 적용됩니다. 하지만 앱이 Android 17 (API 수준 37)을 타겟팅하는 경우 제한이 더 엄격해집니다. 이러한 앱 중 하나가 백그라운드에 있는 동안 오디오와 상호작용하는 경우 포그라운드 서비스가 실행되어야 합니다. 또한 앱은 다음 요구사항 중 하나 또는 둘 다를 충족해야 합니다.
- 포그라운드 서비스에는 사용 중인 상태에서 필요한 권한 (WIU) 기능이 있어야 합니다.
- 앱에 정확한 알람 권한이 있어야 하며
USAGE_ALARM오디오 스트림과 상호작용해야 합니다.
완화 전략을 비롯한 자세한 내용은 백그라운드 오디오 강화를 참고하세요.
기기 폼 팩터
Android 17에는 다양한 기기 크기와 폼 팩터에서 사용자 환경을 개선하기 위한 다음 변경사항이 포함되어 있습니다.
대형 화면 (sw>=600dp)에서 방향, 크기 조절, 가로세로 비율 제약을 무시하도록 플랫폼 API 변경
API 수준 36 이상을 타겟팅하는 앱의 경우 대형 화면 (sw >= 600dp)에서 방향, 가로세로 비율, 크기 조절 제한을 무시하도록 Android 16에서 플랫폼 API 변경사항을 도입했습니다. 개발자는 SDK 36을 사용하여 이러한 변경사항을 선택 해제할 수 있지만, Android 17 (API 수준 37) 이상을 타겟팅하는 앱에서는 더 이상 이 선택 해제를 사용할 수 없습니다.
자세한 내용은 방향 및 크기 조절 제한 무시 를 참고하세요.
연결
Android 17에서는 일관성을 개선하고 블루투스 RFCOMM 소켓의 표준 Java InputStream 동작과 맞추기 위해 다음과 같은 변경사항을 도입했습니다.
RFCOMM의 일관된 BluetoothSocket read() 동작
Android 17 (API 수준 37)을 타겟팅하는 앱의 경우 RFCOMM 기반 BluetoothSocket에서 가져온 InputStream의 read() 메서드가 이제 소켓이 닫히거나 연결이 끊어지면 -1를 반환합니다.
이 변경사항은 RFCOMM 소켓 동작을 LE CoC 소켓과 일치시키고 스트림 끝에 도달하면 -1이 반환된다고 명시된 표준 InputStream.read() 문서와 일치합니다.
IOException을 포착하여 읽기 루프에서 벗어나는 데만 의존하는 앱은 이 변경사항의 영향을 받을 수 있으므로 BluetoothSocket 읽기 루프를 업데이트하여 -1의 반환 값을 명시적으로 확인해야 합니다. 이렇게 하면 원격 기기가 연결 해제되거나 소켓이 닫힐 때 루프가 올바르게 종료됩니다. 권장 구현의 예는 블루투스 데이터 전송 가이드의 코드 스니펫을 참고하세요.