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

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

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

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

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

วิดเจ็ตขีดจำกัดหน่วยความจำ

ตั้งแต่ Android 17 เป็นต้นไป ระบบจะบังคับใช้ขีดจำกัดหน่วยความจำที่เข้มงวดกับการอัปเดต RemoteViews สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (API ระดับ 37) ขึ้นไป เมื่อแอปส่งออบเจ็กต์ RemoteViews ไปยัง AppWidgetManager.updateAppWidget, system_server จะคำนวณหน่วยความจำที่ใช้ทั้งหมดของข้อมูลรูปภาพทั้งหมดในทุกการวางแนวและที่เก็บขนาดในเพย์โหลด หากหน่วยความจำทั้งหมดเกินขีดจำกัดของระบบ (mMaxWidgetBitmapMemory) ระบบจะปฏิเสธการอัปเดตและแสดงข้อผิดพลาด IllegalArgumentException ดังนี้

java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: XXXXX, max: YYYYY)

สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36 หรือต่ำกว่า ระบบจะบันทึกการละเมิดหน่วยความจำนี้เป็นคำเตือน (Slog.w) โดยไม่แสดงข้อยกเว้น

วิธีที่ระบบคำนวณเพดานหน่วยความจำ

ระบบจะตั้งค่างบประมาณหน่วยความจำบิตแมปของวิดเจ็ตไว้ที่ 6 * width * height ไบต์ (1.5 * 4 * width * height ซึ่งเทียบเท่ากับ 1.5 เท่าของขนาดบัฟเฟอร์ ARGB_8888 แบบเต็มหน้าจอ) สำหรับการกำหนดค่าการแสดงผลที่ใช้งานอยู่ ในระดับ API 37 ขึ้นไป การคำนวณนี้จะรวมทั้ง 2 รายการต่อไปนี้

  • ออบเจ็กต์ Bitmap ในหน่วยความจำและออบเจ็กต์ Icon ที่สนับสนุนบิตแมป (Icon.TYPE_BITMAP และ Icon.TYPE_ADAPTIVE_BITMAP) ที่จัดเก็บไว้ใน RemoteViews.mBitmapCache (เช่น การเรียกใช้ setImageViewBitmap, Icon.createWithBitmap, Icon.createWithAdaptiveBitmap หรือ Jetpack Glance ImageProvider(bitmap)) ระบบจะนับอินสแตนซ์ Bitmap หรือ Icon ที่สนับสนุนบิตแมปที่ไม่ซ้ำกันแต่ละรายการใน mBitmapCache 1 ครั้งต่อลำดับชั้น RemoteViews
  • รูปภาพที่ใช้ URI (Icon.createWithContentUri, setImageViewUri หรือ Glance ImageProvider(uri)) จะไม่นับรวมในขีดจำกัดไบต์ IPC RemoteViews ใน system_server แต่กระบวนการโฮสต์วิดเจ็ตจะถอดรหัสไฟล์ content:// ที่อ้างอิงด้วยความละเอียดเต็มลงในฮีปของตัวเอง เขียนรูปภาพที่ลดสุ่มตัวอย่างลงใน context.cacheDir เสมอก่อนที่จะแสดงผ่าน URI FileProvider

