Android O กำลังทำลายแอปที่วางซ้อนอยู่ด้านบนของแถบสถานะ

Android O เลิกใช้ TYPE_SYSTEM_OVERLAY แทน TYPE_APPLICATION_OVERLAY ส่งผลให้แอปที่วางซ้อนบนแถบสถานะใช้งานไม่ได้

โพสต์เล็กๆ น้อยๆ ที่สรุปฟีเจอร์ใหม่ๆ ที่ผู้ใช้พบเห็น แอนดรอยด์โอ ขณะนี้เริ่มชะลอตัวลงเนื่องจากผู้ใช้มีเวลาหลายสัปดาห์ในการทดสอบซอฟต์แวร์บนอุปกรณ์ของตน อย่างไรก็ตาม มีการเปลี่ยนแปลงมากมายที่เกิดขึ้นภายใต้ประทุนที่กำลังถูกเปิดเผยอย่างช้าๆ เราโพสต์เกี่ยวกับการเปลี่ยนแปลงดังกล่าวเมื่อวันก่อนเกี่ยวกับอุปกรณ์ Nexus และ Pixel ที่ใช้ Android O การใช้ SDCardFS. แต่วันนี้ เราอยากจะหารือเกี่ยวกับการเปลี่ยนแปลงที่จะส่งผลกระทบต่อนักพัฒนาแอปบางแอป โดยเฉพาะอย่างยิ่งแอปเหล่านั้น วางซ้อนที่ด้านบนของแถบสถานะ. แอปพลิเคชันเหล่านี้ดูเหมือนจะเป็น ใช้งานไม่ได้ในการแสดงตัวอย่างนักพัฒนา Android Oซึ่งเมื่อมองแวบแรกคุณอาจมองว่าเป็นข้อบกพร่องธรรมดาๆ แต่เมื่อเจาะลึกเข้าไปในเอกสารอ้างอิงแล้ว นี่อาจเป็นได้ การเปลี่ยนแปลงที่ตั้งใจไว้ โดย Google


Android O ทำลายการซ้อนทับแถบสถานะ

สิ่งหนึ่งที่ฉันชอบเกี่ยวกับ Android คือความสามารถในการปรับแต่งได้ ผู้ใช้ที่รูทหรือใช้งาน ROM แบบกำหนดเองสามารถกำหนดธีมแถบสถานะระบบของตนได้โดยไม่มีข้อจำกัดโดยทั่วไป แต่หากอุปกรณ์ของคุณไม่ได้ทำการรูท คุณจะมีตัวเลือกน้อยลง โชคดีที่มีแอปพลิเคชันมากมายใน Google Play Store ที่ให้คุณเปลี่ยนลักษณะของแถบสถานะในระดับพื้นฐานได้ สิ่งนี้เป็นไปได้ด้วยการผสมผสานอันชาญฉลาดของ System Overlay Windows เพื่อแสดงแถบสถานะที่กำหนดเองเหนือแถบสถานะที่มีอยู่ ตัวฟังการแจ้งเตือนเพื่อแสดงการแจ้งเตือน และตัวเลือกบริการการเข้าถึงเพื่อให้สามารถปรับสีแบบกำหนดเองตามบริบทได้ แถบสถานะ.

ภาพหน้าจอทั้งสองด้านบนแสดงให้เห็นว่าแถบการแจ้งเตือนของฉันจะมีลักษณะอย่างไรเมื่อใช้แอปซ้อนทับแถบสถานะหนึ่งในหลายแอปที่มีอยู่ใน Play Store ภาพหน้าจอเหล่านี้ถ่ายใน Huawei Mate 9 ที่ยังไม่ได้รูทเครื่องที่ใช้ EMUI 5.0 สำหรับผู้ที่ไม่คุ้นเคยกับ EMUI แถบสถานะจะดูไม่เหมือนภาพหน้าจอด้านบน แต่ดูเหมือนว่านี้:

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

