Android 17 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณเช่นเดียวกับรุ่นก่อนๆ โดยการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้จะมีผลกับแอปที่กำหนดเป้าหมายเป็น Android 17 ขึ้นไปเท่านั้น หากแอปกำหนดเป้าหมายเป็น Android 17 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ในกรณีที่เกี่ยวข้อง
นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลกับแอปทั้งหมดที่ทำงานบน Android 17 ไม่ว่า targetSdkVersion ของแอปจะเป็นเวอร์ชันใดก็ตาม
ฟังก์ชันหลัก
Android 17 มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือขยายความสามารถหลักต่างๆ ของระบบ Android
การใช้งาน MessageQueue แบบใหม่ที่ไม่มีการล็อก
ตั้งแต่ Android 17 เป็นต้นไป แอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37)
ขึ้นไปจะได้รับการใช้งาน
android.os.MessageQueue แบบใหม่ที่ไม่มีการล็อก การใช้งานแบบใหม่นี้ช่วยปรับปรุงประสิทธิภาพและลดเฟรมที่พลาดไป แต่ก็อาจทำให้ไคลเอ็นต์ที่ใช้การสะท้อนข้อมูลในฟิลด์และเมธอดส่วนตัวของ MessageQueue ใช้งานไม่ได้
ดูข้อมูลเพิ่มเติม รวมถึงกลยุทธ์การลดผลกระทบได้ที่MessageQueue คำแนะนำเกี่ยวกับการเปลี่ยนแปลงลักษณะการทำงาน
ตอนนี้ฟิลด์ `static final` แก้ไขไม่ได้แล้ว
แอปที่ทำงานบน 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 ที่เข้ารหัส
ต้องมีสิทธิ์เข้าถึงเครือข่ายภายในสำหรับแอปที่กำหนดเป้าหมายเป็น 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 API หรือ SMS User Consent API เพื่อให้ฟังก์ชันการทำงานยังคงดำเนินต่อไปได้
ความปลอดภัย
Android 17 มีการปรับปรุงความปลอดภัยของอุปกรณ์และแอปดังต่อไปนี้
ความปลอดภัยของกิจกรรม
ใน Android 17 แพลตฟอร์มจะยังคงเปลี่ยนไปใช้สถาปัตยกรรม "ปลอดภัยตั้งแต่ต้น" โดยจะมีการเปิดตัวชุดการปรับปรุงที่ออกแบบมาเพื่อลดการใช้ประโยชน์จากช่องโหว่ระดับรุนแรง เช่น ฟิชชิง การจี้การโต้ตอบ และการโจมตีแบบ Confused Deputy การอัปเดตนี้กำหนดให้นักพัฒนาแอปต้องเลือกใช้มาตรฐานความปลอดภัยใหม่โดยชัดแจ้งเพื่อรักษาความเข้ากันได้ของแอปและการปกป้องผู้ใช้
ผลกระทบหลักสำหรับนักพัฒนาแอปมีดังนี้
- การเสริมความแข็งแกร่งของ BAL และการเลือกใช้ที่ปรับปรุงแล้ว: เรากำลังปรับแต่งข้อจำกัดในการเปิดใช้กิจกรรมในเบื้องหลัง (BAL) โดยขยายการปกป้องไปยัง
IntentSenderนักพัฒนาแอปต้องย้ายข้อมูลออกจากค่าคงที่แบบเดิมMODE_BACKGROUND_ACTIVITY_START_ALLOWEDแต่ควรใช้ การควบคุมแบบละเอียด เช่นMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLEซึ่งจำกัด การเริ่มต้นกิจกรรมไว้เฉพาะสถานการณ์ที่แอปที่เรียกใช้มองเห็นได้ ซึ่งจะช่วย ลดพื้นที่ผิวของการโจมตีได้อย่างมาก - เครื่องมือการนำไปใช้: นักพัฒนาแอปควรใช้โหมดเข้มงวดและการตรวจสอบ Lint ที่อัปเดตแล้วเพื่อระบุรูปแบบเดิมและเตรียมพร้อมสำหรับข้อกำหนด SDK เป้าหมายในอนาคต
เปิดใช้ CT โดยค่าเริ่มต้น
หากแอปกำหนดเป้าหมายเป็น Android 17 (API ระดับ 37) ขึ้นไป Certificate Transparency (CT) ระบบจะเปิดใช้โดยค่าเริ่มต้น (ใน Android 16 นั้น CT พร้อมใช้งาน แต่แอปต้อง เลือกใช้)
DCL ดั้งเดิมที่ปลอดภัยยิ่งขึ้น - C
หากแอปกำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป การป้องกันการโหลดโค้ดแบบไดนามิก (DCL) ที่ปลอดภัยยิ่งขึ้นซึ่งเปิดตัวใน Android 14 สำหรับไฟล์ DEX และ JAR จะครอบคลุมไลบรารีเนทีฟด้วย
ไฟล์เนทีฟทั้งหมดที่โหลดโดยใช้ 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 ระดับ Android 17 (API ระดับ 37)) ขึ้นไป ผู้ให้บริการรายชื่อติดต่อ 2 (CP2) จะบังคับใช้การตรวจสอบการค้นหา SQL อย่างเข้มงวดเมื่อมีการเข้าถึงตาราง ContactsContract.Data โดยไม่มีสิทธิ์ READ_CONTACTS
การเปลี่ยนแปลงนี้จะทำให้ระบบตั้งค่าตัวเลือก StrictColumns และ
StrictGrammar เมื่อค้นหาตาราง ContactsContract.Data หากแอปไม่มีสิทธิ์ READ_CONTACTS
หากคำค้นหา
ใช้รูปแบบที่ไม่เข้ากันกับรูปแบบเหล่านี้ ระบบจะ
ปฏิเสธและทำให้เกิดข้อยกเว้น
สื่อ
Android 17 มีการเปลี่ยนแปลงลักษณะการทำงานของสื่อดังต่อไปนี้
การปิดช่องโหว่ของเสียงในเบื้องหลัง
ตั้งแต่ Android 17 เป็นต้นไป เฟรมเวิร์กเสียงจะบังคับใช้ข้อจำกัดเกี่ยวกับการโต้ตอบกับเสียงในเบื้องหลัง ซึ่งรวมถึงการเล่นเสียง คำขอโฟกัสเสียง และ API การเปลี่ยนแปลงระดับเสียง เพื่อให้มั่นใจว่าผู้ใช้เป็นผู้เริ่มการเปลี่ยนแปลงเหล่านี้โดยเจตนา
ข้อจำกัดด้านเสียงบางอย่างมีผลกับแอปทั้งหมด อย่างไรก็ตาม ข้อจำกัดจะเข้มงวดมากขึ้นหากแอปกำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) หากแอปใดแอปหนึ่งต่อไปนี้โต้ตอบกับเสียงขณะทำงานในเบื้องหลัง แอปนั้นจะต้องมีบริการที่ทำงานอยู่เบื้องหน้า นอกจากนี้ แอปต้องเป็นไปตามข้อกำหนดข้อใดข้อหนึ่งหรือทั้ง 2 ข้อต่อไปนี้
- บริการที่ทำงานอยู่เบื้องหน้าต้องมีความสามารถในการทำงานขณะใช้งาน (WIU)
- แอปต้องมีสิทธิ์ปลุกที่แน่นอนและโต้ตอบกับ
USAGE_ALARMสตรีมเสียง
ดูข้อมูลเพิ่มเติม รวมถึงกลยุทธ์การลดผลกระทบได้ที่การรักษาความปลอดภัยของเสียงในเบื้องหลัง
รูปแบบของอุปกรณ์
Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงประสบการณ์ของผู้ใช้ในอุปกรณ์ที่มีขนาดและรูปแบบต่างๆ
การเปลี่ยนแปลง API ของแพลตฟอร์มเพื่อไม่ใช้ข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และอัตราส่วนกว้างยาวบนหน้าจอขนาดใหญ่ (sw>=600dp)
เราได้เปิดตัวการเปลี่ยนแปลง Platform API ใน Android 16 เพื่อ ไม่ใช้ข้อจำกัดด้านการวางแนว อัตราส่วนกว้างยาว และความสามารถในการปรับขนาดบนหน้าจอขนาดใหญ่ (sw >= 600dp) สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36 ขึ้นไป นักพัฒนาแอปมีตัวเลือกในการเลือกไม่ใช้การเปลี่ยนแปลงเหล่านี้ด้วย SDK 36 แต่ตัวเลือกนี้จะไม่มีให้บริการอีกต่อไปสำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป
ดูข้อมูลเพิ่มเติมได้ที่ระบบไม่ใช้ข้อจำกัดด้านการวางแนวและความสามารถในการปรับขนาด แล้ว
การเชื่อมต่อ
Android 17 ขอแนะนำการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงความสอดคล้องและให้สอดคล้องกับลักษณะการทำงาน InputStream มาตรฐานของ Java สำหรับซ็อกเก็ต RFCOMM ของบลูทูธ
ลักษณะการทำงาน read() ของ BluetoothSocket ที่สอดคล้องกันสำหรับ RFCOMM
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (API ระดับ 37) ตอนนี้เมธอด
read() ของ InputStream ที่ได้จาก
BluetoothSocket ที่อิงตาม RFCOMM จะแสดงผล -1 เมื่อ
ซ็อกเก็ตปิดอยู่หรือการเชื่อมต่อขาดหายไป
การเปลี่ยนแปลงนี้ทำให้พฤติกรรมของซ็อกเก็ต RFCOMM สอดคล้องกับซ็อกเก็ต LE CoC และ
สอดคล้องกับเอกสารประกอบ InputStream.read()
มาตรฐาน ซึ่งระบุว่าระบบจะแสดงผล -1 เมื่อถึงจุดสิ้นสุดของสตรีม
แอปที่อาศัยการดักจับ IOException เพียงอย่างเดียวเพื่อออกจากลูปการอ่านอาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้ และควรอัปเดตลูปการอ่าน BluetoothSocket เพื่อตรวจสอบค่าที่แสดงผล -1 อย่างชัดแจ้ง ซึ่งจะช่วยให้ลูปสิ้นสุดลงอย่างถูกต้องเมื่ออุปกรณ์ระยะไกลตัดการเชื่อมต่อหรือซ็อกเก็ตปิดอยู่ ดูตัวอย่างการติดตั้งใช้งานที่แนะนำได้ใน
ข้อมูลโค้ดในคู่มือการโอนข้อมูล Bluetooth