การเปลี่ยนแปลงลักษณะการทํางาน: แอปทั้งหมด

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

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

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

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

ขีดจำกัดหน่วยความจำของแอป

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

คุณสามารถตรวจสอบว่าเซสชันของแอปได้รับผลกระทบหรือไม่โดยเรียกใช้ getDescription ใน ApplicationExitInfo หากแอปได้รับผลกระทบ เหตุผลที่ออกจะเป็น REASON_OTHER และ คำอธิบายจะมีสตริง "MemoryLimiter:AnonSwap" พร้อมกับ ข้อมูลอื่นๆ นอกจากนี้ คุณยังใช้การโปรไฟล์ตามทริกเกอร์กับ TRIGGER_TYPE_ANOMALYเพื่อรับฮีปดัมป์ที่รวบรวมไว้เมื่อถึง ขีดจำกัดหน่วยความจำได้ด้วย

งาน LeakCanary ในโปรไฟล์เลอร์ของ Android Studio

Android Studio Panda เพิ่มการผสานรวม LeakCanary ลงในโปรไฟล์เลอร์ของ Android Studio โดยตรงเป็นงานเฉพาะที่อยู่ใน IDE และผสานรวมกับซอร์สโค้ดของคุณอย่างสมบูรณ์ เพื่อช่วยคุณค้นหาการรั่วไหลของหน่วยความจำ

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

Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงความเป็นส่วนตัวของผู้ใช้

การป้องกัน OTP ทาง SMS

ตั้งแต่ Android 17 เป็นต้นไป Android จะขยายการปกป้อง ข้อความ SMS ที่มีรหัสผ่านแบบใช้ครั้งเดียว (OTP)

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

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

ในระหว่างการหน่วงเวลา 3 ชั่วโมงนี้ ระบบจะระงับการออกอากาศSMS_RECEIVED_ACTION และกรองการค้นหาฐานข้อมูลของผู้ให้บริการ SMS ข้อความ SMS จะพร้อมใช้งานในแอปเหล่านี้หลังจากผ่านไปตามระยะเวลาหน่วง การเปลี่ยนแปลงนี้จะมีผลกับแอปทั้งหมด ไม่ว่าระดับ API เป้าหมายจะเป็นเท่าใดก็ตาม

แอปบางอย่าง เช่น แอปผู้ช่วย SMS เริ่มต้น แอปคู่หูของอุปกรณ์ที่เชื่อมต่อ ฯลฯ จะได้รับการยกเว้นจากความล่าช้านี้ แอปทั้งหมดที่ต้องอ่านข้อความ SMS เพื่อดึงข้อมูล OTP ควรเปลี่ยนไปใช้ SMS Retriever หรือ SMS User Consent API เพื่อให้มั่นใจว่าฟังก์ชันการทำงานจะยังคงดำเนินต่อไป

ความปลอดภัย

Android 17 มีการปรับปรุงความปลอดภัยของอุปกรณ์และแอป ดังต่อไปนี้

แผนการเลิกใช้งาน usesClearTraffic

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

โปรดทราบว่าไฟล์การกำหนดค่าความปลอดภัยของเครือข่ายใช้ได้ใน API ระดับ 24 ขึ้นไปเท่านั้น หากแอปมีระดับ API ขั้นต่ำต่ำกว่า 24 คุณควรทำทั้ง 2 อย่างต่อไปนี้

  • ตั้งค่าแอตทริบิวต์ usesCleartextTraffic เป็น true
  • ใช้ไฟล์การกำหนดค่าเครือข่าย

หากระดับ API ขั้นต่ำของแอปคือ 24 ขึ้นไป คุณจะใช้ไฟล์การกำหนดค่าเครือข่ายได้และไม่จำเป็นต้องตั้งค่า usesCleartextTraffic

จำกัดการให้สิทธิ์ URI โดยนัย

ปัจจุบันหากแอปเปิด Intent ด้วย URI ที่มี Action ACTION_SEND, SEND_MULTIPLE, หรือ ACTION_IMAGE_CAPTURE ระบบจะให้สิทธิ์ URI ในการอ่านและเขียนแก่แอปเป้าหมายโดยอัตโนมัติ เราวางแผนที่จะเปลี่ยนลักษณะการทำงานนี้ใน Android 18 ด้วยเหตุนี้ เราจึงขอแนะนำให้แอปให้สิทธิ์ URI ที่เกี่ยวข้องอย่างชัดเจน แทนที่จะพึ่งพาระบบในการให้สิทธิ์

ขีดจำกัดของที่เก็บคีย์ต่อแอป

