Fitur dan API Android 8.1

Android 8.1 (API level 27) memperkenalkan berbagai fitur dan kemampuan baru bagi pengguna dan developer. Dokumen ini merangkum apa saja yang baru untuk developer.

Android Oreo (Go edition)

Android Go adalah inisiatif kami untuk mengoptimalkan pengalaman Android bagi miliaran orang yang akan online di seluruh dunia. Mulai Android 8.1, kami menjadikan Android sebagai platform yang hebat untuk perangkat entry-level. Fitur dalam konfigurasi Android Oreo (edisi Go) meliputi:

  • Pengoptimalan memori. Peningkatan penggunaan memori di seluruh platform untuk memastikan aplikasi dapat berjalan secara efisien pada perangkat dengan RAM 1 GB atau kurang.
  • Opsi penargetan yang fleksibel. Konstanta fitur hardware baru untuk memungkinkan Anda menargetkan distribusi aplikasi ke perangkat normal atau dengan RAM rendah melalui Google Play.
  • Google Play.Meskipun semua aplikasi akan tersedia di perangkat yang menjalankan Android Oreo (edisi Go), Google Play akan memberikan visibilitas ke aplikasi yang dioptimalkan secara khusus oleh developer untuk memberikan pengalaman yang luar biasa bagi miliaran orang dengan pedoman membuat aplikasi.

Kami telah memperbarui pedoman membuat aplikasi untuk miliaran pengguna dengan panduan tambahan tentang cara mengoptimalkan aplikasi Anda untuk perangkat yang menjalankan Android Oreo (edisi Go). Bagi sebagian besar developer, mengoptimalkan APK yang sudah ada atau menggunakan fitur Multi-APK Google Play untuk menargetkan versi APK ke perangkat dengan RAM rendah adalah cara terbaik untuk mempersiapkan perangkat yang menjalankan Android Oreo (edisi Go). Perlu diingat bahwa membuat aplikasi Anda lebih ringan dan lebih efisien akan menguntungkan semua audiens, apa pun perangkatnya.

Neural Networks API

Neural Networks API menyediakan komputasi dan inferensi yang dipercepat untuk framework machine learning di perangkat seperti TensorFlow Lite, library ML lintas platform Google untuk seluler, serta Caffe2, dan lainnya. Kunjungi repo open source TensorFlow Lite untuk mendownload dan melihat dokumen. TensorFlow Lite dapat digunakan dengan Neural Networks API untuk menjalankan model seperti MobileNets, Inception v3, dan Smart Reply secara efisien di perangkat seluler Anda.

Update framework IsiOtomatis

Android 8.1 (API level 27) menyediakan beberapa peningkatan pada Framework Isi Otomatis yang dapat Anda gabungkan ke dalam aplikasi.

Class BaseAdapter kini menyertakan metode setAutofillOptions(), yang memungkinkan Anda memberikan representasi string dari nilai-nilai dalam adaptor. Hal ini berguna untuk kontrol spinner yang secara dinamis menghasilkan nilai dalam adaptornya. Misalnya, Anda dapat menggunakan metode setAutofillOptions() untuk memberikan representasi string dari daftar tahun yang dapat dipilih pengguna sebagai bagian dari tanggal habis masa berlaku kartu kredit. Layanan isi otomatis dapat menggunakan representasi string untuk mengisi tampilan yang memerlukan data dengan tepat.

Selain itu, class AutofillManager menyertakan metode notifyViewVisibilityChanged(View, int, boolean) yang dapat Anda panggil untuk memberi tahu framework tentang perubahan visibilitas tampilan dalam struktur virtual. Ada juga kelebihan metode untuk struktur non-virtual. Namun, struktur non-virtual biasanya tidak mengharuskan Anda memberi tahu framework secara eksplisit karena metode tersebut telah dipanggil oleh class View.

Android 8.1 juga memberi Layanan Isi Otomatis lebih banyak kemampuan untuk menyesuaikan kemampuan UI penyimpanan dengan menambahkan dukungan untuk CustomDescription and Validator dalam SaveInfo.

Deskripsi kustom berguna untuk membantu layanan isi otomatis mengklarifikasi informasi yang disimpan; misalnya, saat layar berisi kartu kredit, layar dapat menampilkan logo bank kartu kredit, empat digit terakhir nomor kartu kredit, dan nomor habis masa berlakunya. Untuk mempelajari lebih lanjut, lihat class CustomDescription.

