이전 버전과 마찬가지로 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 실제 키보드 입력의 접근성 지원
此功能引入了新的 AccessibilityEvent 和 TextAttribute 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 引入了对加密客户端问候 (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 강화 및 개선된 선택: 보호를
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 데이터 뷰에서 PII 필드 제한
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)为目标平台的应用,
read() 方法从InputStream 获取的
基于 RFCOMM 的 BluetoothSocket 现在会在
套接字关闭或连接断开时返回 -1。
此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read()
文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1。
仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。