การเปลี่ยนแปลงลักษณะการทำงาน: แอปที่กำหนดเป้าหมายเป็น Android 16 ขึ้นไป

เช่นเดียวกับรุ่นก่อนๆ Android 16 มีการเปลี่ยนแปลงลักษณะการทำงานที่อาจส่งผลต่อแอปของคุณ การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลเฉพาะกับแอปที่กำหนดเป้าหมายเป็น Android 16 ขึ้นไป หากแอปกำหนดเป้าหมายเป็น Android 16 ขึ้นไป คุณควรแก้ไขแอปให้รองรับลักษณะการทำงานเหล่านี้ในกรณีที่เกี่ยวข้อง

นอกจากนี้ โปรดตรวจสอบรายการการเปลี่ยนแปลงลักษณะการทำงานที่มีผลต่อแอปทั้งหมด ที่ทำงานบน Android 16 ไม่ว่า targetSdkVersion ของแอปจะเป็นอย่างไร

ประสบการณ์ของผู้ใช้และ UI ของระบบ

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งมีจุดประสงค์ เพื่อสร้างประสบการณ์ของผู้ใช้ที่สอดคล้องกันและใช้งานง่ายยิ่งขึ้น

การเลือกไม่ใช้แบบไร้ขอบจะสิ้นสุดลง

Android 15 enforced edge-to-edge for apps targeting Android 15 (API level 35), but your app could opt-out by setting R.attr#windowOptOutEdgeToEdgeEnforcement to true. For apps targeting Android 16 (API level 36), R.attr#windowOptOutEdgeToEdgeEnforcement is deprecated and disabled, and your app can't opt-out of going edge-to-edge.

  • If your app targets Android 16 (API level 36) and is running on an Android 15 device, R.attr#windowOptOutEdgeToEdgeEnforcement continues to work.
  • If your app targets Android 16 (API level 36) and is running on an Android 16 device, R.attr#windowOptOutEdgeToEdgeEnforcement is disabled.

For testing in Android 16, ensure your app supports edge-to-edge and remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement so that your app also supports edge-to-edge on an Android 15 device. To support edge-to-edge, see the Compose and Views guidance.

ต้องย้ายข้อมูลหรือเลือกไม่ใช้เพื่อใช้การคาดการณ์การย้อนกลับ

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ขึ้นไปและทำงานในอุปกรณ์ Android 16 ขึ้นไป ระบบจะเปิดใช้ภาพเคลื่อนไหวของระบบย้อนกลับแบบคาดการณ์ (ย้อนกลับไปหน้าแรก ข้ามงาน และข้ามกิจกรรม) โดยค่าเริ่มต้น นอกจากนี้ ระบบจะไม่เรียกใช้ onBackPressed และจะไม่ส่ง KeyEvent.KEYCODE_BACK อีกต่อไป

หากแอปของคุณสกัดกั้นเหตุการณ์ย้อนกลับและคุณยังไม่ได้ย้ายข้อมูลไปยังการคาดการณ์ การย้อนกลับ ให้อัปเดตแอปเพื่อใช้ API การนำทางย้อนกลับที่รองรับ หรือ เลือกไม่ใช้ชั่วคราวโดยตั้งค่าแอตทริบิวต์ android:enableOnBackInvokedCallback เป็น false ในแท็ก <application> หรือ <activity> ของไฟล์ AndroidManifest.xml ของแอป

ภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้เพื่อกลับไปที่หน้าแรก
ภาพเคลื่อนไหวข้ามกิจกรรมที่คาดการณ์ได้
ภาพเคลื่อนไหวข้ามงานแบบคาดการณ์

เลิกใช้งานและปิดใช้ Elegant Font API

แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะมีแอตทริบิวต์ elegantTextHeight TextView ตั้งค่าเป็น true โดยค่าเริ่มต้น ซึ่งจะแทนที่แบบอักษรแบบย่อด้วยแบบอักษรที่อ่านง่ายกว่ามาก คุณลบล้างค่านี้ได้โดยตั้งค่าแอตทริบิวต์ elegantTextHeight เป็น false

Android 16 จะเลิกใช้งานแอตทริบิวต์ elegantTextHeight และระบบจะละเว้นแอตทริบิวต์เมื่อแอปกำหนดเป้าหมายเป็น Android 16 เราจะเลิกใช้ "UI fonts" ที่ควบคุมโดย API เหล่านี้ ดังนั้นคุณควรปรับเลย์เอาต์ใดๆ เพื่อให้การแสดงข้อความในภาษาอาหรับ ลาว เมียนมาร์ ทมิฬ คุชราต กันนาดา มาลายาลัม โอเดีย เตลูกู หรือไทยมีความสอดคล้องกันและพร้อมใช้งานในอนาคต

