เช่นเดียวกับรุ่นก่อนๆ Android 17 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อ แอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลเฉพาะกับแอปที่ กำหนดเป้าหมายเป็น Android 17 ขึ้นไป หากแอปกำหนดเป้าหมายเป็น Android 17 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ (หากมี)
นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่ส่งผลต่อแอปทั้งหมด
ที่ทำงานบน Android 17 ไม่ว่า targetSdkVersion ของแอปจะเป็นอย่างไร
ฟังก์ชันหลัก
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 ที่ซับซ้อน
ฟีเจอร์นี้จะแนะนำ API AccessibilityEvent และ TextAttribute ใหม่เพื่อปรับปรุงคำพูดตอบกลับของโปรแกรมอ่านหน้าจอสำหรับการป้อนข้อมูลภาษา CJKV ตอนนี้แอป CJKV IME สามารถส่งสัญญาณว่ามีการเลือกตัวเลือกการแปลงข้อความระหว่างการเขียนข้อความหรือไม่ แอปที่มีช่องแก้ไขสามารถระบุ ประเภทการเปลี่ยนแปลงข้อความ เมื่อส่งเหตุการณ์การช่วยเหลือพิเศษที่ข้อความมีการเปลี่ยนแปลง
เช่น แอปสามารถระบุว่ามีการเปลี่ยนแปลงข้อความระหว่างการเขียนข้อความ หรือการเปลี่ยนแปลงข้อความเกิดจากการคอมมิต
การดำเนินการนี้จะช่วยให้บริการการช่วยเหลือพิเศษ เช่น โปรแกรมอ่านหน้าจอ สามารถให้คำพูดตอบกลับที่แม่นยำยิ่งขึ้นตามลักษณะของการแก้ไขข้อความ
การรับแอปไปใช้งาน
แอป IME: เมื่อตั้งค่าการเขียนข้อความในช่องแก้ไข IME สามารถใช้
TextAttribute.Builder.setTextSuggestionSelected()เพื่อระบุว่ามีการเลือกตัวเลือกการแปลงที่เฉพาะเจาะจงหรือไม่แอปที่มีช่องแก้ไข: แอปที่ดูแลรักษา
InputConnectionที่กำหนดเองสามารถเรียกข้อมูลการเลือกตัวเลือกได้โดยการเรียกTextAttribute.isTextSuggestionSelected()จากนั้นแอปเหล่านี้ควรเรียกAccessibilityEvent.setTextChangeTypes()เมื่อส่งเหตุการณ์TYPE_VIEW_TEXT_CHANGEDแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ซึ่งใช้TextViewมาตรฐานจะเปิดใช้ฟีเจอร์นี้โดยค่าเริ่มต้น (นั่นคือTextViewจะจัดการการดึงข้อมูลจาก IME และตั้งค่าประเภทการเปลี่ยนแปลงข้อความเมื่อส่งเหตุการณ์ไปยังบริการการช่วยเหลือพิเศษ)บริการการช่วยเหลือพิเศษ: บริการการช่วยเหลือพิเศษที่ประมวลผลเหตุการณ์
TYPE_VIEW_TEXT_CHANGEDสามารถเรียกAccessibilityEvent.getTextChangeTypes()เพื่อระบุลักษณะของการแก้ไขและปรับกลยุทธ์คำพูดตอบกลับตามนั้น
ความเป็นส่วนตัว
Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงความเป็นส่วนตัวของผู้ใช้
เปิดใช้ ECH (Encrypted Client Hello) แล้ว
Android 17 ขอแนะนำการรองรับแพลตฟอร์มสำหรับ ClientHello ที่เข้ารหัส (ECH) ซึ่งเป็นส่วนขยาย TLS ที่ช่วยเพิ่มความเป็นส่วนตัวของผู้ใช้ด้วยการเข้ารหัสการระบุชื่อเซิร์ฟเวอร์ (SNI) ในการแฮนด์เชก TLS การเข้ารหัสนี้ช่วยป้องกันไม่ให้ผู้สังเกตการณ์เครือข่ายระบุโดเมนที่เฉพาะเจาะจงซึ่งแอปของคุณเชื่อมต่ออยู่ได้อย่างง่ายดาย
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป ระบบจะใช้ ECH สำหรับการเชื่อมต่อ TLS ECH จะทำงานก็ต่อเมื่อไลบรารีเครือข่ายที่แอปใช้ (เช่น HttpEngine, WebView หรือ OkHttp) มีการรองรับ ECH ในตัว และเซิร์ฟเวอร์ระยะไกลรองรับโปรโตคอล ECH ด้วย หากเจรจาต่อรอง ECH ไม่ได้ ไคลเอ็นต์จะส่งส่วนขยาย ECH ที่มีเนื้อหาแบบสุ่ม (กลไกที่เรียกว่า ECH GREASE) ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีที่ ECH GREASE ทำงานได้ที่ RFC 9849
Android 17 เพิ่มองค์ประกอบใหม่
<domainEncryption>ลงในไฟล์การกำหนดค่าความปลอดภัยของเครือข่ายเพื่อให้แอปปรับแต่งลักษณะการทำงานนี้ได้
นักพัฒนาแอปสามารถใช้ <domainEncryption> ภายใน <base-config> หรือ
<domain-config> แท็กเพื่อเลือกโหมด ECH (เช่น
"enabled" หรือ "disabled") ในระดับโลกหรือระดับโดเมน
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับ ClientHello ที่เข้ารหัส
ต้องมีสิทธิ์เข้าถึงเครือข่าย LAN สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17
Android 17 เปิดตัวสิทธิ์รันไทม์ ACCESS_LOCAL_NETWORK
เพื่อปกป้องผู้ใช้จากการเข้าถึงเครือข่ายในเครื่องโดยไม่ได้รับอนุญาต เนื่องจากฟีเจอร์นี้อยู่ภายใต้กลุ่มสิทธิ์ NEARBY_DEVICES ที่มีอยู่ ผู้ใช้ที่ให้สิทธิ์ NEARBY_DEVICES อื่นๆ ไปแล้วจึงไม่ต้องรับข้อความแจ้งอีก ข้อกำหนดใหม่นี้จะป้องกันไม่ให้แอปที่เป็นอันตรายใช้ประโยชน์จากการเข้าถึงเครือข่าย LAN แบบไม่จำกัดเพื่อติดตามผู้ใช้และลายนิ้วมืออย่างลับๆ การประกาศและขอสิทธิ์นี้จะช่วยให้แอปค้นหาและเชื่อมต่อกับอุปกรณ์ในเครือข่ายเฉพาะที่ (LAN) ได้ เช่น อุปกรณ์สมาร์ทโฮมหรือเครื่องรับการแคสต์
ตอนนี้แอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไปมี 2 วิธีในการรักษาการสื่อสารกับอุปกรณ์ LAN ได้แก่ ใช้เครื่องมือเลือกอุปกรณ์ที่ระบบเป็นสื่อกลางซึ่งรักษาความเป็นส่วนตัวเพื่อข้ามข้อความแจ้งขอสิทธิ์ หรือขอสิทธิ์ใหม่นี้อย่างชัดเจนในรันไทม์เพื่อรักษาการสื่อสารในเครือข่าย LAN
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับสิทธิ์เครือข่าย LAN
ซ่อนรหัสผ่านจากอุปกรณ์จริง
หากแอปกำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไปและผู้ใช้ใช้อุปกรณ์ป้อนข้อมูลจริง (เช่น แป้นพิมพ์ภายนอก) ระบบปฏิบัติการ Android จะใช้การตั้งค่า show_passwords_physical ใหม่กับอักขระทั้งหมดในช่องรหัสผ่าน โดยค่าเริ่มต้น การตั้งค่าดังกล่าวจะซ่อนอักขระรหัสผ่านทั้งหมด
ระบบ Android จะแสดงอักขระรหัสผ่านที่พิมพ์ล่าสุดเพื่อช่วยให้ผู้ใช้เห็นว่าพิมพ์รหัสผ่านผิดหรือไม่ อย่างไรก็ตาม ฟีเจอร์นี้มีความจำเป็นน้อยลงมากเมื่อใช้แป้นพิมพ์ภายนอกขนาดใหญ่ นอกจากนี้ อุปกรณ์ที่มีแป้นพิมพ์ภายนอกมักจะมีจอแสดงผลขนาดใหญ่ ซึ่งเพิ่มความเสี่ยงที่ผู้อื่นจะเห็นรหัสผ่านที่พิมพ์
หากผู้ใช้ใช้หน้าจอสัมผัสของอุปกรณ์ ระบบจะใช้การตั้งค่า show_passwords_touch ใหม่
การป้องกัน OTP สำหรับข้อความ SMS มาตรฐาน
ตั้งแต่ Android 17 เป็นต้นไป Android จะขยายการป้องกัน OTP ทาง SMS
ให้ครอบคลุมข้อความ SMS มาตรฐาน (ข้อความ SMS ที่มี OTP ซึ่งไม่ได้
ใช้รูปแบบ WebOTP หรือ SMS Retriever) สำหรับแอปส่วนใหญ่ที่กำหนดเป้าหมายเป็น
Android 17 (ระดับ API 37) ขึ้นไป ข้อความ SMS เหล่านี้จะ
พร้อมใช้งานหลังจากได้รับ 3 ชั่วโมง ความล่าช้านี้มีจุดประสงค์เพื่อช่วย
ป้องกันการลักลอบใช้ OTP ในระหว่างการหน่วงเวลา 3 ชั่วโมงนี้ ระบบจะระงับการออกอากาศSMS_RECEIVED_ACTION และกรองการค้นหาฐานข้อมูลของผู้ให้บริการ SMS ข้อความ SMS จะพร้อมใช้งานในแอปเหล่านี้หลังจากผ่านไปตามระยะเวลาที่ล่าช้า
แอปบางอย่าง เช่น แอปผู้ช่วย SMS เริ่มต้น แอปคู่หูของอุปกรณ์ที่เชื่อมต่อ ฯลฯ จะได้รับการยกเว้นจากความล่าช้านี้ แอปทั้งหมดที่ต้องอ่านข้อความ SMS เพื่อดึงข้อมูล OTP ควรเปลี่ยนไปใช้ 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)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。
使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。
จำกัดช่อง PII ในมุมมองข้อมูล CP2
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป Contacts Provider 2 (CP2) จะจำกัดคอลัมน์บางรายการที่มีข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) จากมุมมองข้อมูล เมื่อเปิดใช้การเปลี่ยนแปลงนี้ ระบบจะนำคอลัมน์เหล่านี้ออกจากมุมมองข้อมูลเพื่อเพิ่มความเป็นส่วนตัวของผู้ใช้ คอลัมน์ที่จำกัด ได้แก่
แอปที่ใช้คอลัมน์เหล่านี้จาก ContactsContract.Data
สามารถดึงข้อมูลจาก ContactsContract.RawContacts
แทนได้โดยการรวมกับ RAW_CONTACT_ID
บังคับใช้การตรวจสอบ SQL อย่างเข้มงวดใน CP2
对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。
在此项更改生效后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumns 和 StrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。
สื่อ
Android 17 มีการเปลี่ยนแปลงลักษณะการทำงานของสื่อต่อไปนี้
การปิดช่องโหว่ของเสียงที่เล่นขณะล็อกหน้าจอ
从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。
部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:
- 前台服务必须具有仅在使用时授予的权限 (WIU)。
- 应用必须具有精确闹钟权限,并且正在与
USAGE_ALARM音频流互动。
如需了解详情(包括缓解措施),请参阅后台音频安全加固。
รูปแบบของอุปกรณ์
Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงประสบการณ์ของผู้ใช้ ในอุปกรณ์ขนาดและรูปแบบต่างๆ
การเปลี่ยนแปลง API ของแพลตฟอร์มเพื่อไม่สนใจข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพบนหน้าจอขนาดใหญ่ (sw>=600dp)
我们在 Android 16 中引入了平台 API 变更,以 忽略屏幕方向、 宽高比和尺寸调整能力限制(针对大型屏幕,sw >= 600dp),适用于面向 API 级别 36 或更高级别的应用。开发者可以选择使用 SDK 36 退出这些变更,但对于面向 Android 17(API 级别 37)或更高级别的应用,此退出选项将不再可用。
如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制。
การเชื่อมต่อ
Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงความสอดคล้องและ
สอดคล้องกับInputStreamลักษณะการทำงานของ Java มาตรฐานสำหรับซ็อกเก็ต RFCOMM ของบลูทูธ
ลักษณะการทำงานของ read() ใน BluetoothSocket สำหรับ RFCOMM ที่สอดคล้องกัน
对于以 Android 17(API 级别 37)为目标平台的应用,
read() 方法从InputStream 获取的
基于 RFCOMM 的 BluetoothSocket 现在会在
套接字关闭或连接断开时返回 -1。
此更改使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read()
文档保持一致,该文档指出,当到达流的末尾时,系统会返回 -1。
仅依赖于捕获 IOException 以跳出读取循环的应用可能会受到此更改的影响,并且应更新 BluetoothSocket 读取循环以明确检查返回值 -1。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段。