Android 8.1 (API ระดับ 27) เปิดตัวฟีเจอร์ต่างๆ มากมาย ฟีเจอร์และความสามารถใหม่ๆ สำหรับผู้ใช้และนักพัฒนาซอฟต์แวร์ เอกสารนี้ไฮไลต์สิ่งใหม่ๆ สำหรับนักพัฒนาซอฟต์แวร์
Android Oreo (รุ่น Go)
Android Go เป็นโครงการริเริ่มของเราในการเพิ่มประสิทธิภาพประสบการณ์การใช้งาน Android สําหรับ ผู้คนหลายพันล้านคนออนไลน์ทั่วโลก เริ่มตั้งแต่ Android 8.1 เรากำลังทำให้ Android เป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับอุปกรณ์ระดับเริ่มต้น ฟีเจอร์ต่างๆ ใน Android Oreo การกำหนดค่า (รุ่น Go) มีดังนี้
- การเพิ่มประสิทธิภาพหน่วยความจำ ปรับปรุงการใช้งานหน่วยความจำทั่วทั้งแพลตฟอร์มเพื่อให้มั่นใจว่า ที่แอปจะทำงานได้อย่างมีประสิทธิภาพในอุปกรณ์ที่มี RAM ไม่เกิน 1 GB
- ตัวเลือกการกำหนดเป้าหมายที่ยืดหยุ่น รายงานใหม่ ฟีเจอร์ฮาร์ดแวร์ ค่าคงที่เพื่อช่วยให้คุณกำหนดเป้าหมายการเผยแพร่แอปไปยังอุปกรณ์ปกติหรืออุปกรณ์ที่มี RAM ต่ำโดยใช้ Google Play
- Google Playขณะที่แอปทั้งหมดใช้งานได้ในอุปกรณ์ที่ใช้ Android Oreo (รุ่น Go) ส่วน Google Play จะแสดงให้เห็นแอปที่เพิ่มประสิทธิภาพโดยนักพัฒนาแอปโดยเฉพาะ เพื่อให้ประสบการณ์ที่ยอดเยี่ยมสำหรับผู้คนหลายพันล้านคน ด้วยการสร้างอาคารสำหรับหลายพันล้านคน หลักเกณฑ์
เราได้อัปเดตอาคารสำหรับผู้ใช้หลายพันล้านคน หลักเกณฑ์ที่มีข้อมูลเพิ่มเติมเกี่ยวกับวิธี เพิ่มประสิทธิภาพแอปสำหรับอุปกรณ์ที่เรียกใช้ Android Oreo (รุ่น Go) สำหรับนักพัฒนาซอฟต์แวร์ส่วนใหญ่ การเพิ่มประสิทธิภาพ APK ที่มีอยู่หรือการใช้ ของ Google Play ฟีเจอร์ APK หลายรายการ สำหรับการกำหนดเป้าหมายเวอร์ชัน APK ของคุณไปยังอุปกรณ์ที่มี RAM ต่ำ เป็นวิธีที่ดีที่สุดในการเตรียมความพร้อมสำหรับอุปกรณ์ที่ใช้ Android Oreo (รุ่น Go) โปรดทราบว่าการทำให้ แอปพลิเคชัน ใช้งานน้อยลงและมีประสิทธิภาพมากขึ้นต่อกลุ่มเป้าหมายของคุณ ไม่ว่าจะใช้อุปกรณ์ใด
API โครงข่ายระบบประสาทเทียม
Neural Networks API ให้การประมวลผลและการอนุมานแบบเร่งสำหรับเครื่องในอุปกรณ์ กรอบการเรียนรู้อย่างเช่น TensorFlow Lite - ไลบรารี ML ข้ามแพลตฟอร์มของ Google สำหรับอุปกรณ์เคลื่อนที่ รวมทั้ง Caffe2 และอื่นๆ ไปที่ TensorFlow Lite โอเพนซอร์ส ที่เก็บสำหรับการดาวน์โหลดและเอกสาร TensorFlow Lite ทำงานร่วมกับ API โครงข่ายระบบประสาทเทียมเพื่อเรียกใช้โมเดลอย่างเช่น MobileNets Inception v3, และ ช่วยตอบได้อย่างมีประสิทธิภาพบนอุปกรณ์เคลื่อนที่
การอัปเดตเฟรมเวิร์กการป้อนข้อความอัตโนมัติ
Android 8.1 (API ระดับ 27) มีการปรับปรุงหลายอย่างในการป้อนข้อความอัตโนมัติ กรอบการทำงานที่คุณสามารถใส่ไว้ในแอปของคุณ
BaseAdapter
ชั้นเรียนในขณะนี้จะมี setAutofillOptions()
ซึ่งช่วยให้คุณระบุการแสดงแทนสตริงของค่าในแอตทริบิวต์
อะแดปเตอร์ ซึ่งมีประโยชน์สำหรับไอคอนหมุน
ซึ่งใช้สร้างค่าแบบไดนามิกในอะแดปเตอร์ ตัวอย่างเช่น
คุณจะใช้เมธอด setAutofillOptions()
เพื่อระบุสตริงได้
แสดงรายชื่อปีที่ผู้ใช้สามารถเลือกเป็นส่วนหนึ่งของ
วันหมดอายุของบัตรเครดิต บริการป้อนข้อความอัตโนมัติใช้การแสดงสตริงได้
เพื่อกรอกข้อมูลพร็อพเพอร์ตี้ที่ต้องการข้อมูลนั้นอย่างเหมาะสม
นอกจากนี้ AutofillManager
รวมเมธอด notifyViewVisibilityChanged(View, int, boolean)
ไว้ด้วย
คุณสามารถโทรแจ้งเฟรมเวิร์กเกี่ยวกับการเปลี่ยนแปลงการแสดงผล
ในโครงสร้างเสมือนจริง นอกจากนี้ยังมีเมธอดสำหรับ
และโครงสร้างเสมือนจริงทั้งหมด แต่ในกรณีทั่วไป คุณจะไม่จําเป็นต้องใช้โครงสร้างเสมือน
แจ้งเฟรมเวิร์กอย่างชัดเจน เนื่องจากเมธอดถูกเรียกโดย
View
Android 8.1 ยังช่วยให้บริการป้อนข้อความอัตโนมัติปรับแต่ง UI การบันทึกได้มากขึ้นอีกด้วย
ราคาพิเศษด้วยการเพิ่มการรองรับValidator
CustomDescription
and
ภายใน SaveInfo
คำอธิบายที่กำหนดเองมีประโยชน์ในการช่วยให้บริการป้อนข้อความอัตโนมัติอธิบายสิ่งที่
ได้รับการบันทึก เช่น เมื่อหน้าจอแสดงบัตรเครดิต
แสดงโลโก้ของธนาคารบัตรเครดิต ตัวเลข 4 หลักสุดท้ายของบัตรเครดิต
และหมายเลขวันหมดอายุ ดูข้อมูลเพิ่มเติมได้ที่
CustomDescription
Validator
เพื่อหลีกเลี่ยงการแสดง UI การบันทึกการป้อนข้อความอัตโนมัติเมื่อโปรแกรมตรวจสอบ
ไม่เป็นไปตามเงื่อนไข ในการเรียนรู้เพิ่มเติม โปรดดูที่
คลาสการตรวจสอบความถูกต้องพร้อมกับคลาสย่อย
LuhnChecksumValidator และ RegexValidator
การแจ้งเตือน
Android 8.1 มีการเปลี่ยนแปลงการแจ้งเตือนดังต่อไปนี้
- ตอนนี้แอปจะส่งเสียงแจ้งเตือนได้ 1 ครั้งต่อวินาทีเท่านั้น เสียงการแจ้งเตือนที่เกิน จะไม่รวมอยู่ในคิวและจะหายไป การเปลี่ยนแปลงนี้ไม่ส่งผลต่อการแจ้งเตือนในด้านอื่นๆ การทำงานและข้อความแจ้งเตือนยังคงโพสต์ได้ตามปกติ
-
NotificationListenerService
และ ไม่รองรับConditionProviderService
ใน RAM ต่ำ อุปกรณ์ที่ใช้ระบบ Android ซึ่งส่งคืนtrue
เมื่อ มีการเรียกActivityManager.isLowRamDevice()
การอัปเดต EditText
เริ่มต้นด้วย API ระดับ 27 เมธอด EditText.getText()
จะแสดง Editable
ก่อนหน้านี้
คำสั่งซื้อแสดงผล CharSequence
การเปลี่ยนแปลงนี้
สามารถเข้ากันได้แบบย้อนหลัง เนื่องจาก Editable
ใช้งาน
CharSequence
อินเทอร์เฟซ Editable
มอบบริการเสริม
ตัวอย่างเช่น เนื่องจาก Editable
ใช้อินเทอร์เฟซ Spannable
ซึ่งใช้มาร์กอัปเพื่อ
เนื้อหาภายในอินสแตนซ์ของ EditText
การดำเนินการของ Google Safe Browsing แบบเป็นโปรแกรม
โดยการใช้
WebView
การใช้งาน Safe Browsing API แอปของคุณสามารถ
ตรวจจับเมื่อมีอินสแตนซ์ของ WebView
พยายามจะไปยังส่วนต่างๆ
ไปยัง URL ที่ Google จัดประเภทว่าเป็นภัยคุกคามที่รู้จัก โดยค่าเริ่มต้น แอตทริบิวต์
WebView
แสดงโฆษณาคั่นระหว่างหน้าที่เตือนผู้ใช้เกี่ยวกับภัยคุกคามที่ทราบ
หน้าจอนี้ให้ตัวเลือกแก่ผู้ใช้ในการโหลด URL ต่อไปหรือกลับไปยัง
หน้าที่ปลอดภัยไว้ก่อนแล้ว
ใน Android 8.1 คุณสามารถกำหนดได้แบบเป็นโปรแกรมว่า ตอบสนองต่อภัยคุกคามที่ทราบแล้ว เช่น
- คุณควบคุมได้ว่าจะให้แอปรายงานภัยคุกคามที่รู้จักไปยัง Safe หรือไม่ การท่องเว็บ
- คุณสามารถกำหนดให้แอปทำงานบางอย่างโดยอัตโนมัติได้ เช่น กลับสู่ความปลอดภัยทุกครั้งที่เจอ URL ที่ Google Safe Browsing จัดเป็นภัยคุกคามที่รู้จัก
หมายเหตุ: โปรดรอเพื่อป้องกันภัยคุกคามที่รู้จักได้อย่างมีประสิทธิภาพที่สุด
จนกว่าคุณจะเริ่มต้น Google Safe Browsing ก่อนที่จะเรียกใช้
เมธอด loadUrl()
ของออบเจ็กต์ WebView
ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีออกคำสั่งให้อินสแตนซ์ของแอป
WebView
เพื่อกลับสู่ความปลอดภัยเสมอหลังจากพบ
ภัยคุกคามที่ทราบ:
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
Java
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
Java
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
เครื่องมือแยกภาพขนาดย่อของวิดีโอ
คลาส MediaMetadataRetriever
มีเมธอดใหม่คือ getScaledFrameAtTime()
ที่ค้นหา
เฟรมใกล้กับตำแหน่งเวลาที่ระบุ และแสดงบิตแมปที่มีมุมมองเหมือนกัน
อัตราส่วนเป็นเฟรมต้นฉบับ แต่ปรับขนาดให้พอดีกับสี่เหลี่ยมผืนผ้าที่มีความกว้างที่กำหนด
และความสูง ซึ่งมีประโยชน์ในการสร้างภาพขนาดย่อจากวิดีโอ
ขอแนะนำให้ใช้วิธีนี้แทนgetFrameAtTime()
ซึ่งจะสิ้นเปลืองหน่วยความจำได้
เนื่องจากจะแสดงบิตแมปที่มีความละเอียดเท่ากับวิดีโอต้นฉบับ สำหรับ
เช่น เฟรมจากวิดีโอ 4K จะเป็นบิตแมปขนาด 16 MB ซึ่งมีขนาดใหญ่กว่า
ที่จะใช้เป็นภาพขนาดย่อ
API หน่วยความจำที่ใช้ร่วมกัน
Android 8.1 (API ระดับ 27) เปิดตัวฟีเจอร์ใหม่
SharedMemory
API ชั้นเรียนนี้จะช่วยให้คุณสามารถสร้าง จับคู่ และจัดการโปรไฟล์
SharedMemory
อินสแตนซ์ คุณตั้งค่าการป้องกันหน่วยความจำ
ใน
SharedMemory
สำหรับการอ่านและ/หรือการเขียน และเนื่องจาก
SharedMemory
ออบเจ็กต์นี้เป็นแบบพาร์เซลได้ ซึ่งคุณจะส่งผ่านไปยังกระบวนการอื่นผ่าน AIDL ได้อย่างง่ายดาย
SharedMemory
API จะทำงานร่วมกับ
สถานประกอบการ ASharedMemory
ใน NDK
ASharedMemory
ให้สิทธิ์เข้าถึง
ลงในข้อบ่งชี้ไฟล์ ซึ่งจะนำไปแมปเพื่ออ่านและเขียนได้ ซึ่งดีมาก
วิธีการแชร์ข้อมูลจำนวนมาก
ข้อมูลระหว่างแอปต่างๆ หรือระหว่างหลายๆ กระบวนการภายในแอปเดียวได้
API WallpaperColors
Android 8.1 (API ระดับ 27) ช่วยให้วอลเปเปอร์เคลื่อนไหวแสดงสีได้
ลงใน UI ของระบบ ซึ่งทำได้โดยสร้าง WallpaperColors
จากบิตแมป ถอนออกได้ หรือใช้ 3 สีที่คุณเลือกด้วยตนเอง
คุณสามารถเรียกดูข้อมูลสีนี้ได้เช่นกัน
วิธีสร้าง WallpaperColors
ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
- วิธีสร้าง
WallpaperColors
โดยใช้สี 3 สี สร้างอินสแตนซ์ของWallpaperColors
โดยผ่านชั้นประถม มัธยม และสีตติยภูมิ องค์ประกอบหลัก สีต้องไม่เป็นค่าว่าง - วิธีสร้าง
WallpaperColors
จากบิตแมป เรียกใช้fromBitmap()
โดยการส่งแหล่งที่มาของบิตแมปเป็นพารามิเตอร์ - วิธีสร้าง
WallpaperColors
จากออบเจ็กต์ที่ถอนออกได้ ให้เรียกfromDrawable()
โดยการส่งแหล่งที่มาที่ถอนออกได้เป็นพารามิเตอร์
หากต้องการเรียกดูรายละเอียดสีหลัก สีรอง หรือสีที่ 3 จาก ให้เรียกวิธีการต่อไปนี้
getPrimaryColor()
จะแสดงสีที่ดึงดูดสายตามากที่สุดของวอลเปเปอร์getSecondaryColor()
จะแสดงสีที่โดดเด่นเป็นอันดับ 2 ของวอลเปเปอร์getTertiaryColor()
จะแสดงสีที่โดดเด่นเป็นอันดับ 3 ของวอลเปเปอร์
วิธีแจ้งระบบเกี่ยวกับการเปลี่ยนแปลงสีที่สำคัญในวอลเปเปอร์เคลื่อนไหว
โทรหา notifyColorsChanged()
เมธอดนี้จะทริกเกอร์วงจร onComputeColors()
กิจกรรมที่เปิดโอกาสให้คุณมอบ WallpaperColors
ออบเจ็กต์
หากต้องการเพิ่ม Listener สำหรับการเปลี่ยนสี คุณสามารถเรียกใช้เมธอด addOnColorsChangedListener()
คุณสามารถ
เรียกเมธอด getWallpaperColors()
ด้วย
เพื่อดึงข้อมูลสีหลักของวอลเปเปอร์
การอัปเดตลายนิ้วมือ
ชั้นเรียน FingerprintManager
มี
ได้แนะนำรหัสข้อผิดพลาดต่อไปนี้
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– ผู้ใช้ได้ลองใช้ ปลดล็อกอุปกรณ์โดยใช้เครื่องอ่านลายนิ้วมือหลายครั้งเกินไป -
FINGERPRINT_ERROR_VENDOR
– ลายนิ้วมือเฉพาะผู้ให้บริการ เกิดข้อผิดพลาดกับผู้อ่าน
ข้อมูลอัปเดตเกี่ยวกับวิทยาการเข้ารหัส
มีการเปลี่ยนแปลงวิทยาการเข้ารหัสบางอย่างใน Android 8.1 ดังต่อไปนี้
- มีการนำอัลกอริทึมใหม่มาใช้ใน Conscrypt แนวคิด
แนะนำให้ใช้แทน Bouncy Castle ที่มีอยู่
การใช้งานของคุณ อัลกอริทึมใหม่มีดังนี้
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
- ปฏิเสธ
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
รายการ ใช้งานได้นานกว่าสำหรับอัลกอริทึมที่ใช้ GCM ให้ใช้getParameterSpec(GCMParameterSpec.class)
- คลาส Conscrypt ภายในจำนวนมากที่เชื่อมโยงกับ TLS ถูกเปลี่ยนโครงสร้างภายในโค้ดแล้ว ตั้งแต่ปี
นักพัฒนาซอฟต์แวร์ก็เข้าถึงภาพสะท้อนเหล่านี้
ได้กลายเป็นส่วนหนึ่งของ
รองรับการใช้งานก่อนหน้านี้ แต่รายละเอียดบางอย่างมีการเปลี่ยนแปลง ตัวอย่างเช่น Sockets
ก่อนหน้านี้เป็นประเภท
OpenSSLSocketImpl
แต่ตอนนี้เป็นประเภทConscryptFileDescriptorSocket
หรือConscryptEngineSocket
ซึ่งทั้ง 2 รายการนี้ขยายOpenSSLSocketImpl
- ใช้
SSLSession
วิธีในการส่งIllegalArgumentException
เมื่อผ่านการอ้างอิง Null ตอนนี้ โยนNullPointerException
- RSA
KeyFactory
ไม่อนุญาตให้สร้างคีย์อีกต่อไป จากอาร์เรย์ไบต์ที่มีขนาดใหญ่กว่าคีย์ที่เข้ารหัส โทรหาgeneratePrivate()
และgeneratePublic()
ที่มีฟิลด์KeySpec
โดยที่โครงสร้างคีย์ไม่เติมเต็ม บัฟเฟอร์ทั้งหมดจะแสดงผลเป็นInvalidKeySpecException
- เมื่อซ็อคเก็ตที่ปิดไปขัดจังหวะการอ่านซ็อกเก็ต ระบบจะใช้ Conscrypt
เพื่อส่งคืน -1 จากการอ่าน บทความอ่านแล้วโยน
SocketException
- มีการเปลี่ยนแปลงชุดใบรับรอง CA ระดับรูท ซึ่งส่วนใหญ่จะเป็นการนำใบรับรอง จำนวนใบรับรองที่เลิกใช้แล้ว แต่ได้นำใบรับรองหลักออกสำหรับ WoSign และ StartCom สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ โปรดดู บล็อกโพสต์ด้านความปลอดภัย สุดท้าย ทำให้ไม่มีความน่าเชื่อถือในใบรับรอง WoSign และ StartCom