ลักษณะการทำงานของ
elegantTextHeight สำหรับแอปที่กำหนดเป้าหมายเป็น Android 14 (API ระดับ 34) และต่ำกว่า หรือสำหรับแอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) ซึ่งลบล้างค่าเริ่มต้นโดยการตั้งค่าแอตทริบิวต์ elegantTextHeight เป็น false
ลักษณะการทํางานของ
elegantTextHeight สําหรับแอปที่กําหนดเป้าหมายเป็น Android 16 (API ระดับ 36) หรือสําหรับแอปที่กําหนดเป้าหมายเป็น Android 15 (API ระดับ 35) ที่ไม่ได้ ลบล้างค่าเริ่มต้นโดยการตั้งค่าแอตทริบิวต์ elegantTextHeight เป็น false

ฟังก์ชันหลัก

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ซึ่งแก้ไขหรือ ขยายความสามารถหลักต่างๆ ของระบบ Android

การเพิ่มประสิทธิภาพการจัดกำหนดเวลางานแบบอัตราคงที่

ก่อนที่จะกำหนดเป้าหมายเป็น Android 16 เมื่อ scheduleAtFixedRate พลาดการเรียกใช้งานเนื่องจากอยู่นอกวงจรการประมวลผลที่ถูกต้อง การเรียกใช้ทั้งหมดที่พลาดไปจะดำเนินการทันทีเมื่อแอปกลับไปยังวงจรการประมวลผลที่ถูกต้อง

เมื่อกำหนดเป้าหมายเป็น Android 16 ระบบจะเรียกใช้scheduleAtFixedRate ที่พลาดไปไม่เกิน1 ครั้งทันทีเมื่อแอปกลับมาอยู่ในวงจรที่ถูกต้อง การเปลี่ยนแปลงลักษณะการทำงานนี้คาดว่าจะช่วยปรับปรุงประสิทธิภาพของแอป ทดสอบลักษณะการทำงานนี้ในแอปเพื่อดูว่าแอปได้รับผลกระทบหรือไม่ นอกจากนี้ คุณยังทดสอบโดยใช้เฟรมเวิร์กความเข้ากันได้ของแอปและเปิดใช้ Flag STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat ได้ด้วย

รูปแบบของอุปกรณ์

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้สำหรับแอปเมื่อ แสดงบนอุปกรณ์หน้าจอขนาดใหญ่

เลย์เอาต์แบบปรับขนาดได้

เนื่องจากตอนนี้แอป Android ทำงานบนอุปกรณ์ต่างๆ ได้แล้ว (เช่น โทรศัพท์ แท็บเล็ต อุปกรณ์พับได้ เดสก์ท็อป รถยนต์ และทีวี) และมีโหมดการจัดหน้าต่างบนหน้าจอขนาดใหญ่ (เช่น การแยกหน้าจอและการจัดหน้าต่างบนเดสก์ท็อป) นักพัฒนาแอปจึงควรสร้างแอป Android ที่ปรับให้เข้ากับขนาดหน้าจอและหน้าต่างได้ทุกขนาด ไม่ว่าอุปกรณ์จะอยู่ในแนวนอนหรือแนวตั้ง กระบวนทัศน์ต่างๆ เช่น การจำกัดการวางแนวและความสามารถในการปรับขนาด มีข้อจำกัดมากเกินไปในโลกที่มีอุปกรณ์หลายเครื่องในปัจจุบัน

ไม่สนใจข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพ

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และอัตราส่วนจะไม่ใช้กับจอแสดงผลที่มีความกว้างน้อยที่สุด >= 600dp อีกต่อไป แอปจะแสดงเต็มหน้าต่างแสดงผล ไม่ว่าสัดส่วนภาพหรือการวางแนวที่ผู้ใช้ต้องการจะเป็นอย่างไร และจะไม่มีการใช้แถบดำด้านข้าง

การเปลี่ยนแปลงนี้จะทำให้แพลตฟอร์มมีลักษณะการทำงานมาตรฐานใหม่ Android กำลังเปลี่ยนไปใช้โมเดลที่คาดหวังให้แอปปรับให้เข้ากับการวางแนว ขนาดการแสดงผล และสัดส่วนภาพต่างๆ ข้อจำกัดต่างๆ เช่น การวางแนวคงที่ หรือการปรับขนาดที่จำกัด จะขัดขวางความสามารถในการปรับตัวของแอป ทำให้แอปของคุณ ปรับเปลี่ยนตามอุปกรณ์เพื่อมอบประสบการณ์ของผู้ใช้ที่ดีที่สุด

นอกจากนี้ คุณยังทดสอบลักษณะการทำงานนี้ได้โดยใช้เฟรมเวิร์กความเข้ากันได้ของแอปและเปิดใช้ UNIVERSAL_RESIZABLE_BY_DEFAULT compat flag

การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบที่พบบ่อย

