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

이전 버전과 마찬가지로 Android 17에는 앱에 영향을 미칠 수 있는 동작 변경사항이 포함되어 있습니다. 다음 동작 변경사항은 Android 17 이상을 타겟팅하는 앱에만 적용됩니다. 앱이 Android 17 이상을 타겟팅하는 경우 이러한 동작을 지원하도록 앱을 수정해야 합니다(해당하는 경우).

앱의 targetSdkVersion과 관계없이 Android 17에서 실행되는 모든 앱에 영향을 미치는 동작 변경사항 목록도 검토해야 합니다.

핵심 기능

Android 17에는 Android 시스템의 다양한 핵심 기능을 수정하거나 확장하는 다음과 같은 변경사항이 포함되어 있습니다.

MessageQueue의 새로운 잠금 해제 구현

Android 17부터 Android 17 이상을 타겟팅하는 앱은 android.os.MessageQueue의 새로운 잠금 해제 구현을 수신합니다. 새 구현은 성능을 개선하고 누락된 프레임을 줄이지만 MessageQueue 비공개 필드와 메서드를 반영하는 클라이언트를 중단할 수 있습니다.

완화 전략을 비롯한 자세한 내용은 MessageQueue 동작 변경 안내를 참고하세요.

이제 정적 최종 필드를 수정할 수 없음

Android 17 이상을 타겟팅하고 Android 17 이상에서 실행되는 앱은 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 为目标平台且使用标准 TextView 的应用默认会启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

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

보안

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

활동 보안

在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解严重程度较高的漏洞利用(例如网络钓鱼、交互劫持和混淆代理攻击)的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 强化和改进的选择启用机制:我们正在通过将保护范围扩展到 IntentSender 来完善后台 activity 启动 (BAL) 限制。 开发者必须弃用旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量。相反,您应采用精细的控制措施,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,该措施会将 activity 启动限制在调用应用可见的场景中,从而显著减小攻击面。
  • 采用工具:开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保做好准备,以满足未来的目标 SDK 要求。

localhost 보호

플랫폼 보안과 사용자 개인 정보 보호를 개선하기 위해 Android 17에서는 새로운 설치 시간 권한 USE_LOOPBACK_INTERFACE을 도입합니다. 이 변경사항은 이전에 INTERNET 권한으로 암시적으로 허용되었던 루프백 인터페이스(예: 127.0.0.1 또는 ::1)를 통한 교차 앱 및 교차 프로필 통신을 제한합니다. Android 17 이상을 타겟팅하는 앱에는 다음 규칙이 적용됩니다.

  • 상호 동의 필요: 이제 교차 앱 및 교차 프로필 통신이 기본적으로 차단됩니다. 연결이 성공하려면 전송 앱과 수신 앱 모두 매니페스트에서 USE_LOOPBACK_INTERFACE 권한을 명시적으로 선언해야 합니다.
  • 앱 내 트래픽 예외: 동일한 앱 내의 루프백 통신(앱 내 통신)은 영향을 받지 않으며 이 새로운 권한이 필요하지 않습니다.
  • 타겟 SDK 동작:
    • 앱이 Android 17 이상을 타겟팅하는 경우: 권한을 명시적으로 요청해야 합니다. 누락된 경우 소켓 작업 (예: TCP 연결 또는 UDP 전송)이 실패하고 일반적으로 EPERM(작업이 허용되지 않음) 오류가 반환됩니다.
    • 앱이 API 수준 36 이하를 타겟팅하는 경우: 권한이 INTERNET에서 분할 권한으로 취급됩니다. 낮은 API 수준을 타겟팅하는 앱이 INTERNET를 보유하는 경우 이 권한이 자동으로 부여됩니다.
  • 호환성 경고: 수신 앱이 타겟을 Android 17로 업데이트했지만 이 권한을 요청하지 않으면 전송 앱이 더 낮은 API 수준을 타겟팅하더라도 다른 앱에서 수신되는 연결이 거부됩니다.

기본적으로 CT 사용 설정

앱이 Android 17 이상을 타겟팅하는 경우 인증서 투명성 (CT)이 기본적으로 사용 설정됩니다. (Android 16에서는 CT를 사용할 수 있지만 앱이 선택해야 했습니다.)

더 안전한 네이티브 DCL—C

앱이 Android 17 이상을 타겟팅하는 경우 DEX 및 JAR 파일용으로 Android 14에 도입된 더 안전한 동적 코드 로드 (DCL) 보호가 이제 네이티브 라이브러리로 확장됩니다.

System.load()를 사용하여 로드된 모든 네이티브 파일은 읽기 전용으로 표시해야 합니다. 그렇지 않으면 시스템에서 UnsatisfiedLinkError를 발생시킵니다.

가능하면 항상 코드를 동적으로 로드하지 않는 것이 좋습니다. 이렇게 하면 코드 삽입이나 코드 조작으로 인해 앱이 손상될 위험이 크게 증가하기 때문입니다.

기기 폼 팩터

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

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

Android 16에서는 API 수준 36 이상을 타겟팅하는 앱의 경우 대형 화면 (sw >= 600dp)에서 방향, 가로세로 비율, 크기 조절 제한을 무시하도록 플랫폼 API 변경사항을 도입했습니다. 개발자는 SDK 36으로 이러한 변경사항을 선택 해제할 수 있지만 Android 17 이상을 타겟팅하는 앱에서는 더 이상 선택 해제할 수 없습니다.

자세한 내용은 방향 및 크기 조절 제한사항이 무시됨을 참고하세요.