แทนที่จะเป็นโอเวอร์เลย์ที่บล็อกแถบสถานะดั้งเดิม ดูเหมือนว่าโอเวอร์เลย์ คาบเกี่ยวกัน ด้วยแถบสถานะเดิมซึ่งส่งผลให้เกิดความยุ่งเหยิงครั้งใหญ่

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

นี่คือรายการแอปยอดนิยมบางแอปที่อาจแสดงผลไร้ประโยชน์ได้:

  • สถานะ (การติดตั้ง 500,000 - 1,000,000)
  • แถบสถานะวัสดุ (การติดตั้ง 1,000,000 - 5,000,000)
  • เครื่องมือที่ยอดเยี่ยม - สถิติระบบ (การติดตั้ง 500,000 - 1,000,000)
  • เทเลซีน (การติดตั้ง 50,000 - 100,000 ครั้ง)
  • แถบสถานะที่สะอาด (การติดตั้ง 100,000 - 500,000)
  • ไทนี่คอร์ (การติดตั้ง 100,000 - 500,000)

และรายชื่อแอปบางตัวที่จะใช้งานได้แต่ไม่สามารถซ้อนทับบนแถบสถานะได้อีกต่อไป (จำกัดฟังก์ชันการทำงานก่อนหน้านี้):

  • ทไวไลท์ (การติดตั้ง 5,000,000 - 10,000,000)
  • เฮดส์อัพ (การติดตั้ง 100,000 - 500,000)
  • การตรวจสอบทรัพยากรขนาดเล็ก (การติดตั้ง 50,000 - 100,000 ครั้ง)
  • การตรวจสอบเครือข่ายมินิ (การติดตั้ง 1,000,000 - 5,000,000)

มีแอปอีกมากมายใน Play Store ที่ใช้การซ้อนทับบางประเภทที่ด้านบนของแถบสถานะ คุณสามารถบอกได้เลยว่าการเปลี่ยนแปลงดังกล่าวจะส่งผลต่อแอพจำนวนมากที่อาจใช้งานโดยคนนับล้าน ผู้ใช้ แล้วเกิดอะไรขึ้นที่นี่?


TYPE_SYSTEM_OVERLAY กำลังจะเลิกใช้แล้ว

ในการทำซ้ำใหม่ของ Android แต่ละครั้ง Google จะแนะนำและเลิกใช้คุณสมบัติต่างๆ (ระบุว่าล้าสมัยและจะถูกลบออก) คราวนี้ฟีเจอร์ที่อยู่บนเขียงคือ TYPE_SYSTEM_OVERLAY เพื่ออ้างอิงถึง หน้าอ้างอิง สิ่งที่ฟีเจอร์นี้มอบให้นักพัฒนา:

TYPE_SYSTEM_OVERLAY

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

โดยพื้นฐานแล้ว หน้าต่างประเภทนี้อนุญาตให้แอปวาดที่ด้านบนขององค์ประกอบใดๆ บนหน้าจอ รวมถึงแถบสถานะด้วย อย่างไรก็ตาม ตั้งแต่ Android O เป็นต้นไป หน้าต่างประเภทนี้ได้เลิกใช้แล้ว สำหรับแอปที่ไม่ใช่ระบบ Google แนะนำให้นักพัฒนาซอฟต์แวร์ใช้ TYPE_APPLICATION_OVERLAY แทน เพื่ออ้างอิงถึง หน้าอ้างอิง ประเภทหน้าต่างใหม่นี้ทำอะไรได้บ้าง:

TYPE_APPLICATION_OVERLAY

ประเภทหน้าต่าง: หน้าต่างซ้อนทับของแอปพลิเคชันจะแสดงเหนือหน้าต่างกิจกรรมทั้งหมด (ประเภทระหว่าง FIRST_APPLICATION_WINDOW และ LAST_APPLICATION_WINDOW) แต่อยู่ใต้หน้าต่างระบบที่สำคัญ เช่น แถบสถานะหรือ IME

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

ระบบจะปรับความสำคัญของกระบวนการด้วยหน้าต่างประเภทนี้ เพื่อลดโอกาสที่โปรแกรมทำลายหน่วยความจำเหลือน้อยจะฆ่ากระบวนการเหล่านั้น