การไม่สนใจข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพอาจส่งผลต่อ UI ของแอปในอุปกรณ์บางเครื่อง โดยเฉพาะองค์ประกอบที่ออกแบบมาสำหรับเลย์เอาต์ขนาดเล็ก ที่ล็อกไว้ในแนวตั้ง เช่น ปัญหาต่างๆ เช่น เลย์เอาต์ที่ยืดออก และภาพเคลื่อนไหวและคอมโพเนนต์ที่อยู่นอกหน้าจอ การคาดเดาเกี่ยวกับสัดส่วนภาพหรือการวางแนวอาจทำให้เกิดปัญหาด้านภาพกับแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีหลีกเลี่ยงปัญหาดังกล่าวและปรับปรุงลักษณะการทำงานแบบปรับเปลี่ยนได้ของแอป

การอนุญาตให้หมุนอุปกรณ์จะทำให้เกิดการสร้างกิจกรรมใหม่มากขึ้น ซึ่งอาจส่งผล ให้สถานะของผู้ใช้สูญหายหากไม่ได้เก็บรักษาไว้อย่างถูกต้อง ดูวิธีบันทึกสถานะ UI อย่างถูกต้องในบันทึกสถานะ UI

รายละเอียดการใช้งาน

ระบบจะละเว้นแอตทริบิวต์ในไฟล์ Manifest และ API รันไทม์ต่อไปนี้ในอุปกรณ์หน้าจอขนาดใหญ่ในโหมดเต็มหน้าจอและโหมดหลายหน้าต่าง

ระบบจะละเว้นค่าต่อไปนี้สำหรับ screenOrientation, setRequestedOrientation() และ getRequestedOrientation()

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

ในส่วนของการปรับขนาดจอแสดงผล android:resizeableActivity="false", android:minAspectRatio และ android:maxAspectRatio จะไม่มีผล

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ระบบจะละเว้นข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพของแอปในหน้าจอขนาดใหญ่โดยค่าเริ่มต้น แต่แอปทุกแอปที่ยังไม่พร้อมอย่างเต็มที่สามารถลบล้างลักษณะการทำงานนี้ชั่วคราวได้โดยการเลือกไม่ใช้ (ซึ่งจะส่งผลให้แอปมีลักษณะการทำงานก่อนหน้าคืออยู่ในโหมดความเข้ากันได้)

ข้อยกเว้น

ข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพของ Android 16 จะไม่ มีผลในกรณีต่อไปนี้

  • เกม (อิงตามธง android:appCategory)
  • ผู้ใช้เลือกใช้ลักษณะการทำงานเริ่มต้นของแอปอย่างชัดแจ้งในการตั้งค่าสัดส่วนภาพของอุปกรณ์
  • หน้าจอที่มีขนาดเล็กกว่า sw600dp

เลือกไม่ใช้ชั่วคราว

หากต้องการเลือกไม่ใช้กิจกรรมที่เฉพาะเจาะจง ให้ประกาศ PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITYพร็อพเพอร์ตี้ของไฟล์ Manifest ดังนี้

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

หากส่วนต่างๆ ของแอปจำนวนมากยังไม่พร้อมสำหรับ Android 16 คุณสามารถเลือกไม่ใช้ ทั้งหมดได้โดยใช้พร็อพเพอร์ตี้เดียวกันที่ระดับแอปพลิเคชัน

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

สุขภาพและการออกกำลังกาย

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ที่เกี่ยวข้องกับข้อมูลสุขภาพ และการออกกำลังกาย

สิทธิ์ด้านสุขภาพและการออกกำลังกาย

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 16 (API ระดับ 36) ขึ้นไป สิทธิ์ BODY_SENSORS จะใช้สิทธิ์ที่ละเอียดยิ่งขึ้นในส่วน android.permissions.health ซึ่ง Health Connect ก็ใช้ด้วย และตั้งแต่ Android 16 เป็นต้นไป API ใดก็ตามที่ก่อนหน้านี้ต้องใช้ BODY_SENSORS หรือ BODY_SENSORS_BACKGROUND จะต้องใช้สิทธิ์ android.permissions.health ที่เกี่ยวข้องแทน ซึ่งจะส่งผลต่อประเภทข้อมูล, API และประเภทบริการที่ทำงานอยู่เบื้องหน้าต่อไปนี้

หากแอปใช้ API เหล่านี้ แอปควรขอสิทธิ์แบบละเอียดที่เกี่ยวข้อง

  • สำหรับการตรวจสอบอัตราการเต้นของหัวใจ ค่าความอิ่มตัวของออกซิเจนในเลือด หรืออุณหภูมิผิวหนังขณะใช้งาน ให้ขอสิทธิ์แบบละเอียดภายใต้ android.permissions.health เช่น READ_HEART_RATE แทน BODY_SENSORS
  • สำหรับการเข้าถึงเซ็นเซอร์ในเบื้องหลัง ให้ขอ READ_HEALTH_DATA_IN_BACKGROUND แทน BODY_SENSORS_BACKGROUND

สิทธิ์เหล่านี้เหมือนกับสิทธิ์ที่ควบคุมการเข้าถึงเพื่ออ่านข้อมูลจาก Health Connect ซึ่งเป็นที่เก็บข้อมูล Android สำหรับข้อมูลสุขภาพ การออกกำลังกาย และสุขภาวะ

แอปบนมือถือ