ขั้นตอนการลดความเสี่ยง

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

  1. คำนวณงบประมาณหน่วยความจำรันไทม์จาก WindowMetrics: ในระดับ API 30 ขึ้นไป ให้อ่านขอบเขตหน้าต่างที่ใช้งานอยู่จาก WindowManager.currentWindowMetrics.bounds แทน resources.displayMetrics ในอุปกรณ์ที่มีความละเอียดหลายระดับและอุปกรณ์แบบพับได้ displayMetrics อาจรายงานขนาดจอแสดงผลที่ไม่ได้ใช้งาน ประเมินงบประมาณทั้งหมดสำหรับรูปภาพวิดเจ็ตที่ 6L * bounds.width() * bounds.height() ดังที่แสดงในตัวอย่างต่อไปนี้

    private const val FALLBACK_MAX_BYTES = 15_000_000L
    
    fun calculateWidgetMemoryCapBytes(context: Context): Long {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val wm = context.getSystemService(WindowManager::class.java)
                ?: return FALLBACK_MAX_BYTES
            val bounds = wm.currentWindowMetrics.bounds
            return 6L * bounds.width().toLong() * bounds.height().toLong()
        }
        val dm = context.resources.displayMetrics
        return 6L * dm.widthPixels.toLong() * dm.heightPixels.toLong()
    }
    
  2. ลดขนาดรูปภาพให้เป็นขนาดที่มองเห็นได้ของวิดเจ็ตและใช้ RGB_565: ถอดรหัสบิตแมปด้วยค่า BitmapFactory.Options.inSampleSize ที่เป็นเลขยกกำลังสอง ซึ่งมีขนาดเท่ากับขนาดการแสดงผลสูงสุดของวิดเจ็ต (maxWidthDp คูณ maxHeightDp) และใช้ Bitmap.Config.RGB_565 (2 ไบต์ต่อพิกเซล) แทน ARGB_8888 (4 ไบต์ต่อพิกเซล) สำหรับรูปภาพและภาพขนาดย่อที่ทึบแสง

  3. ยกการถอดรหัสบิตแมปไว้นอก provideContent ใน Jetpack Glance: เมื่อใช้ SizeMode.Responsive หรือ SizeMode.Exact Glance จะเรียกใช้ Lambda provideContent ของคุณ 1 ครั้งต่อที่เก็บขนาด ถอดรหัส Bitmap ที่แชร์แต่ละรายการ เมื่ออยู่ใน provideGlance ก่อนเรียกใช้ provideContent เพื่อให้ที่เก็บข้อมูลขนาดทั้งหมด อ้างอิงอินสแตนซ์ Bitmap เดียวกันใน RemoteViews.mBitmapCache

  4. ใช้การเรียก updateAppWidget แบบเต็มเมื่อแทนที่รูปภาพ: ในการติดตั้งใช้งาน AppWidgetProvider แบบคลาสสิก ให้หลีกเลี่ยงการเรียก AppWidgetManager.partiallyUpdateAppWidget เพื่อสลับมุมมอง Bitmap หรือ Icon การอัปเดตบางส่วนจะผสานการดำเนินการใหม่เข้ากับโครงสร้าง RemoteViews ที่มีอยู่ใน system_server โดยไม่ลบการดำเนินการกับรูปภาพที่แคชไว้ก่อนหน้านี้ สร้างเลย์เอาต์ RemoteViews ที่สมบูรณ์และเรียกใช้ updateAppWidget แทน

  5. ระบุเลย์เอาต์สำรองสำหรับข้อผิดพลาด: ใน Jetpack Glance ให้ลบล้าง onCompositionError เพื่อแสดงผล RemoteViews สำรองที่ไม่มีบิตแมปหากอัปเดตไม่สำเร็จ

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

adb shell dumpsys appwidget

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

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() เพื่อระบุว่ามีการเลือกตัวเลือก Conversion ที่เฉพาะเจาะจงหรือไม่

  • แอปที่มีช่องแก้ไข: แอปที่รักษา 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 เปิดตัวการรองรับแพลตฟอร์มสำหรับ Encrypted Client Hello (ECH) ซึ่งเป็นส่วนขยาย TLS ที่เพิ่มความเป็นส่วนตัวของผู้ใช้โดยการเข้ารหัส Server Name Indication (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") ทั่วโลกหรือต่อโดเมน

ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับ Encrypted Client Hello

ต้องมีสิทธิ์เข้าถึงเครือข่ายภายในสำหรับแอปที่กำหนดเป้าหมายเป็น Android 17

Android 17 เปิดตัวสิทธิ์รันไทม์ ACCESS_LOCAL_NETWORK เพื่อปกป้องผู้ใช้จากการเข้าถึงเครือข่ายภายในโดยไม่ได้รับอนุญาต เนื่องจากสิทธิ์นี้อยู่ภายใต้กลุ่มสิทธิ์ NEARBY_DEVICES ที่มีอยู่ ผู้ใช้ที่ให้สิทธิ์ NEARBY_DEVICES อื่นๆ ไปแล้วจะไม่ได้รับข้อความแจ้งอีก ข้อกำหนดใหม่นี้จะป้องกันไม่ให้แอปที่เป็นอันตรายใช้ประโยชน์จากการเข้าถึงเครือข่ายภายในแบบไม่จำกัดเพื่อติดตามผู้ใช้และทำฟิงเกอร์ปรินต์อย่างลับๆ การประกาศและขอสิทธิ์นี้จะช่วยให้แอปค้นพบและเชื่อมต่อกับอุปกรณ์ในเครือข่ายเฉพาะที่ (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 ควรเปลี่ยนไปใช้ API SMS Retriever หรือ SMS User Consent เพื่อให้ฟังก์ชันการทำงานยังคงใช้งานได้ต่อไป

ความปลอดภัย

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) ขึ้นไป ระบบจะเปิดใช้ความโปร่งใสของใบรับรอง (CT) โดยค่าเริ่มต้น (ใน Android 16, CT พร้อมใช้งาน แต่แอปต้องเลือกใช้)

Safer Native 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 ระดับ 37) ขึ้นไป Contacts Provider 2 (CP2) จะบังคับใช้การตรวจสอบความถูกต้องของคำค้นหา SQL อย่างเข้มงวดเมื่อมีการเข้าถึงตาราง ContactsContract.Data โดยไม่มีสิทธิ์ READ_CONTACTS

การเปลี่ยนแปลงนี้หมายความว่าหากแอปไม่มีสิทธิ์ READ_CONTACTS ระบบจะตั้งค่าตัวเลือก StrictColumns และ StrictGrammar เมื่อค้นหาตาราง ContactsContract.Data หากการค้นหาใช้รูปแบบที่เข้ากันไม่ได้กับรูปแบบเหล่านี้ ระบบจะปฏิเสธการค้นหาและทำให้เกิดข้อยกเว้น