แอปควรหลีกเลี่ยงการสร้างคีย์จำนวนมากเกินไปใน Android Keystore เนื่องจากเป็นทรัพยากรที่แชร์สำหรับแอปทั้งหมดในอุปกรณ์ ตั้งแต่ Android 17 เป็นต้นไป ระบบจะบังคับใช้ขีดจํากัดจํานวนคีย์ที่แอปเป็นเจ้าของได้ โดยจำกัดไว้ที่ 50,000 คีย์สำหรับแอปที่ไม่ใช่ระบบที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป และ 200,000 คีย์สำหรับแอปอื่นๆ ทั้งหมด แอปของระบบมีขีดจำกัดคีย์อยู่ที่ 200,000 คีย์ ไม่ว่าแอปจะกำหนดเป้าหมายเป็นระดับ API ใดก็ตาม

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

  • แอปที่กำหนดเป้าหมายเป็น Android 17 (API ระดับ 37) ขึ้นไป: getNumericErrorCode() จะแสดงค่า ERROR_TOO_MANY_KEYS ใหม่
  • แอปอื่นๆ ทั้งหมด: getNumericErrorCode() คืนค่า ERROR_INCORRECT_USAGE

บล็อกการรับส่งข้อมูลแบบวนรอบข้ามโปรไฟล์

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

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

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

การคืนค่าระดับการเข้าถึง IME เริ่มต้นหลังจากการหมุน

ตั้งแต่ Android 17 เป็นต้นไป เมื่อการกำหนดค่าของอุปกรณ์เปลี่ยนแปลง (เช่น ผ่านการหมุน) และแอปไม่ได้จัดการการเปลี่ยนแปลงนี้ ระบบจะไม่คืนค่าระดับการมองเห็น IME ก่อนหน้า

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

  • ตั้งค่าแอตทริบิวต์ android:windowSoftInputMode เป็น stateAlwaysVisible
  • ขอแป้นพิมพ์เสมือนในกิจกรรมของคุณโดยใช้โปรแกรมในเมธอด onCreate() หรือเพิ่มเมธอด onConfigurationChanged()

อินพุตจากมนุษย์

Android 17 มีการเปลี่ยนแปลงต่อไปนี้ซึ่งส่งผลต่อวิธีที่ แอปโต้ตอบกับอุปกรณ์อินพุตของมนุษย์ เช่น แป้นพิมพ์และทัชแพด

ทัชแพดจะส่งเหตุการณ์ที่เกี่ยวข้องโดยค่าเริ่มต้นระหว่างการจับเคอร์เซอร์

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

ก่อนหน้านี้ ระบบไม่ได้พยายามจดจำท่าทางสัมผัสจากทัชแพด แต่จะส่งตำแหน่งสัมผัสที่แน่นอนและดิบของผู้ใช้ไปยังแอปในรูปแบบที่คล้ายกับการสัมผัสหน้าจอ หากแอปยังคงต้องการข้อมูลที่แน่นอนนี้ แอป ควรเรียกใช้เมธอด View.requestPointerCapture(int) ใหม่ด้วย View.POINTER_CAPTURE_MODE_ABSOLUTE แทน

สื่อ

Android 17 มีการเปลี่ยนแปลงลักษณะการทำงานของสื่อต่อไปนี้

การปิดช่องโหว่ของเสียงที่เล่นขณะล็อกหน้าจอ

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

หากแอปพยายามเรียกใช้ Audio API ขณะที่แอปไม่ได้อยู่ในวงจรที่ถูกต้อง API การเล่นเสียงและการเปลี่ยนระดับเสียงจะทำงานไม่สำเร็จโดยไม่มีการแจ้งเตือน ข้อยกเว้นหรือแสดงข้อความว่าไม่สำเร็จ API โฟกัสเสียงล้มเหลวโดยมีรหัสผลลัพธ์ AUDIOFOCUS_REQUEST_FAILED

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

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

Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อเพิ่มประสิทธิภาพการเชื่อมต่ออุปกรณ์

การจับคู่ใหม่โดยอัตโนมัติเมื่อการเชื่อมต่อบลูทูธขาดหายไป

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

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

แม้ว่าแอปส่วนใหญ่จะไม่ต้องมีการเปลี่ยนแปลงโค้ด แต่นักพัฒนาแอปควรทราบถึงการเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้ในสแต็ก Bluetooth

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

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

  • นำข้อมูลการเชื่อมต่อออกจากอุปกรณ์ต่อพ่วงด้วยตนเอง
  • ยกเลิกการจับคู่อุปกรณ์ด้วยตนเองในส่วนการตั้งค่า > อุปกรณ์ที่เชื่อมต่อ