แอปบนมือถือที่ย้ายข้อมูลไปใช้ READ_HEART_RATE และสิทธิ์แบบละเอียดอื่นๆ จะต้องประกาศกิจกรรมเพื่อแสดงนโยบายความเป็นส่วนตัวของแอปด้วย ซึ่งเป็นข้อกำหนดเดียวกันกับ Health Connect

การเชื่อมต่อ

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงต่อไปนี้ในสแต็กบลูทูธ เพื่อปรับปรุงการเชื่อมต่อกับอุปกรณ์ต่อพ่วง

เจตนาใหม่ในการจัดการการสูญเสียพันธะและการเปลี่ยนแปลงการเข้ารหัส

การจัดการการสูญเสียการเชื่อมโยงที่ดีขึ้นทำให้ Android 16 เปิดตัว Intent ใหม่ 2 รายการเพื่อให้แอปรับรู้ถึงการสูญเสียการเชื่อมโยงและการเปลี่ยนแปลงการเข้ารหัสได้ดียิ่งขึ้น

ตอนนี้แอปที่กําหนดเป้าหมายเป็น Android 16 ทําสิ่งต่อไปนี้ได้

  • รับ Intent ACTION_KEY_MISSING เมื่อตรวจพบการสูญเสียการเชื่อมโยงระยะไกล ซึ่งช่วยให้สามารถแสดงความคิดเห็นที่เป็นประโยชน์ต่อผู้ใช้มากขึ้นและดำเนินการที่เหมาะสม
  • รับ Intent ACTION_ENCRYPTION_CHANGE เมื่อใดก็ตามที่สถานะการเข้ารหัสของลิงก์มีการเปลี่ยนแปลง ซึ่งรวมถึงการเปลี่ยนแปลงสถานะการเข้ารหัส การเปลี่ยนแปลงอัลกอริทึมการเข้ารหัส และการเปลี่ยนแปลงขนาดคีย์การเข้ารหัส แอปต้องถือว่าการเชื่อมโยงได้รับการคืนค่าหากลิงก์ได้รับการเข้ารหัสเรียบร้อยแล้วเมื่อได้รับ Intent ACTION_ENCRYPTION_CHANGE ในภายหลัง

การปรับให้เข้ากับการใช้งาน OEM ที่หลากหลาย

แม้ว่า Android 16 จะเปิดตัว Intent ใหม่เหล่านี้ แต่การใช้งานและการออกอากาศอาจแตกต่างกันไปตามผู้ผลิตอุปกรณ์ (OEM) แต่ละราย นักพัฒนาแอปควรออกแบบการจัดการการสูญเสียการเชื่อมโยงให้ปรับให้เข้ากับการเปลี่ยนแปลงที่อาจเกิดขึ้นเหล่านี้ได้อย่างราบรื่น เพื่อให้แอปมอบประสบการณ์การใช้งานที่สอดคล้องกันและเชื่อถือได้ในอุปกรณ์ทุกเครื่อง

เราขอแนะนําลักษณะการทํางานของแอปดังต่อไปนี้

  • หากมีการออกอากาศ Intent ACTION_KEY_MISSING ให้ทำดังนี้

    ระบบจะตัดการเชื่อมต่อลิงก์ ACL (การเชื่อมต่อแบบไม่ใช้การเชื่อมต่อแบบแอซิงโครนัส) แต่ระบบจะเก็บข้อมูลการเชื่อมโยงสำหรับอุปกรณ์ไว้ (ตามที่อธิบายไว้ที่นี่)

    แอปของคุณควรใช้ Intent นี้เป็นสัญญาณหลักในการจับสัญญาณการสูญเสียการเชื่อมโยงและแนะนำผู้ใช้ให้ยืนยันว่าอุปกรณ์ระยะไกลอยู่ในระยะสัญญาณก่อนที่จะเริ่มการลืมอุปกรณ์หรือการจับคู่อีกครั้ง

    หากอุปกรณ์ตัดการเชื่อมต่อหลังจากได้รับ ACTION_KEY_MISSING แอปของคุณควรระมัดระวังเกี่ยวกับการเชื่อมต่ออีกครั้ง เนื่องจากอุปกรณ์อาจไม่ได้จับคู่กับระบบแล้ว

  • หากไม่ได้ออกอากาศ Intent ACTION_KEY_MISSING

    ลิงก์ ACL จะยังคงเชื่อมต่ออยู่ และระบบจะนำข้อมูลการเชื่อมโยงของอุปกรณ์ออก เช่นเดียวกับลักษณะการทำงานใน Android 15

    ในกรณีนี้ แอปของคุณควรใช้กลไกการจัดการการสูญเสียการเชื่อมโยงที่มีอยู่ต่อไปเช่นเดียวกับใน Android รุ่นก่อนหน้า เพื่อตรวจหาและจัดการเหตุการณ์การสูญเสียการเชื่อมโยง

วิธีใหม่ในการนำการจับคู่บลูทูธออก