ในระบบที่มีผู้ใช้หลายรายจะแสดงเฉพาะบนหน้าจอของผู้ใช้ที่เป็นเจ้าของเท่านั้น

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

นอกจากนี้ ดูเหมือนจะไม่มีวิธีแก้ปัญหาสำหรับนักพัฒนาให้ใช้ในขณะนี้ เราอาจคาดหวังได้ว่า เพื่อหลีกเลี่ยงปัญหานี้บน Android O นักพัฒนาเพียงแค่สร้างแอปของตนเพื่อกำหนดเป้าหมาย SDK 25 (Android 7.1.1) อย่างไรก็ตาม ดังที่ อ ผู้พัฒนาสถานะบน Reddit, Google มี แทนที่ TYPE_SYSTEM_OVERLAY ด้วย TYPE_APPLICATION_OVERLAY และการเปลี่ยนแปลงคือ เป็นอิสระจาก SDK เป้าหมาย รุ่น นักพัฒนาที่ใช้ TYPE_SYSTEM_OVERLAY ในปัจจุบันต้องใช้ TYPE_APPLICATION_OVERLAY เพื่อรักษาความเข้ากันได้ ดังนั้น ไม่ว่าแอปหนึ่งๆ จะใช้ SDK เป้าหมายเวอร์ชันใดก็ตาม ก็สามารถทำได้ ไม่ใช้ TYPE_SYSTEM_OVERLAY บน Android O อีกต่อไป.


สิ่งที่สามารถทำได้เกี่ยวกับเรื่องนี้?

ยังไม่ชัดเจนว่าเหตุใด Google จึงทำการเปลี่ยนแปลงนี้ เนื่องจากยังไม่ได้ให้คำอธิบายอย่างเป็นทางการ ฉันเดาว่ามันเป็นความพยายามในการปรับปรุงความปลอดภัยบน Android โดยการป้องกันผู้ใช้ที่ไม่สงสัยจากการติดตั้งแอพที่บล็อกหรือเปลี่ยนแถบสถานะโดยไม่ได้ตั้งใจ น่าเสียดายที่การเปลี่ยนแปลงนี้รองรับแอปพลิเคชันที่ถูกต้องตามกฎหมายจำนวนมากซึ่งใช้ TYPE_SYSTEM_OVERLAY ใน crossfire

นักพัฒนาซอฟต์แวร์ที่ใช้คุณสมบัตินี้ได้เปิดรายงานข้อบกพร่องในตัวติดตามปัญหาของ Android (#260787 และ #36574245) เพื่อประท้วงการเปลี่ยนแปลงและขอ API ทางเลือก แต่ Googler แสดงความคิดเห็นในตัวติดตามด้วย ข้อความต่อไปนี้:

สถานะ: จะไม่แก้ไข (พฤติกรรมที่ตั้งใจไว้)

เราได้ติดตามผลกับทีมผลิตภัณฑ์และวิศวกรและได้รับข้อเสนอแนะว่านักพัฒนาสามารถใช้กิจกรรม SHOW_WHEN_LOCKED เพื่อ แสดงเมื่ออุปกรณ์ถูกล็อค แต่ไม่สามารถแสดงบนหน้าจอล็อค/บนหน้าต่างแจ้งเตือนได้อีกต่อไป

ในตอนนี้ ดูเหมือนว่านักพัฒนาเหล่านี้โชคไม่ดี เนื่องจากนักพัฒนาได้ชี้ให้เห็นว่า FLAG_SHOW_WHEN_LOCKED ยังคงไม่อนุญาตให้มีการซ้อนทับหน้าต่างที่ด้านบนของแถบสถานะ ยังไม่ชัดเจนว่านักพัฒนาแอปเหล่านี้สามารถทำอะไรได้บ้าง ยกเว้นการอธิษฐานขอให้ Google เปลี่ยนแปลงสิ่งต่างๆ หรือปลุกนรกเกี่ยวกับเรื่องนี้

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


ขอขอบคุณ Eli Irvin สำหรับการทดสอบแอปเหล่านี้มากมายให้ฉัน!