Objek Validator digunakan agar tidak menampilkan UI penyimpanan isi otomatis saat kondisi Validator tidak terpenuhi. Untuk mempelajari lebih lanjut, lihat class Validator bersama subclass-nya, LuhnChecksumValidator dan RegexValidator.

Notifikasi

Android 8.1 mencakup perubahan notifikasi berikut:

  • Aplikasi saat ini hanya dapat membuat suara peringatan notifikasi sekali per detik. Suara notifikasi yang melebihi tingkat ini tidak akan diantrekan dan akan hilang. Perubahan ini tidak memengaruhi aspek perilaku notifikasi lainnya dan pesan notifikasi masih dikirim seperti yang diharapkan.
  • NotificationListenerService dan ConditionProviderService tidak didukung di perangkat yang menjalankan Android dengan RAM rendah yang menampilkan true saat ActivityManager.isLowRamDevice() dipanggil.

Update EditText

Mulai API level 27, metode EditText.getText() akan menampilkan Editable; sebelumnya metode ini menampilkan CharSequence. Perubahan ini kompatibel dengan versi sebelumnya, karena Editable menerapkan CharSequence.

Antarmuka Editable menyediakan fungsi tambahan yang sangat berguna. Misalnya, karena Editable juga mengimplementasikan antarmuka Spannable, Anda dapat menerapkan markup ke konten dalam instance EditText.

Tindakan Safe Browsing terprogram

Dengan menggunakan penerapan WebView dari Safe Browsing API, aplikasi Anda dapat mendeteksi saat instance WebView mencoba membuka URL yang telah diklasifikasikan Google sebagai ancaman yang diketahui. Secara default, WebView menampilkan interstisial yang memperingatkan pengguna tentang ancaman yang diketahui. Layar ini memberi pengguna opsi untuk tetap memuat URL atau kembali ke halaman sebelumnya yang aman.

Di Android 8.1, Anda dapat menentukan secara terprogram cara aplikasi merespons ancaman yang diketahui:

  • Anda dapat mengontrol apakah aplikasi akan melaporkan ancaman yang diketahui ke Safe Browsing.
  • Anda dapat mengatur agar aplikasi otomatis melakukan tindakan tertentu—seperti kembali ke halaman yang aman—setiap kali menemukan URL yang diklasifikasikan oleh Safe Browsing sebagai ancaman yang diketahui.

Catatan: Untuk perlindungan optimal terhadap ancaman yang diketahui, tunggu hingga Anda telah menginisialisasi Safe Browsing sebelum memanggil metode loadUrl() objek WebView.

Cuplikan kode berikut menunjukkan cara menginstruksikan instance WebView aplikasi Anda untuk selalu kembali ke halaman aman setelah menghadapi ancaman yang diketahui:

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();
    }
}

Ekstraktor thumbnail video

Class MediaMetadataRetriever memiliki metode baru, getScaledFrameAtTime(), yang menemukan frame di dekat posisi waktu tertentu dan menampilkan bitmap dengan rasio aspek yang sama dengan frame sumber, tetapi diskalakan agar sesuai dengan persegi panjang dengan lebar dan tinggi yang ditentukan. Hal ini berguna untuk membuat gambar thumbnail dari video.

Sebaiknya gunakan metode ini, bukan getFrameAtTime(), yang dapat membuang-buang memori karena metode ini menampilkan bitmap dengan resolusi yang sama dengan video sumber. Misalnya, frame dari video 4K akan menjadi bitmap 16 MB, jauh lebih besar daripada yang Anda butuhkan untuk gambar thumbnail.

Shared memory API

Android 8.1 (API level 27) memperkenalkan SharedMemory API baru. Class ini memungkinkan Anda membuat, memetakan, dan mengelola instance SharedMemory anonim. Anda menetapkan perlindungan memori pada objek SharedMemory untuk membaca dan/atau menulis, dan, karena objek SharedMemory bersifat Parcelable, Anda dapat dengan mudah meneruskannya ke proses lain melalui AIDL.