ตอนนี้แอปทั้งหมดที่กำหนดเป้าหมายเป็น Android 16 สามารถยกเลิกการจับคู่อุปกรณ์บลูทูธได้โดยใช้ API สาธารณะใน CompanionDeviceManager หากอุปกรณ์ที่ใช้ร่วมกันได้รับการจัดการเป็นการเชื่อมโยง CDM แอปจะทริกเกอร์การนำการเชื่อมโยงบลูทูธออกได้โดยใช้ removeBond(int) API ใหม่ในอุปกรณ์ที่เชื่อมโยง แอปสามารถตรวจสอบการเปลี่ยนแปลงสถานะการเชื่อมโยงได้โดยฟังเหตุการณ์การแพร่กระจายข้อมูลของอุปกรณ์บลูทูธ ACTION_BOND_STATE_CHANGED

ความปลอดภัย

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความปลอดภัยต่อไปนี้

การล็อกดาวน์เวอร์ชัน MediaStore

For apps targeting Android 16 or higher, MediaStore#getVersion() will now be unique to each app. This eliminates identifying properties from the version string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't make any assumptions around the format of this version. Apps should already handle version changes when using this API and in most cases shouldn't need to change their current behavior, unless the developer has attempted to infer additional information that is beyond the intended scope of this API.

ความตั้งใจที่ปลอดภัยยิ่งขึ้น

ฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นเป็นโครงการริเริ่มด้านความปลอดภัยแบบหลายเฟสที่ออกแบบมาเพื่อ ปรับปรุงความปลอดภัยของกลไกการแก้ไขเจตนาของ Android เป้าหมายคือการปกป้องแอปจากการกระทำที่เป็นอันตรายด้วยการเพิ่มการตรวจสอบระหว่าง การประมวลผล Intent และการกรอง Intent ที่ไม่เป็นไปตามเกณฑ์ที่เฉพาะเจาะจง

ใน Android 15 ฟีเจอร์นี้มุ่งเน้นที่แอปที่ส่ง แต่ใน Android 16 จะเปลี่ยนการควบคุมไปที่แอปที่รับ ซึ่งช่วยให้นักพัฒนาแอปเลือกใช้ การแก้ปัญหา Intent ที่เข้มงวดได้โดยใช้ไฟล์ Manifest ของแอป

เราจะดำเนินการเปลี่ยนแปลงที่สำคัญ 2 อย่าง ดังนี้

  1. Intent แบบเจาะจงปลายทางต้องตรงกับตัวกรอง Intent ของคอมโพเนนต์เป้าหมาย หาก Intent กำหนดเป้าหมายคอมโพเนนต์อย่างชัดแจ้ง Intent นั้นควรตรงกับ ตัวกรอง Intent ของคอมโพเนนต์นั้น

  2. Intent ที่ไม่มีการดำเนินการจะจับคู่กับตัวกรอง Intent ไม่ได้: Intent ที่ไม่ได้ระบุการดำเนินการไม่ควรได้รับการแก้ไขเป็นตัวกรอง Intent ใดๆ

การเปลี่ยนแปลงเหล่านี้จะมีผลเมื่อเกี่ยวข้องกับแอปหลายแอปเท่านั้น และจะไม่มีผลต่อ การจัดการ Intent ภายในแอปเดียว

ผลกระทบ

ลักษณะการเลือกใช้หมายความว่านักพัฒนาแอปต้องเปิดใช้ฟีเจอร์นี้อย่างชัดแจ้งใน ไฟล์ Manifest ของแอปเพื่อให้มีผล ด้วยเหตุนี้ ผลกระทบของฟีเจอร์นี้จึงจำกัดอยู่เฉพาะแอปที่นักพัฒนาแอป

  • ทราบถึงฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นและประโยชน์ของฟีเจอร์นี้
  • เลือกที่จะนำแนวทางปฏิบัติในการจัดการ Intent ที่เข้มงวดมากขึ้นมาใช้ในแอปของตน

แนวทางการเลือกใช้นี้ช่วยลดความเสี่ยงที่จะทำให้แอปที่มีอยู่ซึ่งอาจต้องอาศัย ลักษณะการทำงานของการแก้ปัญหา Intent ที่มีความปลอดภัยน้อยในปัจจุบันใช้งานไม่ได้

แม้ว่าผลกระทบเริ่มต้นใน Android 16 อาจมีจำกัด แต่โครงการ Safer Intents มีแผนงานที่จะสร้างผลกระทบในวงกว้างขึ้นใน Android รุ่นต่อๆ ไป แผนของเราคือการทำให้การแก้เจตนาอย่างเข้มงวดเป็นลักษณะการทำงานเริ่มต้นในที่สุด

ฟีเจอร์เจตนาที่ปลอดภัยยิ่งขึ้นมีศักยภาพในการปรับปรุง ความปลอดภัยของระบบนิเวศ Android ได้อย่างมากด้วยการทำให้แอปที่เป็นอันตราย ใช้ประโยชน์จากช่องโหว่ในกลไกการแก้ปัญหาเจตนาได้ยากขึ้น