การตรวจหา

Android 17 มีการเปลี่ยนแปลงต่อไปนี้ในระบบอัจฉริยะ

การเลิกใช้งาน setContentCaptureEnabled

ระบบจะเปิดใช้การจับภาพเนื้อหาโดยค่าเริ่มต้นในอุปกรณ์บางรุ่นเพื่อให้ฟีเจอร์ AI ในอุปกรณ์วิเคราะห์เนื้อหาบนหน้าจอเพื่อมอบประสบการณ์การใช้งานอัจฉริยะ

ตั้งแต่ Android 17 เป็นต้นไป เมธอด API ContentCaptureManager.setContentCaptureEnabled(boolean) จะเลิกใช้งาน สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป การเรียกใช้ setContentCaptureEnabled(false) จะไม่ปิดใช้การจับภาพเนื้อหาอีกต่อไป

หากแอปของคุณจำเป็นต้องปิดใช้การจับภาพเนื้อหาต่อไปหรือจำกัดไม่ให้ระบบจับภาพเนื้อหาบนหน้าจอ คุณต้องเปลี่ยนไปใช้พารามิเตอร์เลย์เอาต์หน้าต่าง FLAG_SECURE

หากต้องการปิดใช้การจับภาพเนื้อหา ให้ตั้งค่าแฟล็ก FLAG_SECURE ในหน้าต่างของคุณดังที่แสดงในตัวอย่างต่อไปนี้

Kotlin

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

ดูรายละเอียดเพิ่มเติมได้ที่เอกสารอ้างอิง WindowManager.LayoutParams.FLAG_SECURE

สื่อ

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

การเพิ่มความปลอดภัยของเสียงในเบื้องหลัง

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

ข้อจำกัดด้านเสียงบางอย่างจะมีผลกับแอปทั้งหมด อย่างไรก็ตาม ข้อจำกัดจะเข้มงวดมากขึ้นหากแอปกำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) หากแอปใดแอปหนึ่งเหล่านี้โต้ตอบกับเสียงขณะที่ทำงานอยู่เบื้องหลัง แอปนั้นต้องมีบริการที่ทำงานอยู่เบื้องหน้า นอกจากนี้ แอปต้องเป็นไปตามข้อกำหนดข้อใดข้อหนึ่งหรือทั้ง 2 ข้อต่อไปนี้

  • บริการที่ทำงานอยู่เบื้องหน้าต้องมีความสามารถขณะใช้งาน (WIU)
  • แอปต้องมีสิทธิ์สัญญาณปลุกเจาะจงและโต้ตอบกับสตรีมเสียง USAGE_ALARM

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

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

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

การเปลี่ยนแปลง Platform API เพื่อละเว้นข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนการแสดงผลบนหน้าจอขนาดใหญ่ (sw>=600dp)

เราได้เปิดตัวการเปลี่ยนแปลง API ของแพลตฟอร์มใน Android 16 เพื่อละเว้นข้อจำกัดด้านการวางแนว ความสามารถในการปรับขนาด และสัดส่วนภาพบนหน้าจอขนาดใหญ่ (sw >= 600dp) สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 36 ขึ้นไป นักพัฒนาแอปมีตัวเลือกในการเลือกไม่รับการเปลี่ยนแปลงเหล่านี้ด้วย SDK 36 แต่ตัวเลือกการเลือกไม่รับนี้จะใช้ไม่ได้อีกต่อไปสำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (ระดับ API 37) ขึ้นไป

ดูข้อมูลเพิ่มเติมได้ที่ระบบจะไม่สนใจข้อจำกัดเกี่ยวกับการวางแนวและความสามารถในการปรับขนาด

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

Android 17 มีการเปลี่ยนแปลงต่อไปนี้เพื่อปรับปรุงความสอดคล้องและสอดคล้องกับลักษณะการทำงานของ Java InputStream มาตรฐานสำหรับซ็อกเก็ต RFCOMM ของบลูทูธ

ลักษณะการทำงานของ read() ของ BluetoothSocket ที่สอดคล้องกันสำหรับ RFCOMM

สำหรับแอปที่กำหนดเป้าหมายเป็น Android 17 (API ระดับ 37) ตอนนี้เมธอด read() ของ InputStream ที่ได้จาก BluetoothSocket ที่อิงตาม RFCOMM จะแสดงผลเป็น -1 เมื่อซ็อกเก็ตปิดหรือการเชื่อมต่อหลุด

การเปลี่ยนแปลงนี้ทำให้ลักษณะการทำงานของซ็อกเก็ต RFCOMM สอดคล้องกับซ็อกเก็ต LE CoC และสอดคล้องกับเอกสารประกอบ InputStream.read() มาตรฐาน ซึ่งระบุว่าระบบจะแสดงผล -1 เมื่อถึงจุดสิ้นสุดของสตรีม

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