동작 변경사항: Android 17 이상을 타겟팅하는 앱

이전 버전과 마찬가지로 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 물리적 키보드 입력의 접근성 지원

此功能引入了新的 AccessibilityEventTextAttribute API,以增强屏幕阅读器针对 CJKV 语言输入的语音反馈。CJKV IME 应用现在可以指示在文本撰写期间是否已选择文本转换候选内容。具有编辑字段的应用可以在发送文本更改无障碍事件时指定文本更改类型。例如,应用可以指定在文本撰写期间发生了文本更改,或者文本更改是由提交导致的。这样做可让屏幕阅读器等无障碍服务根据文本修改的性质提供更精确的反馈。

应用采用量

  • IME 应用:在编辑字段中设置正在撰写的文本时,IME 可以使用 TextAttribute.Builder.setTextSuggestionSelected() 来指明是否选择了特定的转换候选对象。

  • 具有“编辑字段”权限的应用:维护自定义 InputConnection 的应用可以通过调用 TextAttribute.isTextSuggestionSelected() 来检索候选选择数据。然后,这些应用在调度 TYPE_VIEW_TEXT_CHANGED 事件时应调用 AccessibilityEvent.setTextChangeTypes()。如果应用以 Android 17(API 级别 37)为目标平台,并使用标准 TextView,则默认启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

  • 无障碍服务:处理 TYPE_VIEW_TEXT_CHANGED 事件的无障碍服务可以调用 AccessibilityEvent.getTextChangeTypes() 来识别修改的性质,并相应地调整其反馈策略。

개인 정보 보호

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 기기와의 통신을 유지하는 두 가지 경로가 있습니다. 시스템 중재, 개인 정보 보호 기기 선택기를 채택하여 권한 메시지를 건너뛰거나 런타임에 이 새로운 권한을 명시적으로 요청하여 로컬 네트워크 통신을 유지합니다.

자세한 내용은 로컬 네트워크 권한 문서를 참고하세요.

실제 기기에서 비밀번호 숨기기

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android 操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。

Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。

如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。

표준 SMS 메시지의 OTP 보호

从 Android 17 开始,Android 将扩展其短信验证码保护功能,以适用于标准短信(包含验证码但不使用 WebOTP 或 SMS Retriever 格式的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,这些短信在收到后三小时内不会提供。此延迟旨在帮助防止动态密码劫持。在这三小时的延迟期间,系统会保留 SMS_RECEIVED_ACTION广播,并过滤 短信提供商数据库查询。延迟结束后,这些应用即可使用短信。

某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信 来提取动态密码的应用都应改用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

보안

Android 17에서는 기기 및 앱 보안이 다음과 같이 개선되었습니다.

활동 보안

Android 17에서 플랫폼은 '기본적으로 보안' 아키텍처로 계속 전환하여 피싱, 상호작용 가로채기, 혼동된 대리인 공격과 같은 심각한 악용을 완화하도록 설계된 다양한 개선사항을 도입합니다. 이 업데이트에서는 개발자가 앱 호환성과 사용자 보호를 유지하기 위해 새로운 보안 표준을 명시적으로 선택해야 합니다.

개발자에게 미치는 주요 영향은 다음과 같습니다.

  • BAL 강화 및 개선된 선택: 보호를 IntentSender로 확장하여 백그라운드 활동 실행 (BAL) 제한사항을 개선하고 있습니다. 개발자는 기존 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 상수에서 이전해야 합니다. 대신 호출 앱이 표시되는 시나리오로 활동 시작을 제한하여 공격 노출 영역을 크게 줄이는 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE과 같은 세분화된 컨트롤을 채택해야 합니다.
  • 채택 도구: 개발자는 엄격 모드와 업데이트된 린트 검사를 활용하여 기존 패턴을 식별하고 향후 타겟 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 데이터 보기에서 개인 식별 정보 필드 제한

对于以 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 권한이 없으면 StrictColumnsStrictGrammar 옵션이 ContactsContract.Data 테이블을 쿼리할 때 설정됩니다. 쿼리에서 이러한 옵션과 호환되지 않는 패턴을 사용하는 경우 쿼리가 거부되고 예외가 발생합니다.

미디어

Android 17에는 미디어 동작이 다음과 같이 변경되었습니다.

백그라운드 오디오 강화

从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。

部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:

  • 前台服务必须具有仅在使用时授予的权限 (WIU)。
  • 应用必须具有精确闹钟权限,并且正在与 USAGE_ALARM 音频流互动。

如需了解详情(包括缓解措施),请参阅后台音频安全加固

기기 폼 팩터

Android 17에는 다양한 기기 크기와 폼 팩터에서 사용자 환경을 개선하기 위한 다음 변경사항이 포함되어 있습니다.

대형 화면 (sw>=600dp)에서 방향, 크기 조절, 가로세로 비율 제약을 무시하도록 플랫폼 API 변경

我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。

如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制

연결

Android 17에서는 일관성을 개선하고 블루투스 RFCOMM 소켓의 표준 Java InputStream 동작과 맞추기 위해 다음과 같은 변경사항을 도입했습니다.

RFCOMM의 일관된 BluetoothSocket read() 동작

对于以 Android 17(API 级别 37)为目标平台的应用, read() 方法从InputStream 获取的 基于 RFCOMM 的 BluetoothSocket 现在会在 套接字关闭或连接断开时返回 -1

此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read() 文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1

仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。