อย่างไรก็ตาม การเปลี่ยนไปใช้การเลือกไม่ใช้และการบังคับใช้ที่จำเป็นต้องได้รับการจัดการอย่างรอบคอบเพื่อแก้ไขปัญหาความเข้ากันได้ที่อาจเกิดขึ้นกับแอปที่มีอยู่

การใช้งาน

นักพัฒนาแอปต้องเปิดใช้การจับคู่ Intent ที่เข้มงวดขึ้นอย่างชัดแจ้งโดยใช้แอตทริบิวต์ intentMatchingFlags ในไฟล์ Manifest ของแอป ต่อไปนี้คือตัวอย่างกรณีที่ฟีเจอร์นี้เป็นแบบเลือกใช้สำหรับทั้งแอป แต่ปิดใช้/เลือกไม่ใช้ในตัวรับ

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

ข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ที่รองรับ

ชื่อแฟล็ก คำอธิบาย
enforceIntentFilter บังคับใช้การจับคู่ที่เข้มงวดขึ้นสำหรับ Intent ขาเข้า
ไม่มี ปิดใช้กฎการจับคู่พิเศษทั้งหมดสำหรับ Intent ขาเข้า เมื่อระบุหลายแฟล็ก ค่าที่ขัดแย้งกันจะได้รับการแก้ไขโดยให้ความสำคัญกับแฟล็ก "none"
allowNullAction ผ่อนปรนกฎการจับคู่เพื่อให้ Intent ที่ไม่มีการดำเนินการจับคู่ได้ ใช้แฟล็กนี้ร่วมกับ "enforceIntentFilter" เพื่อให้ได้ลักษณะการทำงานที่เฉพาะเจาะจง

การทดสอบและการแก้ไขข้อบกพร่อง

เมื่อการบังคับใช้มีผล แอปควรทํางานได้อย่างถูกต้องหากผู้เรียกใช้ Intent ป้อนข้อมูล Intent อย่างถูกต้อง อย่างไรก็ตาม Intent ที่ถูกบล็อกจะทริกเกอร์ข้อความบันทึกคำเตือน เช่น "Intent does not match component's intent filter:" และ "Access blocked:" พร้อมแท็ก "PackageManager." ซึ่งบ่งบอกถึงปัญหาที่อาจส่งผลต่อแอปและต้อง ได้รับความสนใจ

ตัวกรอง Logcat:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

การกรอง Syscall ของ GPU

To harden the Mali GPU surface, Mali GPU IOCTLs that have been deprecated or are intended solely for GPU development have been blocked in production builds. Additionally, IOCTLs used for GPU profiling have been restricted to the shell process or debuggable applications. Refer to the SAC update for more details on the platform-level policy.

This change takes place on Pixel devices using the Mali GPU (Pixel 6-9). Arm has provided official categorization of their IOCTLs in Documentation/ioctl-categories.rst of their r54p2 release. This list will continue to be maintained in future driver releases.

This change does not impact supported graphics APIs (including Vulkan and OpenGL), and is not expected to impact developers or existing applications. GPU profiling tools such as the Streamline Performance Analyzer and the Android GPU Inspector won't be affected.

Testing

If you see a SELinux denial similar to the following, it is likely your application has been impacted by this change:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

If your application needs to use blocked IOCTLs, please file a bug and assign it to android-partner-security@google.com.

FAQ

  1. Does this policy change apply to all OEMs? This change will be opt-in, but available to any OEMs who would like to use this hardening method. Instructions for implementing the change can be found in the implementation documentation.

  2. Is it mandatory to make changes in the OEM codebase to implement this, or does it come with a new AOSP release by default? The platform-level change will come with a new AOSP release by default. Vendors may opt-in to this change in their codebase if they would like to apply it.

  3. Are SoCs responsible for keeping the IOCTL list up to date? For example, if my device uses an ARM Mali GPU, would I need to reach out to ARM for any of the changes? Individual SoCs must update their IOCTL lists per device upon driver release. For example, ARM will update their published IOCTL list upon driver updates. However, OEMs should make sure that they incorporate the updates in their SEPolicy, and add any selected custom IOCTLs to the lists as needed.

  4. Does this change apply to all Pixel in-market devices automatically, or is a user action required to toggle something to apply this change? This change applies to all Pixel in-market devices using the Mali GPU (Pixel 6-9). No user action is required to apply this change.

  5. Will use of this policy impact the performance of the kernel driver? This policy was tested on the Mali GPU using GFXBench, and no measurable change to GPU performance was observed.

  6. Is it necessary for the IOCTL list to align with the current userspace and kernel driver versions? Yes, the list of allowed IOCTLs must be synchronized with the IOCTLs supported by both the userspace and kernel drivers. If the IOCTLs in the user space or kernel driver are updated, the SEPolicy IOCTL list must be updated to match.

  7. ARM has categorized IOCTLs as 'restricted' / 'instrumentation', but we want to use some of them in production use-cases, and/or deny others. Individual OEMs/SoCs are responsible for deciding on how to categorize the IOCTLs they use, based on the configuration of their userspace Mali libraries. ARM's list can be used to help decide on these, but each OEM/SoC's use-case may be different.

