동작 변경사항: 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(API 级别 37)或更高版本为目标平台的 Android 17 或更高版本上运行的应用无法更改 static final 字段。如果应用尝试使用反射更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 SetStaticLongField())修改其中一个字段会导致应用崩溃。

접근성

Android 17에서는 접근성을 개선하기 위해 다음과 같이 변경됩니다.

복잡한 IME 실제 키보드 입력의 접근성 지원

이 기능은 CJKV 언어 입력에 대한 스크린 리더 음성 피드백을 개선하기 위해 새로운 AccessibilityEventTextAttribute 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,连接会自动回退到不使用 SNI 加密的标准 TLS 握手。

为了让应用能够自定义此行为,Android 17 向网络安全配置文件添加了一个新的 <domainEncryption> 元素。 开发者可以在 <base-config><domain-config> 标记中使用 <domainEncryption>,以全局或按网域 的方式选择 ECH 模式(例如 "opportunistic""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 설정을 적용합니다.

보안

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)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。

使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError

我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。

CP2 데이터 뷰에서 PII 필드 제한

Android 17(API 수준 37) 이상을 타겟팅하는 앱의 경우 연락처 제공자 2(CP2)는 데이터 뷰에서 개인 식별 정보(PII)가 포함된 특정 열을 제한합니다. 이 변경사항이 사용 설정되면 사용자 개인 정보 보호를 위해 이러한 열이 데이터 뷰에서 삭제됩니다. 제한된 열에는 다음이 포함됩니다.

ContactsContract.Data에서 이러한 열을 사용하는 앱은 RAW_CONTACT_ID와 조인하여 ContactsContract.RawContacts에서 추출할 수 있습니다.

CP2에서 엄격한 SQL 검사 적용

对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。

在此项更改生效后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumnsStrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。

미디어

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)을 타겟팅하는 앱의 경우 RFCOMM 기반 BluetoothSocket에서 가져온 InputStreamread() 메서드가 이제 소켓이 닫히거나 연결이 끊어지면 -1를 반환합니다.

이 변경사항은 RFCOMM 소켓 동작을 LE CoC 소켓과 일치시키고 스트림 끝에 도달하면 -1이 반환된다고 명시된 표준 InputStream.read() 문서와 일치합니다.

IOException을 포착하여 읽기 루프에서 벗어나는 데만 의존하는 앱은 이 변경사항의 영향을 받을 수 있으므로 BluetoothSocket 읽기 루프를 업데이트하여 -1의 반환 값을 명시적으로 확인해야 합니다. 이렇게 하면 원격 기기가 연결 해제되거나 소켓이 닫힐 때 루프가 올바르게 종료됩니다. 권장 구현의 예는 블루투스 데이터 전송 가이드의 코드 스니펫을 참고하세요.