Android 8.1 (API level 27) memperkenalkan berbagai fitur dan kemampuan baru bagi pengguna dan pengembang. Dokumen ini merangkum apa saja yang baru untuk developer.
Android Oreo (Go edition)
Android Go adalah inisiatif kami untuk mengoptimalkan pengalaman Android bagi miliaran pengguna online di seluruh dunia. Mulai Android 8.1, kami menjadikan Android sebagai platform yang bagus untuk perangkat entry-level. Fitur di Android Oreo Konfigurasi (edisi Go) mencakup:
- Pengoptimalan memori. Peningkatan penggunaan memori di seluruh platform untuk memastikan aplikasi tersebut dapat berjalan secara efisien pada perangkat dengan RAM 1 GB atau kurang.
- Opsi penargetan fleksibel. Baru fitur hardware agar Anda dapat menargetkan distribusi aplikasi ke perangkat normal atau dengan RAM rendah melalui di 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 luar biasa bagi miliaran orang dengan membangun untuk miliaran panduan.
Kami telah mengupdate platform bagi miliaran pengguna yang berisi panduan tambahan tentang cara mengoptimalkan aplikasi untuk perangkat yang menjalankan Android Oreo (edisi Go). Bagi sebagian besar developer, mengoptimalkan APK yang ada atau menggunakan Google Play Fitur multi-APK untuk menargetkan versi APK ke perangkat dengan RAM rendah adalah cara terbaik mempersiapkan perangkat yang menjalankan Android Oreo (edisi Go). Ingatlah bahwa menjadikan aplikasi lebih ringan dan lebih efisien akan menguntungkan seluruh audiens Anda, apa pun perangkatnya.
Neural Networks API
Neural Networks API menyediakan komputasi dan inferensi yang dipercepat untuk mesin di perangkat pembelajaran seperti TensorFlow Lite—Library ML lintas platform Google untuk perangkat seluler— serta Caffe2 dan lainnya. Kunjungi TensorFlow Lite sumber terbuka untuk download dan 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 fitur Framework yang dapat Anda masukkan ke dalam aplikasi.
BaseAdapter
kini menyertakan setAutofillOptions()
, yang memungkinkan Anda untuk memberikan representasi string dari nilai-nilai dalam
{i>adaptor<i}. Ini berguna untuk spinner
yang secara dinamis menghasilkan nilai dalam adaptor mereka. Misalnya,
Anda dapat menggunakan metode setAutofillOptions()
untuk menyediakan string
representasi dari daftar tahun yang dapat dipilih pengguna sebagai bagian dari
tanggal kedaluwarsa kartu kredit. Layanan isi otomatis dapat menggunakan representasi string
untuk mengisi tampilan yang memerlukan data dengan tepat.
Selain itu, AutofillManager
menyertakan metode notifyViewVisibilityChanged(View, int, boolean)
yang dapat Anda panggil untuk memberi tahu kerangka
kerja tentang perubahan visibilitas
dalam struktur virtual. Ada juga kelebihan metode untuk model
dan struktur virtual. Namun, struktur non-virtual biasanya tidak mengharuskan Anda untuk
secara eksplisit memberi tahu kerangka kerja karena metode tersebut telah dipanggil oleh
View
.
Android 8.1 juga memberikan Layanan Isi Otomatis lebih banyak kemampuan untuk menyesuaikan UI yang disimpan
kemampuan dengan menambahkan dukungan untuk CustomDescription
and
Validator
dalam SaveInfo
.
Deskripsi kustom berguna untuk membantu layanan isi otomatis menjelaskan apa yang
disimpan; misalnya, ketika layar berisi
kartu kredit, mungkin
menampilkan logo bank kartu kredit, empat digit terakhir kartu kredit
dan nomor kedaluwarsanya. Untuk mempelajari lebih lanjut, lihat
CustomDescription
.
Validator
digunakan agar tidak menampilkan UI penyimpanan isi otomatis saat Validator
kondisi tersebut tidak terpenuhi. Untuk mempelajari lebih lanjut, lihat
Validator beserta 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 batas ini tarif tidak diantrekan dan hilang. Perubahan ini tidak memengaruhi aspek notifikasi lainnya perilaku dan pesan notifikasi masih diposting seperti yang diharapkan.
-
NotificationListenerService
danConditionProviderService
tidak didukung di RAM rendah Perangkat Android yang menampilkantrue
saatActivityManager.isLowRamDevice()
dipanggil.
Update EditText
Mulai dari level API 27, metode EditText.getText()
akan menampilkan Editable
; sebelumnya
menghasilkan CharSequence
. Perubahan ini
kompatibel dengan versi sebelumnya, karena Editable
mengimplementasikan
CharSequence
.
Antarmuka Editable
memberikan informasi tambahan yang berguna
fungsionalitasnya. Misalnya, karena Editable
juga
mengimplementasikan antarmuka Spannable
, Anda dapat menerapkan markup ke
konten dalam instance EditText
.
Tindakan Safe Browsing terprogram
Dengan menggunakan
WebView
untuk Safe Browsing API, aplikasi Anda dapat
deteksi saat instance WebView
mencoba menavigasi
ke 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 bisa mendefinisikan secara terprogram bagaimana aplikasi merespons ancaman yang diketahui:
- Anda dapat mengontrol apakah aplikasi Anda melaporkan ancaman yang diketahui ke tab Menjelajah.
- Anda bisa mengatur agar aplikasi secara otomatis melakukan tindakan tertentu—seperti kembali agar aman—setiap kali browser menemukan URL yang dikirim oleh Safe Browsing diklasifikasikan sebagai ancaman yang telah diketahui.
Catatan: Untuk perlindungan optimal terhadap ancaman yang diketahui, tunggu
hingga Anda menginisialisasi Safe Browsing sebelum memanggil
metode loadUrl()
objek WebView
.
Cuplikan kode berikut menunjukkan bagaimana Anda dapat menginstruksikan instance aplikasi
WebView
untuk selalu kembali agar aman setelah bertemu dengan
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 aspek yang sama
sebagai {i>frame<i} sumber, tetapi diskalakan agar sesuai dengan
persegi panjang dengan lebar yang ditentukan dan
tinggi. Hal ini berguna untuk membuat gambar thumbnail dari video.
Sebaiknya gunakan metode ini, bukan getFrameAtTime()
, yang dapat membuang-buang memori
karena menghasilkan bitmap yang memiliki resolusi yang sama dengan video sumber. Sebagai
Misalnya, bingkai dari video 4K akan menjadi
bitmap 16 MB, jauh lebih besar dari
butuhkan untuk gambar {i>thumbnail<i}.
Shared memory API
Android 8.1 (API level 27) memperkenalkan
SharedMemory
Compute Engine API. Class ini memungkinkan Anda membuat, memetakan, dan mengelola project
SharedMemory
di instance Compute Engine. Anda menyetel perlindungan memori
pada
SharedMemory
untuk membaca dan/atau menulis, dan, karena
SharedMemory
bersifat Parcelable, Anda bisa dengan mudah meneruskannya ke proses lain melalui AIDL.
SharedMemory
API memiliki interoperabilitas dengan
ASharedMemory
di NDK.
ASharedMemory
memberikan akses
ke deskriptor file, yang kemudian
dipetakan untuk membaca dan menulis. Enak sekali
cara membagikan data dalam jumlah besar
data antar-aplikasi atau antara beberapa proses dalam satu aplikasi.
WallpaperColors API
Android 8.1 (API level 27) memungkinkan wallpaper animasi memberikan warna
informasi ke UI sistem. Untuk melakukannya, Anda dapat membuat WallpaperColors
dari bitmap, drawable, atau dengan menggunakan tiga warna yang dipilih secara manual.
Anda juga dapat mengambil informasi warna ini.
Untuk membuat WallpaperColors
, lakukan salah satu tindakan berikut:
- Untuk membuat
WallpaperColors
dengan menggunakan tiga warna, buat instanceWallpaperColors
dengan meneruskan warna primer, sekunder, dan tersier. Utama warna tidak boleh null. - Untuk membuat
WallpaperColors
dari bitmap, panggil metodefromBitmap()
dengan meneruskan sumber bitmap sebagai parameter. - Untuk membuat
WallpaperColors
dari drawable, panggilfromDrawable()
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 terbaik kedua.getTertiaryColor()
menampilkan warna wallpaper terbaik ketiga.
Untuk memberi tahu sistem tentang perubahan
warna yang signifikan dalam wallpaper animasi Anda,
panggil notifyColorsChanged()
. Metode ini memicu siklus proses onComputeColors()
acara yang memberi Anda kesempatan untuk menyediakan WallpaperColors
baru
.
Untuk menambahkan pemroses bagi perubahan warna, Anda dapat memanggil metode addOnColorsChangedListener()
. Anda dapat
panggil juga metode getWallpaperColors()
untuk mengambil warna primer wallpaper.
Pembaruan sidik jari
Class FingerprintManager
memiliki
memasukkan kode {i>error<i} berikut:
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– Pengguna telah mencoba berkali-kali untuk membuka kunci perangkat mereka menggunakan pembaca sidik jari. -
FINGERPRINT_ERROR_VENDOR
– Sidik jari khusus vendor terjadi error pembaca.
Pembaruan kriptografi
Sejumlah perubahan kriptografi telah dilakukan dengan Android 8.1:
- Algoritme baru telah diimplementasikan di Conscrypt. Conscrypt
penerapannya lebih disukai daripada Bouncy Castle yang sudah ada
terlepas dari implementasi layanan. 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 bekerja untuk algoritma yang menggunakan GCM. Sebagai gantinya, gunakangetParameterSpec(GCMParameterSpec.class)
.- Banyak class Conscrypt internal yang terkait dengan TLS telah difaktorkan ulang. Sejak
pengembang kadang-kadang mengaksesnya secara reflektif, {i>shim<i} telah ditinggalkan untuk
mendukung penggunaan sebelumnya, tetapi beberapa detail telah berubah. Misalnya, soket
sebelumnya berjenis
OpenSSLSocketImpl
, tetapi sekarang sudah berjenisConscryptFileDescriptorSocket
atauConscryptEngineSocket
, yang keduanya memperluasOpenSSLSocketImpl
. SSLSession
metode digunakan untuk menampilkanIllegalArgumentException
saat meneruskan referensi null, kini model tersebut tampilkanNullPointerException
.- RSA
KeyFactory
tidak lagi mengizinkan pembuatan kunci dari array byte yang lebih besar dari kunci yang dienkode. Panggilan kegeneratePrivate()
dangeneratePublic()
yang menyediakanKeySpec
di mana struktur kunci tidak mengisi seluruh buffer akan menghasilkanInvalidKeySpecException
. - Ketika pembacaan soket terganggu oleh soket yang ditutup, Conscrypt menggunakan
untuk mengembalikan -1 dari operasi baca. Pembacaan sekarang menampilkan
SocketException
. - Rangkaian sertifikat CA {i>root<i} telah diubah, sebagian besar menghapus jumlah sertifikat yang sudah tidak berlaku, tetapi juga menghapus sertifikat {i>root<i} untuk WoSign dan StartCom. Untuk mengetahui informasi selengkapnya tentang keputusan ini, lihat Postingan Blog Keamanan, Akhir penghapusan kepercayaan pada Sertifikat WoSign dan StartCom.