ความเป็นส่วนตัว

Android 16 (API ระดับ 36) มีการเปลี่ยนแปลงด้านความเป็นส่วนตัวต่อไปนี้

สิทธิ์เข้าถึงเครือข่ายภายใน

แอปที่มีINTERNETจะเข้าถึงอุปกรณ์ใน LAN ได้ ซึ่งช่วยให้แอปเชื่อมต่อกับอุปกรณ์ในพื้นที่ได้ง่าย แต่ก็มีผลกระทบด้านความเป็นส่วนตัวด้วย เช่น การสร้างลายนิ้วมือของผู้ใช้ และการเป็นพร็อกซีสำหรับตำแหน่ง

โปรเจ็กต์การป้องกันเครือข่าย LAN มีเป้าหมายเพื่อปกป้องความเป็นส่วนตัวของผู้ใช้โดย จำกัดการเข้าถึงเครือข่าย LAN ไว้เบื้องหลังสิทธิ์รันไทม์ใหม่

แผนการเปิดตัว

การเปลี่ยนแปลงนี้จะเปิดตัวระหว่าง 2 รุ่น ได้แก่ 25Q2 และ 26Q2 ตามลำดับ นักพัฒนาแอปต้องปฏิบัติตามคำแนะนำนี้สำหรับ 25Q2 และแชร์ความคิดเห็น เนื่องจากระบบจะบังคับใช้การป้องกันเหล่านี้ใน Android รุ่นต่อๆ ไป นอกจากนี้ นักพัฒนาแอปจะต้องอัปเดตสถานการณ์ที่ขึ้นอยู่กับการเข้าถึงเครือข่ายภายในโดยนัยโดยใช้คำแนะนำต่อไปนี้ และเตรียมพร้อมสำหรับการปฏิเสธของผู้ใช้ และการเพิกถอนสิทธิ์ใหม่

ผลกระทบ

ในระยะปัจจุบัน LNP เป็นฟีเจอร์ที่ต้องเลือกใช้ ซึ่งหมายความว่าจะมีผลกับแอปที่เลือกใช้เท่านั้น เป้าหมายของระยะการเลือกใช้คือการช่วยให้นักพัฒนาแอปเข้าใจว่าส่วนใดของแอปที่ต้องอาศัยการเข้าถึงเครือข่าย LAN โดยนัย เพื่อเตรียมพร้อมที่จะใช้การป้องกันสิทธิ์สำหรับแอปดังกล่าวในการเปิดตัวครั้งถัดไป

แอปจะได้รับผลกระทบหากเข้าถึงเครือข่ายท้องถิ่นของผู้ใช้โดยใช้สิ่งต่อไปนี้

  • การใช้ซ็อกเก็ตดิบโดยตรงหรือผ่านไลบรารีในที่อยู่เครือข่ายภายใน (เช่น โปรโตคอลการค้นพบบริการ mDNS หรือ SSDP)
  • การใช้คลาสระดับเฟรมเวิร์กที่เข้าถึงเครือข่ายในเครื่อง (เช่น NsdManager)

การรับส่งข้อมูลไปยังและจากที่อยู่เครือข่ายภายในต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน ตารางต่อไปนี้แสดงกรณีที่พบบ่อย

การดำเนินการเครือข่ายระดับต่ำของแอป ต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
สร้างการเชื่อมต่อ TCP ขาออก ใช่
ยอมรับการเชื่อมต่อ TCP ขาเข้า ใช่
การส่ง Unicast, Multicast, Broadcast แบบ UDP ใช่
รับ Unicast, Multicast, Broadcast แบบ UDP ขาเข้า ใช่

ข้อจำกัดเหล่านี้จะใช้ในส่วนลึกของสแต็กเครือข่าย จึงมีผลกับAPI เครือข่ายทั้งหมด ซึ่งรวมถึงซ็อกเก็ตที่สร้างขึ้นในโค้ดเนทีฟหรือโค้ดที่มีการจัดการ ไลบรารีเครือข่าย เช่น Cronet และ OkHttp รวมถึง API ใดๆ ที่ใช้เหนือไลบรารีเหล่านั้น การพยายามแก้ไขบริการใน เครือข่ายภายใน (เช่น บริการที่มีคำต่อท้าย .local) จะต้องมีสิทธิ์เข้าถึง เครือข่ายภายใน

ข้อยกเว้นสำหรับกฎข้างต้น

  • หากเซิร์ฟเวอร์ DNS ของอุปกรณ์อยู่ในเครือข่ายภายใน การรับส่งข้อมูลไปยังหรือจากเซิร์ฟเวอร์ (ที่พอร์ต 53) ไม่จำเป็นต้องมีสิทธิ์เข้าถึงเครือข่ายภายใน
  • แอปพลิเคชันที่ใช้ตัวสลับเอาต์พุตเป็นเครื่องมือเลือกในแอปจะไม่ต้องมีสิทธิ์เข้าถึงเครือข่ายในพื้นที่ (จะมีคำแนะนำเพิ่มเติมในไตรมาสที่ 4 ปี 2025)

