이전 버전과 마찬가지로 Android 17에는 앱에 영향을 미칠 수 있는 동작 변경사항이 포함되어 있습니다. 다음 동작 변경사항은 Android 17 이상을 타겟팅하는 앱에만 적용됩니다. 앱이 Android 17 이상을 타겟팅한다면 이러한 동작을 지원하도록 앱을 수정해야 합니다(적용되는 경우).
앱의 targetSdkVersion과 관계없이 Android 17에서 실행되는 모든 앱에 영향을 미치는 동작 변경사항
목록도 검토해야 합니다.
핵심 기능
Android 17에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.
MessageQueue의 새로운 잠금 없는 구현
Android 17부터 Android 17 (API 수준 37)
이상을 타겟팅하는 앱은 새로운 잠금 없는 구현을 수신합니다.
android.os.MessageQueue 새로운 구현은 성능을 개선하고 누락된 프레임을 줄이지만 MessageQueue 비공개 필드 및 메서드를 반영하는 클라이언트를 중단할 수 있습니다.
완화 전략을 비롯한 자세한 내용은 MessageQueue 동작 변경 가이드를 참고하세요.
이제 정적 최종 필드를 수정할 수 없음
Android 17 이상에서 실행되고 Android 17 (API 수준 37) 이상을 타겟팅하는 앱은 static final 필드를 변경할 수 없습니다. 앱이 리플렉션을 사용하여 static final 필드를 변경하려고 하면 IllegalAccessException가 발생합니다. JNI API (예: SetStaticLongField())를 통해 이러한 필드 중 하나를 수정하려고 하면 앱이 비정상 종료됩니다.
접근성
Android 17에서는 접근성을 개선하기 위해 다음과 같은 변경사항을 적용합니다.
복잡한 IME 실제 키보드 입력의 접근성 지원
이 기능은 CJKV 언어 입력에 대한 스크린 리더 음성 피드백을 개선하기 위해 새로운 AccessibilityEvent 및 TextAttribute
API를 도입합니다. 이제 CJKV IME 앱은 텍스트 작성 중에 텍스트 변환 후보가 선택되었는지 신호를 보낼 수 있습니다. 수정 필드가 있는 앱은 텍스트 변경 접근성 이벤트를 보낼 때 텍스트 변경 유형 을 지정할 수 있습니다.
예를 들어 앱은 텍스트 작성 중에 텍스트 변경이 발생했거나 커밋으로 인해 텍스트 변경이 발생했다고 지정할 수 있습니다.
이렇게 하면 스크린 리더와 같은 접근성 서비스가 텍스트 수정의 특성에 따라 더 정확한 피드백을 제공할 수 있습니다.
채택한 앱 수
IME 앱: 수정 필드에서 텍스트를 작성할 때 IME는
TextAttribute.Builder.setTextSuggestionSelected()를 사용하여 특정 변환 후보가 선택되었는지 나타낼 수 있습니다.수정 필드가 있는 앱: 맞춤
InputConnection을 유지하는 앱은TextAttribute.isTextSuggestionSelected()를 호출하여 후보 선택 데이터를 가져올 수 있습니다. 그런 다음 이러한 앱은TYPE_VIEW_TEXT_CHANGED이벤트를 디스패치할 때AccessibilityEvent.setTextChangeTypes()를 호출해야 합니다. 표준TextView를 사용하는 Android 17 (API 수준 37)을 타겟팅하는 앱은 이 기능이 기본적으로 사용 설정됩니다. 즉,TextView는 접근성 서비스에 이벤트를 보낼 때 IME에서 데이터를 가져오고 텍스트 변경 유형을 설정하는 작업을 처리합니다.접근성 서비스:
TYPE_VIEW_TEXT_CHANGED이벤트를 처리하는 접근성 서비스는AccessibilityEvent.getTextChangeTypes()를 호출하여 수정의 특성을 파악하고 이에 따라 피드백 전략을 조정할 수 있습니다.
개인 정보 보호
Android 17에는 사용자 개인 정보 보호를 개선하기 위해 다음과 같은 변경사항이 포함되어 있습니다.
ECH (Encrypted Client Hello) 사용 설정
Android 17 引入了对加密客户端问候 (ECH) 的平台支持。ECH 是一种 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻松识别您的应用所连接的特定网域。
对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于活跃状态。如果无法协商 ECH,客户端会发送一个包含随机内容的 ECH 扩展(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的工作原理,请参阅 RFC 9849。
为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的
<domainEncryption> 元素。
开发者可以在 <base-config> 或
<domain-config> 标记中使用 <domainEncryption>,以全局或按网域的方式选择 ECH 模式(例如
"enabled" 或 "disabled")。
如需了解详情,请参阅加密客户端问候文档。
Android 17을 타겟팅하는 앱에 로컬 네트워크 권한 필요
Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此系统不会再次提示已授予其他 NEARBY_DEVICES 权限的用户。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐秘的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。
以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求此新权限以保持本地网络通信。
如需了解详情,请参阅本地网络权限文档。
실제 기기에서 비밀번호 숨기기
앱이 Android 17 (API 수준 37) 이상을 타겟팅하고 사용자가 실제 입력 장치 (예: 외부 키보드)를 사용하는 경우 Android 운영체제는 비밀번호 필드의 모든 문자에 새로운 show_passwords_physical 설정을 적용합니다. 기본적으로 이 설정은 모든 비밀번호 문자를 숨깁니다.
Android 시스템은 사용자가 비밀번호를 잘못 입력했는지 확인할 수 있도록 마지막으로 입력한 비밀번호 문자를 표시합니다. 하지만 대형 외부 키보드에서는 이 기능이 훨씬 덜 필요합니다. 또한 외부 키보드가 있는 기기는 디스플레이가 더 큰 경우가 많아 입력된 비밀번호를 누군가 볼 위험이 커집니다.
사용자가 기기의 터치 스크린을 사용하는 경우 시스템에서 새 show_passwords_touch 설정을 적용합니다.
표준 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 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到
IntentSender。开发者必须从旧版MODE_BACKGROUND_ACTIVITY_START_ALLOWED常量迁移。相反,您应 采用精细控制,例如MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。 - 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。
기본적으로 CT 사용 설정
如果应用以 Android 17(API 级别 37)或更高版本为目标平台,则默认启用证书透明度 (CT)。(在 Android 16 上,CT 可用,但应用必须选择启用。)
더 안전한 네이티브 DCL—C
앱이 Android 17 (API 수준 37) 이상을 타겟팅하는 경우 DEX 및 JAR 파일에 대해 Android 14에서 도입된 더 안전한 동적 코드 로드 (DCL) 보호가 이제 네이티브 라이브러리로 확장됩니다.
System.load()를 사용하여 로드된 모든 네이티브 파일은 읽기 전용으로 표시해야 합니다.
그러지 않으면 시스템에서 UnsatisfiedLinkError가 발생합니다.
가능하면 항상 코드를 동적으로 로드하지 않는 것이 좋습니다. 이렇게 하면 코드 삽입이나 코드 조작으로 인해 앱이 손상될 위험이 크게 증가하기 때문입니다.
CP2 데이터 뷰에서 PII 필드 제한
对于以 Android 17(API 级别 Android 17(API 级别 37))及更高版本为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,这些列将从数据视图中移除,以增强用户隐私保护。 受限列包括:
如果应用正在使用 ContactsContract.Data
中的这些列,则可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts
中提取这些列。
CP2에서 엄격한 SQL 검사 적용
Android 17 (API 수준 Android 17 (API 수준 37)) 이상을 타겟팅하는 앱의 경우 연락처 제공업체 2 (CP2)는 ContactsContract.Data 테이블에 액세스할 때 READ_CONTACTS 권한 없이 엄격한 SQL 쿼리 유효성 검사를 적용합니다.
이 변경사항을 통해 앱에 READ_CONTACTS
권한이 없으면 StrictColumns 및
StrictGrammar 옵션이 ContactsContract.Data 테이블을 쿼리할 때 설정됩니다. 쿼리에서 이러한 옵션과 호환되지 않는 패턴을 사용하는 경우 쿼리가 거부되고 예외가 발생합니다.
미디어
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 소켓의 표준 자바 InputStream 동작과 일치하도록 다음과 같은 변경사항을 도입합니다.
RFCOMM의 일관된 BluetoothSocket read() 동작
Android 17 (API 수준 37)을 타겟팅하는 앱의 경우 RFCOMM 기반 BluetoothSocket에서 가져온 InputStream의 read() 메서드가 이제 소켓이 닫히거나 연결이 끊어지면 -1를 반환합니다.
이 변경사항은 RFCOMM 소켓 동작을 LE CoC 소켓과 일치시키고 스트림 끝에 도달하면 -1이 반환된다고 명시된 표준 InputStream.read() 문서와 일치합니다.
IOException을 포착하여 읽기 루프에서 벗어나는 데만 의존하는 앱은 이 변경사항의 영향을 받을 수 있으므로 BluetoothSocket 읽기 루프를 업데이트하여 -1의 반환 값을 명시적으로 확인해야 합니다. 이렇게 하면 원격 기기가 연결 해제되거나 소켓이 닫힐 때 루프가 올바르게 종료됩니다. 권장 구현의 예는 블루투스 데이터 전송 가이드의 코드 스니펫을 참고하세요.