Android 9 (API ระดับ 28) มีการเปลี่ยนแปลงหลายอย่างในระบบ Android
การเปลี่ยนแปลงลักษณะการทำงานต่อไปนี้มีผลเฉพาะกับแอปที่กำหนดเป้าหมาย
API ระดับ 28 ขึ้นไป แอปที่ตั้งค่า targetSdkVersion
เป็น API ระดับ 28 หรือ
ที่สูงกว่าต้องแก้ไข
เพื่อรองรับลักษณะการทำงานเหล่านี้อย่างถูกต้อง หากเกี่ยวข้องกับแอป
สําหรับการเปลี่ยนแปลงที่ส่งผลต่อแอปทั้งหมดที่ทํางานใน Android 9 ไม่ว่าจะเป็น API ใดก็ตาม ระดับที่กำหนดเป้าหมาย, ดู การเปลี่ยนแปลงลักษณะการทำงาน: แอปทั้งหมด
บริการที่ทำงานอยู่เบื้องหน้า
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปและใช้บริการที่ทำงานอยู่เบื้องหน้าต้องส่งคำขอ
FOREGROUND_SERVICE
สิทธิ์ นี่เป็นสิทธิ์ทั่วไป
ดังนั้นระบบจะให้สิทธิ์แอปกับแอปที่ส่งคำขอโดยอัตโนมัติ
หากแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปพยายามสร้างบริการที่ทำงานอยู่เบื้องหน้าโดยไม่มี
กำลังขอ FOREGROUND_SERVICE
ระบบแสดงข้อผิดพลาด SecurityException
การเปลี่ยนแปลงด้านความเป็นส่วนตัว
หากแอปกําหนดเป้าหมายเป็น Android 9 คุณควรทําสิ่งต่อไปนี้ พฤติกรรมที่เปลี่ยนแปลงไป การอัปเดตเหล่านี้ของข้อมูลหมายเลขซีเรียลและ DNS ของอุปกรณ์ ปรับปรุงความเป็นส่วนตัวของผู้ใช้
การเลิกใช้งานหมายเลขซีเรียลของบิลด์
ใน Android 9 Build.SERIAL
คือ
ตั้งค่าเป็น "UNKNOWN"
เสมอเพื่อปกป้องผู้ใช้ ความเป็นส่วนตัว
หากแอปของคุณจำเป็นต้องเข้าถึงหมายเลขซีเรียลของฮาร์ดแวร์อุปกรณ์ คุณควร
ให้ขอ
READ_PHONE_STATE
แล้วเรียก
getSerial()
ความเป็นส่วนตัวของ DNS
แอปที่กำหนดเป้าหมายเป็น Android 9 ควรใช้ DNS API ส่วนตัว โดยเฉพาะอย่างยิ่ง ควรตรวจสอบว่าถ้ารีโซลเวอร์ระบบทำ DNS-over-TLS ไคลเอ็นต์ DNS ในตัวจะใช้ DNS ที่เข้ารหัสไปยังชื่อโฮสต์เดียวกับ ระบบ หรือถูกปิดใช้งานเพื่อใช้รีโซลเวอร์ระบบแทน
การเปลี่ยนแปลงด้านความปลอดภัยของเฟรมเวิร์ก
Android 9 มีการเปลี่ยนแปลงลักษณะการทำงานหลายอย่างที่ช่วยปรับปรุง ความปลอดภัยของแอป แต่การเปลี่ยนแปลงเหล่านี้จะมีผลก็ต่อเมื่อแอปของคุณกำหนดเป้าหมายระดับ API เท่านั้น 28 ขึ้นไป
TLS เครือข่ายเปิดใช้งานโดยค่าเริ่มต้น
หากแอปกำหนดเป้าหมายเป็น Android 9 ขึ้นไป
isCleartextTrafficPermitted()
เมธอดจะแสดง false
โดยค่าเริ่มต้น หากแอปต้องเปิดใช้ข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัสสำหรับ
เฉพาะบางโดเมน คุณต้องตั้งค่า cleartextTrafficPermitted
เป็น true
อย่างชัดแจ้ง
สำหรับโดเมนเหล่านั้นในส่วน Network Security ของแอปของคุณ
การกำหนดค่า
ไดเรกทอรีข้อมูลแบบเว็บที่แยกตามกระบวนการ
เพื่อปรับปรุงความเสถียรของแอปและความสมบูรณ์ของข้อมูลใน Android 9 แอปต่างๆ จะไม่สามารถ
แชร์ข้อมูล WebView
รายการเดียว
ไดเรกทอรีระหว่าง
หลายกระบวนการ โดยปกติ
ไดเรกทอรีข้อมูลดังกล่าวจะจัดเก็บคุกกี้ แคช HTTP และข้อมูลถาวรอื่นๆ
ที่จัดเก็บข้อมูลชั่วคราวที่เกี่ยวข้องกับการท่องเว็บ
ในกรณีส่วนใหญ่ แอปของคุณควรใช้คลาสจาก
แพ็กเกจ android.webkit
เช่น
ในชื่อ WebView
และ
CookieManager
รายการเดียว
ขั้นตอนได้ เช่น ควรย้ายทั้งหมด
Activity
ออบเจ็กต์ที่ใช้ WebView
เข้าสู่กระบวนการเดียวกัน คุณสามารถบังคับใช้ "กระบวนการเดียวเท่านั้น" อย่างเคร่งครัดยิ่งขึ้น กฎ
โดยการโทร
disableWebView()
นิ้ว
กระบวนการอื่นๆ ของแอป การเรียกนี้ป้องกันไม่ให้ WebView
เริ่มต้น
ในกระบวนการอื่นๆ เหล่านั้นโดยไม่ได้ตั้งใจ แม้ว่าจะถูกเรียกจาก
ไลบรารี
หากแอปต้องใช้อินสแตนซ์ของ
WebView
มากกว่า 1 กระบวนการ
คุณต้องกำหนดคำต่อท้ายไดเรกทอรีข้อมูลที่ไม่ซ้ำกันสำหรับแต่ละกระบวนการโดยใช้ฟังก์ชัน
WebView.setDataDirectorySuffix()
ก่อนใช้อินสแตนซ์ที่กำหนดของ WebView
ในกระบวนการนั้น วิธีนี้
วางข้อมูลเว็บจากแต่ละกระบวนการไว้ในไดเรกทอรีของตนเองภายในข้อมูลของแอป
ไดเรกทอรี
โดเมน SELinux ต่อแอป
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปไม่สามารถแชร์ข้อมูลกับแอปอื่นๆ โดยใช้ สิทธิ์ Unix ที่สามารถเข้าถึงได้ทั่วโลก การเปลี่ยนแปลงนี้จะช่วยเพิ่มความสมบูรณ์ของ Android Application Sandbox โดยเฉพาะอย่างยิ่งข้อกำหนดที่ว่า เข้าถึงข้อมูลส่วนตัวได้ จากแอปนั้นเท่านั้น
หากต้องการแชร์ไฟล์กับแอปอื่นๆ ให้ใช้เนื้อหา ผู้ให้ทุน
การเปลี่ยนแปลงการเชื่อมต่อ
การนับข้อมูลการเชื่อมต่อและหลายเส้นทาง
ภายในแอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป ระบบจะนับจำนวน
การจราจรของข้อมูลในเครือข่าย
ที่ไม่ใช่ค่าเริ่มต้นในปัจจุบัน เช่น การเข้าชมผ่านเครือข่ายมือถือขณะที่อุปกรณ์เปิดอยู่
Wi-Fi และให้บริการใน
NetworkStatsManager
ระดับการค้นหาสำหรับการเข้าชมนั้น
โดยเฉพาะอย่างยิ่ง
getMultipathPreference()
จะแสดงค่าตามการจราจรของข้อมูลในเครือข่ายที่กล่าวไว้ข้างต้น เริ่มต้นด้วย
Android 9 เมธอดจะแสดง true
สำหรับข้อมูลเซลล์ แต่เมื่อมีข้อมูลมากกว่าจำนวนเงินที่กำหนด
มีการเข้าชมสะสมใน 1 วัน และจะเริ่มกลับมาอีก false
แอปที่ทำงานอยู่
Android 9 ต้องเรียกใช้เมธอดและใช้คำแนะนำนี้
ConnectivityManager.NetworkCallback
ตอนนี้คลาสจะส่งข้อมูลเกี่ยวกับ VPN ไปยังแอป การเปลี่ยนแปลงนี้
ทำให้ทุกอย่างง่ายขึ้น
แอปสำหรับฟังเหตุการณ์การเชื่อมต่อโดยไม่ต้องผสมผสานแบบซิงโครนัสและ
การเรียกแบบไม่พร้อมกันและการใช้ API ที่จำกัด และยังหมายความว่า
การโอนข้อมูลจะทำงานตามที่คาดไว้เมื่อเชื่อมต่ออุปกรณ์กับ
เครือข่าย Wi-Fi หรือเครือข่ายมือถือหลายเครือข่ายพร้อมกัน
การเลิกใช้งานไคลเอ็นต์ Apache HTTP
ด้วย Android 6.0 เราได้นำการรองรับไคลเอ็นต์ Apache HTTP ออก ตั้งแต่ Android 9 เป็นต้นไป ระบบจะนำไลบรารีดังกล่าวออกจาก Bootclasspath และใช้กับแอปไม่ได้โดยค่าเริ่มต้น
หากต้องการใช้ไคลเอ็นต์ Apache HTTP ต่อไป แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไป
สามารถเพิ่มรายการต่อไปนี้ใน AndroidManifest.xml
ได้
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
นอกจากจะใช้ไลบรารี Apache แบบรันไทม์แล้ว แอปยังสามารถรวม
เวอร์ชันของตัวเองของไลบรารี org.apache.http
ใน APK ของตน หากคุณทำเช่นนี้
คุณต้องจัดแพ็กเกจไลบรารีใหม่ (โดยมียูทิลิตีอย่างเช่น
Jar Jar) เพื่อหลีกเลี่ยงปัญหาเรื่องความเข้ากันได้ของชั้นเรียน
ด้วยคลาสที่ให้ไว้ในรันไทม์
การเปลี่ยนแปลง UI
ดูโฟกัส
ไม่สามารถโฟกัสมุมมองที่มีพื้นที่ 0 (ความกว้างหรือความสูงเป็น 0) ได้อีกต่อไป
นอกจากนี้ กิจกรรมจะไม่กำหนดจุดโฟกัสเริ่มต้นใน โหมดสัมผัส คุณจะขอโฟกัสเริ่มต้นอย่างชัดเจนแทนได้ หาก ที่ต้องการ
การจัดการค่าเลขฐานสิบหก RGBA ของ CSS
แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปต้องเปิดใช้ฉบับร่าง โมดูลสี CSS ระดับ 4 การจัดการสี CSS แบบ 4 และ 8 หลัก
โมดูลสี CSS ระดับ 4 ได้รับการรองรับโดย Chrome ตั้งแต่รุ่น 52 แต่ WebView ปิดใช้ฟีเจอร์นี้อยู่ เนื่องจากพบว่าแอปพลิเคชัน Android ที่มีอยู่มีสีแบบเลขฐาน 16 แบบ 32 บิต ในการจัดลำดับ Android (ARGB) ซึ่งจะทำให้เกิดข้อผิดพลาดในการแสดงผล
ตัวอย่างเช่น ปัจจุบันสี #80ff8080
แสดงผลเป็นภาษา
WebView เป็นแบบทึบ
แดงอ่อน (#ff8080
) สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 27 หรือต่ำกว่า ผู้นำ
(ซึ่ง Android จะตีความว่าเป็นคอมโพเนนต์อัลฟ่า) คือ
ละเว้นในขณะนี้ หากแอปกำหนดเป้าหมายเป็น API ระดับ 28 ขึ้นไป #80ff8080
จะ
ตีความว่าเป็นสีเขียวอ่อนโปร่ง 50% (#80ff80
)
การดักจับประเภท MIME สำหรับไฟล์: URI
Android เวอร์ชันก่อน Android 9 อาจอนุมานประเภท MIME จากไฟล์นี้ได้
เนื้อหา ตั้งแต่แอป Android 9 (API ระดับ 28) ต้องใช้
แก้ไขนามสกุลไฟล์เมื่อโหลด URI file:
ใน
WebView
การใช้เนื้อหาของไฟล์เพื่ออนุมานประเภท MIME อาจเป็นข้อบกพร่องด้านความปลอดภัย และเบราว์เซอร์ที่ทันสมัยมักไม่อนุญาต
หากไฟล์มีนามสกุลไฟล์ที่รู้จัก เช่น .html
.txt
, .js
หรือ .css
ประเภท MIME จะกำหนดโดยส่วนขยาย
หากไฟล์ไม่มีนามสกุลหรือนามสกุลที่ไม่รู้จัก ประเภท MIME จะเป็นแบบธรรมดา
ข้อความ
ตัวอย่างเช่น URI เช่น file:///sdcard/test.html
จะแสดงผลเป็น
HTML แต่ URI เช่น file:///sdcard/test
จะแสดงผลเป็นข้อความธรรมดา
แม้ว่าไฟล์จะมีข้อมูล HTML ก็ตาม
องค์ประกอบการเลื่อนเอกสาร
Android 9 จะจัดการกรณีที่รูทเอกสารได้อย่างถูกต้อง คือเอลิเมนต์แบบเลื่อน เวอร์ชันก่อนหน้ามีการตั้งค่าตำแหน่งการเลื่อนในองค์ประกอบเนื้อหา และ องค์ประกอบรากมีค่าการเลื่อนเป็น 0 Android 9 จะเปิดใช้ ลักษณะการทำงานที่สอดคล้องกับมาตรฐานโดยที่องค์ประกอบแบบเลื่อนเป็นรูท
นอกจากนี้ การเข้าถึง document.body.scrollTop
, document.body.scrollLeft
โดยตรง
document.documentElement.scrollTop
หรือ document.documentElement.scrollLeft
จะทำงานแตกต่างกันไปตาม SDK เป้าหมาย วิธีเข้าถึงการเลื่อนวิวพอร์ต
ให้ใช้ document.scrollingElement
หากมี
การแจ้งเตือนจากแอปที่ถูกระงับ
ก่อนวันที่ Android 9 การแจ้งเตือนจากแอปที่ถูกระงับถูกยกเลิก เริ่มตั้งแต่ Android 9 ระบบจะซ่อนการแจ้งเตือนจากแอปที่ถูกระงับจนกว่า แอปจะทำงานต่อ