คำแนะนำสำหรับนักพัฒนาแอป (เลือกใช้)

หากต้องการเลือกใช้ข้อจำกัดเครือข่ายในเครื่อง ให้ทำดังนี้

  1. แฟลชอุปกรณ์เป็นบิลด์ที่มี 25Q2 เบต้า 3 ขึ้นไป
  2. ติดตั้งแอปที่จะทดสอบ
  3. สลับสถานะ Appcompat ใน adb โดยทำดังนี้

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. รีบูตอุปกรณ์

ตอนนี้สิทธิ์เข้าถึงเครือข่ายภายในของแอปถูกจำกัดแล้ว และการพยายามเข้าถึงเครือข่ายภายในจะทำให้เกิดข้อผิดพลาดของซ็อกเก็ต หากคุณใช้ API ที่ ดำเนินการในเครือข่ายภายในนอกกระบวนการของแอป (เช่น NsdManager) API เหล่านี้จะไม่ได้รับผลกระทบในระหว่างระยะการเลือกใช้

หากต้องการคืนค่าสิทธิ์เข้าถึง คุณต้องให้สิทธิ์แอปในการเข้าถึง NEARBY_WIFI_DEVICES

  1. ตรวจสอบว่าแอปประกาศสิทธิ์ NEARBY_WIFI_DEVICES ในไฟล์ Manifest
  2. ไปที่การตั้งค่า > แอป > [ชื่อแอปพลิเคชัน] > สิทธิ์ > อุปกรณ์ที่อยู่ใกล้เคียง > อนุญาต

ตอนนี้สิทธิ์เข้าถึงเครือข่าย LAN ของแอปควรได้รับการกู้คืนแล้ว และสถานการณ์ทั้งหมดควรทํางานได้เหมือนก่อนที่จะเลือกใช้แอป

เมื่อการบังคับใช้เพื่อการปกป้องเครือข่าย LAN เริ่มขึ้น การเข้าชมเครือข่ายของแอป จะได้รับผลกระทบดังนี้

สิทธิ์ คำขอ LAN ขาออก คำขออินเทอร์เน็ตขาออก/ขาเข้า คำขอ LAN ขาเข้า
ให้สิทธิ์ Works Works Works
ไม่ให้สิทธิ์ เรื่องหน้าแตก Works เรื่องหน้าแตก

ใช้คำสั่งต่อไปนี้เพื่อเปิด/ปิด Flag ความเข้ากันได้ของแอป

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

ข้อผิดพลาด

ระบบจะส่งข้อผิดพลาดที่เกิดจากข้อจำกัดเหล่านี้กลับไปยังซ็อกเก็ตที่เรียกใช้ เมื่อใดก็ตามที่เรียกใช้ send หรือตัวแปร send ไปยังที่อยู่เครือข่ายภายใน

ตัวอย่างข้อผิดพลาด

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

คำจำกัดความของเครือข่ายภายใน

เครือข่ายภายในในโปรเจ็กต์นี้หมายถึงเครือข่าย IP ที่ใช้อินเทอร์เฟซเครือข่ายที่รองรับการออกอากาศ เช่น Wi-Fi หรืออีเทอร์เน็ต แต่ไม่รวมการเชื่อมต่อเซลลูลาร์ (WWAN) หรือ VPN

เครือข่ายต่อไปนี้ถือเป็นเครือข่ายท้องถิ่น

IPv4:

  • 169.254.0.0/16 // ลิงก์ภายใน
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • ลิงก์เฉพาะ
  • เส้นทางที่เชื่อมต่อโดยตรง
  • เครือข่าย Stub เช่น Thread
  • หลายซับเน็ต (จะแจ้งภายหลัง)

นอกจากนี้ ทั้งที่อยู่แบบมัลติแคสต์ (224.0.0.0/4, ff00::/8) และที่อยู่ IPv4 แบบบรอดแคสต์ (255.255.255.255) จะจัดเป็นที่อยู่เครือข่ายภายใน

รูปภาพที่เป็นของแอป

เมื่อแอปที่กำหนดเป้าหมาย SDK 36 ขึ้นไปในอุปกรณ์ที่ใช้ Android 16 ขึ้นไปแสดงข้อความแจ้งขอสิทธิ์เข้าถึงรูปภาพและวิดีโอ ผู้ใช้ที่เลือกจำกัดการเข้าถึงสื่อที่เลือกไว้จะเห็นรูปภาพทั้งหมดที่แอปเป็นเจ้าของซึ่งเลือกไว้ล่วงหน้าในเครื่องมือเลือกรูปภาพ ผู้ใช้สามารถยกเลิกการเลือกรายการที่เลือกไว้ล่วงหน้ารายการใดก็ได้ ซึ่งจะเป็นการเพิกถอนสิทธิ์เข้าถึงรูปภาพและวิดีโอเหล่านั้นของแอป