SharedMemory API memiliki interoperabilitas dengan fasilitas ASharedMemory di NDK. ASharedMemory memberikan akses ke deskriptor file, yang kemudian dapat dipetakan untuk membaca dan menulis. Ini adalah cara yang bagus untuk berbagi data dalam jumlah besar antar-aplikasi atau antara beberapa proses dalam satu aplikasi.

WallpaperColors API

Android 8.1 (API level 27) memungkinkan wallpaper animasi memberikan informasi warna ke UI sistem. Anda melakukannya dengan membuat objek WallpaperColors dari bitmap, drawable, atau dengan menggunakan tiga warna yang dipilih secara manual. Anda juga dapat mengambil informasi warna ini.

Untuk membuat objek WallpaperColors, lakukan salah satu cara berikut:

  • Untuk membuat objek WallpaperColors menggunakan tiga warna, buat instance class WallpaperColors dengan meneruskan warna primer, sekunder, dan tersier. Warna primer tidak boleh null.
  • Untuk membuat objek WallpaperColors dari bitmap, panggil metode fromBitmap() dengan meneruskan sumber bitmap sebagai parameter.
  • Untuk membuat objek WallpaperColors dari drawable, panggil metode fromDrawable() dengan meneruskan sumber drawable sebagai parameter.

Untuk mengambil detail warna primer, sekunder, atau tersier dari wallpaper, panggil metode berikut:

Untuk memberi tahu sistem tentang perubahan warna yang signifikan dalam wallpaper animasi, panggil metode notifyColorsChanged(). Metode ini memicu peristiwa siklus proses onComputeColors() tempat Anda memiliki kesempatan untuk menyediakan objek WallpaperColors baru.

Untuk menambahkan pemroses bagi perubahan warna, Anda dapat memanggil metode addOnColorsChangedListener(). Anda juga dapat memanggil metode getWallpaperColors() untuk mengambil warna primer wallpaper.

Pembaruan sidik jari

Class FingerprintManager telah memperkenalkan kode error berikut:

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – Pengguna sudah terlalu sering mencoba untuk membuka kunci perangkat menggunakan pembaca sidik jari.
  • FINGERPRINT_ERROR_VENDOR – Terjadi error pada pembaca sidik jari spesifik per vendor.

Pembaruan kriptografi

Sejumlah perubahan kriptografi telah dilakukan dengan Android 8.1:

  • Algoritme baru telah diimplementasikan di Conscrypt. Implementasi Conscrypt lebih disukai daripada implementasi Bouncy Castle yang ada. Algoritme baru mencakup:
    • 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) tidak lagi berfungsi untuk algoritma yang menggunakan GCM. Sebagai gantinya, gunakan getParameterSpec(GCMParameterSpec.class).
  • Banyak class Conscrypt internal yang terkait dengan TLS telah difaktorkan ulang. Karena developer terkadang mengaksesnya secara reflektif, shim telah dibiarkan untuk mendukung penggunaan sebelumnya, tetapi beberapa detail telah berubah. Misalnya, soket sebelumnya berjenis OpenSSLSocketImpl, tetapi sekarang berjenis ConscryptFileDescriptorSocket atau ConscryptEngineSocket, yang keduanya memperluas OpenSSLSocketImpl.
  • Metode SSLSession digunakan untuk menampilkan IllegalArgumentException saat diteruskan ke referensi null, metode tersebut kini menampilkan NullPointerException.
  • RSA KeyFactory tidak lagi mengizinkan pembuatan kunci dari array byte yang lebih besar dari kunci yang dienkode. Panggilan ke generatePrivate() dan generatePublic() yang menyediakan KeySpec ketika struktur kunci tidak mengisi seluruh buffering akan menghasilkan InvalidKeySpecException.
  • Ketika pembacaan soket terganggu oleh soket yang ditutup, Conscrypt akan digunakan untuk menampilkan -1 dari pembacaan. Tindakan baca sekarang akan menampilkan SocketException.
  • Kumpulan sertifikat root CA telah diubah, terutama menghapus sejumlah besar sertifikat yang sudah tidak digunakan, serta menghapus root certificate untuk WoSign dan StartCom. Untuk informasi selengkapnya tentang keputusan ini, lihat postingan Blog Keamanan Google, Penghapusan akhir kepercayaan dalam Sertifikat WoSign dan StartCom.