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 level pemula. 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 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 secara khusus dioptimalkan oleh developer untuk memberikan pengalaman terbaik bagi miliaran orang dengan membuat aplikasi untuk miliaran orang dengan pedoman.
Kami telah memperbarui panduan 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 bagi perangkat dengan RAM rendah adalah cara terbaik untuk mempersiapkan perangkat yang menjalankan Android Oreo (edisi Go). Ingatlah bahwa membuat aplikasi Anda lebih ringan dan lebih efisien akan menguntungkan seluruh 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 perangkat 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 masukkan 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. Selain itu, juga terdapat kelebihan metode untuk struktur non-virtual. Namun, struktur non-virtual biasanya tidak mengharuskan Anda
untuk secara eksplisit memberitahukan framework 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 apa 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 subclassnya,
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 kecepatan ini tidak akan dimasukkan dalam antrean dan akan hilang. Perubahan ini tidak memengaruhi aspek perilaku notifikasi lainnya dan pesan notifikasi masih diposting seperti yang diharapkan.
-
NotificationListenerService
danConditionProviderService
tidak didukung di perangkat Android dengan RAM rendah yang menampilkantrue
saatActivityManager.isLowRamDevice()
dipanggil.
Update EditText
Mulai level API 27, metode EditText.getText()
menampilkan Editable
; sebelumnya
metode ini menampilkan CharSequence
. Perubahan ini
kompatibel dengan versi sebelumnya, karena Editable
mengimplementasikan
CharSequence
.
Antarmuka Editable
menyediakan fungsi tambahan
yang berharga. Misalnya, karena Editable
juga
mengimplementasikan antarmuka Spannable
, Anda dapat menerapkan markup ke
konten dalam instance EditText
.
Tindakan Safe Browsing terprogram
Dengan menggunakan
implementasi 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—misalnya 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 melakukan inisialisasi Safe Browsing sebelum memanggil
metode loadUrl()
objek WebView
.
Cuplikan kode berikut menunjukkan cara menginstruksikan instance
WebView
aplikasi agar selalu kembali aman setelah menghadapi
ancaman yang diketahui:
<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(); } }
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 daripada getFrameAtTime()
yang dapat membuang-buang memori
karena menampilkan bitmap dengan resolusi yang sama dengan video sumber. Misalnya, frame dari video 4K akan berupa 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 dibaca dan ditulis. 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 (level API 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 hal berikut:
- Untuk membuat objek
WallpaperColors
menggunakan tiga warna, buat instance classWallpaperColors
dengan meneruskan warna primer, sekunder, dan tersier. Warna utama tidak boleh null. - Untuk membuat objek
WallpaperColors
dari bitmap, panggil metodefromBitmap()
dengan meneruskan sumber bitmap sebagai parameter. - Untuk membuat objek
WallpaperColors
dari drawable, panggil metodefromDrawable()
dengan meneruskan sumber drawable sebagai parameter.
Untuk mengambil detail warna primer, sekunder, atau tersier dari wallpaper, panggil metode berikut:
getPrimaryColor()
menampilkan warna wallpaper yang paling representatif secara visual.getSecondaryColor()
menampilkan warna wallpaper yang paling dominan kedua.- Metode
getTertiaryColor()
menampilkan warna wallpaper terbaik ketiga.
Untuk memberi tahu sistem tentang perubahan warna yang signifikan dalam wallpaper animasi Anda,
panggil metode
notifyColorsChanged()
. Metode ini memicu peristiwa siklus proses onComputeColors()
tempat Anda memiliki kesempatan untuk memberikan 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 telah mencoba terlalu sering untuk membuka kunci perangkat menggunakan pembaca sidik jari. -
FINGERPRINT_ERROR_VENDOR
– Terjadi error pada pembaca sidik jari khusus 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 sudah ada. Algoritma 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, gunakangetParameterSpec(GCMParameterSpec.class)
.- Banyak class Conscrypt internal yang terkait dengan TLS telah difaktorkan ulang. Karena
developer terkadang mengaksesnya secara reflektif, shims telah ditinggalkan untuk
mendukung penggunaan sebelumnya, tetapi beberapa detail telah berubah. Misalnya, soket
sebelumnya berjenis
OpenSSLSocketImpl
, tetapi sekarang berjenisConscryptFileDescriptorSocket
atauConscryptEngineSocket
, keduanya memperluasOpenSSLSocketImpl
. - Metode
SSLSession
yang digunakan untuk menampilkanIllegalArgumentException
saat menerima referensi null, sekarang akan menampilkanNullPointerException
. KeyFactory
RSA tidak lagi memungkinkan pembuatan kunci dari array byte yang lebih besar dari kunci yang dienkode. Panggilan kegeneratePrivate()
dangeneratePublic()
yang menyediakanKeySpec
dengan struktur kunci tidak mengisi seluruh buffer akan menghasilkanInvalidKeySpecException
.- Saat pembacaan soket terganggu oleh soket yang ditutup, Conscrypt akan digunakan untuk menampilkan -1 dari pembacaan. Pembacaan kini akan menampilkan
SocketException
. - Kumpulan sertifikat root CA telah diubah, sebagian besar berupa penghapusan sejumlah besar sertifikat yang sudah tidak digunakan, serta penghapusan root certificate untuk WoSign dan StartCom. Untuk mengetahui informasi selengkapnya tentang keputusan ini, lihat postingan Blog Keamanan Google, Penghapusan akhir kepercayaan dalam Sertifikat WoSign dan StartCom.