ฟีเจอร์และ API ของ Android 8.1

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เพื่อกลับสู่ความปลอดภัยเสมอหลังจากพบ ภัยคุกคามที่ทราบ:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.java

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!");
            }
        }
    });
}

MyWebViewClient.java

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