Bersama dengan fitur dan kemampuan baru, Android 6.0 (API level 23) menyertakan berbagai perubahan sistem dan perubahan perilaku API. Dokumen ini menyoroti beberapa perubahan utama yang harus Anda pahami dan perhitungkan dalam aplikasi Anda.
Jika sebelumnya Anda telah memublikasikan aplikasi untuk Android, perlu diketahui bahwa perubahan dalam platform ini akan memengaruhi aplikasi Anda.
Izin Waktu Proses
Rilis ini memperkenalkan model izin baru, yang memungkinkan pengguna mengelola izin aplikasi secara langsung saat runtime. Model ini memberi pengguna visibilitas dan kontrol yang lebih baik atas izin, sekaligus menyederhanakan proses penginstalan dan update otomatis untuk developer aplikasi. Pengguna bisa memberikan atau mencabut izin satu per satu untuk aplikasi yang telah dipasang.
Di aplikasi yang menargetkan Android 6.0 (API level 23) atau yang lebih tinggi, pastikan Anda memeriksa dan meminta
izin saat runtime. Untuk menentukan apakah aplikasi Anda telah diberi izin, panggil
metode checkSelfPermission()
baru. Untuk meminta izin, panggil metode
requestPermissions()
yang baru. Meskipun aplikasi Anda tidak menargetkan Android 6.0 (API level 23), Anda harus menguji aplikasi tersebut dengan
model izin yang baru.
Untuk mengetahui detail tentang mendukung model izin baru dalam aplikasi Anda, lihat Bekerja dengan Izin Sistem. Untuk tips tentang cara menilai dampak terhadap aplikasi, lihat Catatan Penggunaan Izin.
Istirahatkan dan Aplikasi Standby
Rilis ini memperkenalkan optimalisasi penghematan daya yang baru untuk perangkat yang dan aplikasi yang pasif. Fitur ini memengaruhi semua aplikasi, jadi pastikan untuk menguji aplikasi Anda dalam mode baru ini.
- Istirahatkan: Jika pengguna mencabut perangkat dan membiarkannya diam, dengan layar nonaktif, selama jangka waktu tertentu, perangkat akan masuk ke mode Istirahatkan, yang akan mencoba mempertahankan sistem dalam status tidur. Dalam mode ini, perangkat secara berkala melanjutkan operasi normal selama jangka waktu singkat sehingga sinkronisasi aplikasi dapat terjadi dan sistem dapat melakukan setiap operasi yang tertunda.
- Aplikasi Standby: Aplikasi Standby memungkinkan sistem menentukan apakah aplikasi dalam keadaan tidak ada aktivitas saat pengguna tidak menggunakannya secara aktif. Sistem menentukan hal ini saat pengguna tidak menyentuh aplikasi selama jangka waktu tertentu. Jika perangkat dicabut, sistem akan menonaktifkan akses jaringan dan menangguhkan sinkronisasi serta tugas untuk aplikasi yang dianggap tidak ada aktivitas.
Untuk mempelajari perubahan penghematan daya ini lebih lanjut, lihat Mengoptimalkan untuk Istirahatkan dan Aplikasi Standby.
Penghapusan Klien HTTP Apache
Rilis Android 6.0 membuang dukungan untuk klien HTTP Apache. Jika aplikasi Anda menggunakan klien ini dan
menargetkan Android 2.3 (API level 9) atau yang lebih tinggi, gunakan
class HttpURLConnection
. API ini lebih efisien karena mengurangi penggunaan jaringan melalui kompresi transparan
dan caching respons, serta meminimalkan konsumsi daya. Untuk terus menggunakan Apache HTTP API, Anda
harus terlebih dahulu mendeklarasikan dependensi waktu kompilasi berikut dalam file build.gradle
:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android beralih dari OpenSSL ke library BoringSSL. Jika Anda menggunakan Android NDK di aplikasi, jangan tautkan ke library kriptografis
yang bukan bagian dari API NDK, seperti libcrypto.so
dan libssl.so
. Library
ini bukan API publik, dan dapat berubah atau rusak tanpa pemberitahuan di seluruh rilis dan perangkat.
Selain itu, keamanan Anda bisa menjadi rentan. Sebagai gantinya, ubah
kode native Anda untuk memanggil API kriptografi Java melalui JNI atau menautkan secara statis dengan
library kriptografi pilihan Anda.
Akses ke Identifier Perangkat Keras
Untuk memberikan perlindungan data yang lebih baik kepada pengguna, mulai rilis ini, Android
menghapus akses terprogram ke ID hardware lokal perangkat untuk
aplikasi yang menggunakan Wi-Fi dan Bluetooth API. Metode
WifiInfo.getMacAddress()
dan
BluetoothAdapter.getAddress()
sekarang
menampilkan nilai konstanta 02:00:00:00:00:00
.
Untuk mengakses ID hardware perangkat eksternal di sekitar melalui pemindaian Bluetooth dan Wi-Fi,
aplikasi Anda kini harus memiliki izin ACCESS_FINE_LOCATION
atau
ACCESS_COARSE_LOCATION
:
Catatan: Saat perangkat yang menjalankan Android 6.0 (API level 23) memulai pemindaian Wi-Fi atau Bluetooth latar belakang, operasi tersebut akan terlihat oleh perangkat eksternal sebagai berasal dari alamat MAC yang diacak.
Notifikasi
Rilis ini menghapus metode Notification.setLatestEventInfo()
. Gunakan
class Notification.Builder
untuk membuat notifikasi. Untuk mengupdate
notifikasi berulang kali, gunakan kembali instance Notification.Builder
. Panggil metode build()
untuk mendapatkan instance Notification
yang diperbarui.
Perintah adb shell dumpsys notification
tidak lagi mencetak teks notifikasi Anda.
Sebagai gantinya, gunakan perintah adb shell dumpsys notification --noredact
untuk mencetak teks
dalam objek notifikasi.
Perubahan AudioManager
Menyetel volume secara langsung atau membisukan stream tertentu melalui class
AudioManager
tidak lagi didukung. Metode setStreamSolo()
tidak digunakan lagi, dan Anda harus memanggil
metode
requestAudioFocus()
sebagai gantinya. Demikian pula, metode setStreamMute()
tidak digunakan lagi; sebagai gantinya, panggil metode adjustStreamVolume()
dan teruskan nilai arah
ADJUST_MUTE
atau
ADJUST_UNMUTE
.
Pemilihan Teks
Saat pengguna memilih teks di aplikasi, Anda kini dapat menampilkan tindakan pemilihan teks seperti Potong, Salin, dan Tempel dalam toolbar mengambang. Implementasi interaksi pengguna serupa dengan yang diterapkan pada panel tindakan kontekstual, seperti yang dijelaskan dalam Mengaktifkan mode tindakan kontekstual untuk tampilan individual.
Untuk mengimplementasikan toolbar mengambang untuk pemilihan teks, buat perubahan berikut pada aplikasi yang sudah ada:
- Di objek
View
atauActivity
, ubah panggilanActionMode
daristartActionMode(Callback)
menjadistartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Gunakan penerapan
ActionMode.Callback
yang ada dan buat ekstensi tersebut memperluasActionMode.Callback2
. - Ganti
metode
onGetContentRect()
untuk memberikan koordinat objekRect
konten (seperti kotak pemilihan teks) dalam tampilan. - Jika pemosisian persegi panjang tidak lagi valid, dan ini satu-satunya elemen yang akan dibatalkan validasinya,
panggil metode
invalidateContentRect()
.
Jika Anda menggunakan
Android Support Library revisi 22.2, perhatikan bahwa toolbar mengambang tidak
kompatibel dengan versi sebelumnya dan appcompat mengambil alih kontrol objek ActionMode
secara
default. Ini mencegah bilah alat mengambang ditampilkan. Untuk mengaktifkan
dukungan ActionMode
dalam
AppCompatActivity
, panggil
getDelegate()
, lalu panggil
setHandleNativeActionModesEnabled()
pada objek AppCompatDelegate
yang ditampilkan dan setel parameter
input ke false
. Panggilan ini menampilkan kontrol objek ActionMode
ke
framework. Di perangkat yang menjalankan Android 6.0 (API level 23), yang memungkinkan framework untuk mendukung
mode ActionBar
atau toolbar mengambang, sedangkan di perangkat yang menjalankan
Android 5.1 (API level 22) atau yang lebih rendah, hanya mode ActionBar
yang didukung.
Perubahan Bookmark Browser
Rilis ini membuang dukungan untuk bookmark global. Metode
android.provider.Browser.getAllBookmarks()
dan android.provider.Browser.saveBookmark()
kini telah dihapus. Demikian pula, izin READ_HISTORY_BOOKMARKS
dan WRITE_HISTORY_BOOKMARKS
akan dihapus. Jika aplikasi Anda menargetkan Android 6.0 (API level 23) atau yang lebih baru, jangan akses
bookmark dari penyedia global atau menggunakan izin bookmark. Sebagai gantinya, aplikasi Anda harus menyimpan
data bookmark secara internal.
Perubahan Keystore Android
Dengan rilis ini, penyedia Android Keystore tidak lagi mendukung DSA. ECDSA masih didukung.
Kunci yang tidak memerlukan enkripsi dalam penyimpanan tidak akan lagi dihapus saat layar kunci aman dinonaktifkan atau direset (misalnya, oleh pengguna atau Administrator Perangkat). Kunci yang memerlukan enkripsi saat disimpan akan dihapus selama peristiwa ini.
Perubahan Wi-Fi dan Jaringan
Rilis ini memperkenalkan perubahan perilaku berikut pada API Wi-Fi dan jaringan.
- Aplikasi Anda sekarang dapat mengubah status objek
WifiConfiguration
hanya jika Anda yang membuat objek ini. Anda tidak diizinkan mengubah atau menghapus objekWifiConfiguration
yang dibuat oleh pengguna atau aplikasi lain. -
Sebelumnya, jika aplikasi memaksa perangkat untuk terhubung ke jaringan Wi-Fi tertentu menggunakan
enableNetwork()
dengan setelandisableAllOthers=true
, perangkat akan terputus dari jaringan lain seperti data seluler. Dalam rilis ini, perangkat tidak lagi memutus koneksi dari jaringan lain seperti itu. JikatargetSdkVersion
aplikasi Anda adalah“20”
atau lebih rendah, aplikasi akan disematkan ke jaringan Wi-Fi yang dipilih. JikatargetSdkVersion
aplikasi Anda adalah“21”
atau yang lebih tinggi, gunakan API multijaringan (sepertiopenConnection()
,bindSocket()
, dan metodebindProcessToNetwork()
baru) untuk memastikan bahwa traffic jaringannya dikirim pada jaringan yang dipilih.
Perubahan Layanan Kamera
Dalam rilis ini, model untuk mengakses resource bersama dalam layanan kamera telah diubah dari model akses “siapa cepat dia dapat” yang sebelumnya menjadi model akses yang mendahulukan proses berprioritas tinggi. Perubahan pada perilaku layanan mencakup:
- Akses ke resource subsistem kamera, termasuk membuka dan mengonfigurasi perangkat kamera, diberikan berdasarkan "prioritas" proses aplikasi klien. Proses aplikasi dengan aktivitas yang terlihat oleh pengguna atau latar depan umumnya diberi prioritas lebih tinggi, sehingga akuisisi dan penggunaan resource kamera lebih dapat diandalkan.
- Klien kamera aktif untuk aplikasi berprioritas lebih rendah dapat "dikeluarkan" saat aplikasi dengan prioritas
lebih tinggi mencoba menggunakan kamera. Dalam
Camera
API yang tidak digunakan lagi, hal ini menyebabkanonError()
dipanggil untuk klien yang dikeluarkan. DalamCamera2
API, hal ini menyebabkanonDisconnected()
dipanggil untuk klien yang dikeluarkan. - Pada perangkat dengan hardware kamera yang sesuai, proses aplikasi terpisah dapat membuka dan menggunakan perangkat kamera terpisah secara independen secara independen. Namun, dalam kasus penggunaan multiproses, dengan akses simultan menyebabkan penurunan performa atau kemampuan yang signifikan pada perangkat kamera yang terbuka, perangkat tersebut kini terdeteksi dan tidak diizinkan oleh layanan kamera. Perubahan ini dapat mengakibatkan "pengeluaran" klien dengan prioritas lebih rendah meskipun tidak ada aplikasi lain yang secara langsung mencoba mengakses perangkat kamera yang sama.
- Mengubah pengguna saat ini menyebabkan klien kamera aktif di aplikasi yang dimiliki oleh akun pengguna sebelumnya dikeluarkan. Akses ke kamera dibatasi pada profil pengguna yang dimiliki oleh pengguna perangkat saat ini. Dalam praktiknya, ini berarti bahwa akun "Tamu", misalnya, tidak akan dapat meninggalkan proses yang sedang berjalan yang menggunakan subsistem kamera saat pengguna beralih ke akun lain.
Runtime
Runtime ART kini mengimplementasikan aturan akses dengan benar untuk
metode newInstance()
. Perubahan
ini memperbaiki masalah saat Dalvik salah memeriksa aturan akses dalam versi sebelumnya.
Jika aplikasi Anda menggunakan
metode newInstance()
dan Anda
ingin mengganti pemeriksaan akses, panggil
metode setAccessible()
dengan parameter
input yang disetel ke true
. Jika aplikasi Anda menggunakan
library appcompat v7 atau
library reverse v7,
Anda harus mengupdate aplikasi agar digunakan ke versi terbaru library ini. Jika tidak, pastikan
setiap class kustom yang dirujuk dari XML telah diupdate sehingga konstruktor class-nya dapat diakses.
Rilis ini memperbarui perilaku linker dinamis. Linker dinamis kini memahami perbedaan antara soname
library dan jalurnya (
bug publik 6670), dan penelusuran menurut soname
sekarang diimplementasikan. Aplikasi yang sebelumnya berfungsi dan memiliki entri DT_NEEDED
yang buruk
(biasanya jalur absolut pada sistem file mesin build) mungkin gagal saat dimuat.
Flag dlopen(3) RTLD_LOCAL
sekarang diimplementasikan dengan benar. Perlu diperhatikan bahwa
RTLD_LOCAL
adalah default, sehingga panggilan ke dlopen(3)
yang tidak menggunakan
RTLD_LOCAL
secara eksplisit akan terpengaruh (kecuali aplikasi Anda secara eksplisit menggunakan RTLD_GLOBAL
). Dengan
RTLD_LOCAL
, simbol tidak akan tersedia untuk library yang dimuat oleh panggilan berikutnya ke
dlopen(3)
(bukan direferensikan oleh entri DT_NEEDED
).
Pada versi Android sebelumnya, jika aplikasi Anda meminta sistem untuk memuat library bersama dengan
relokasi teks, sistem akan menampilkan peringatan, tetapi masih mengizinkan library untuk dimuat.
Mulai rilis ini, sistem akan menolak library ini jika versi SDK target aplikasi Anda adalah 23
atau yang lebih tinggi. Untuk membantu mendeteksi apakah library gagal dimuat, aplikasi Anda harus mencatat
kegagalan dlopen(3)
ke dalam log, dan menyertakan teks deskripsi masalah yang ditampilkan oleh panggilan
dlerror(3)
. Untuk mempelajari lebih lanjut cara menangani relokasi teks, lihat
panduan ini.
Validasi APK
Platform ini sekarang menjalankan validasi APK yang lebih ketat. APK dianggap rusak jika file dideklarasikan dalam manifes tetapi tidak ada dalam APK itu sendiri. APK harus ditandatangani ulang jika salah satu konten ini dihapus.
Koneksi USB
Koneksi perangkat melalui porta USB sekarang secara default disetel ke mode hanya-mengisi. Untuk mengakses perangkat dan kontennya melalui koneksi USB, pengguna harus secara eksplisit memberikan izin untuk interaksi tersebut. Jika aplikasi Anda mendukung interaksi pengguna dengan perangkat melalui port USB, pertimbangkan bahwa interaksi harus diaktifkan secara eksplisit.
Perubahan Android for Work
Rilis ini menyertakan perubahan perilaku berikut untuk Android for Work:
- Kontak kerja dalam konteks pribadi. Log Panggilan
Google Dialer sekarang menampilkan kontak kerja bila pengguna melihat panggilan sebelumnya.
Menyetel
setCrossProfileCallerIdDisabled()
ketrue
akan menyembunyikan kontak profil kerja di Log Panggilan Google Dialer. Kontak kerja dapat ditampilkan bersama kontak pribadi ke perangkat melalui Bluetooth hanya jika Anda menetapkansetBluetoothContactSharingDisabled()
kefalse
. Secara default, parameter ini disetel ketrue
. - Penghapusan konfigurasi Wi-Fi: Konfigurasi Wi-Fi yang ditambahkan oleh Pemilik Profil
(misalnya, melalui panggilan ke
metode
addNetwork()
) kini dihapus jika profil kerja tersebut dihapus. - Kunci total konfigurasi Wi-Fi: Semua konfigurasi Wi-Fi yang dibuat oleh
Pemilik Perangkat yang aktif tidak dapat lagi diubah atau dihapus oleh pengguna jika
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
bukan nol. Pengguna tetap bisa membuat dan memodifikasi konfigurasi Wi-Fi-nya sendiri. Pemilik Perangkat Aktif memiliki hak istimewa untuk mengedit atau menghapus konfigurasi Wi-Fi apa pun, termasuk yang tidak dibuat oleh mereka. - Download pengontrol kebijakan perangkat melalui tambahan Akun Google: Saat Akun Google yang memerlukan pengelolaan melalui aplikasi pengontrol kebijakan perangkat (DPC) ditambahkan ke perangkat di luar konteks terkelola, alur tambahkan akun kini meminta pengguna untuk menginstal WPC yang sesuai. Perilaku ini juga berlaku untuk akun yang ditambahkan melalui Setelan > Akun dan di wizard penyiapan perangkat awal.
- Perubahan pada perilaku API
DevicePolicyManager
tertentu:- Memanggil
metode
setCameraDisabled()
akan memengaruhi kamera untuk pengguna yang melakukan panggilan saja; memanggilnya dari profil terkelola tidak memengaruhi aplikasi kamera yang berjalan pada pengguna utama. - Selain itu, metode
setKeyguardDisabledFeatures()
kini tersedia untuk Pemilik Profil, serta Pemilik Perangkat. - Pemilik Profil dapat menetapkan pembatasan keyguard berikut:
KEYGUARD_DISABLE_TRUST_AGENTS
danKEYGUARD_DISABLE_FINGERPRINT
, yang memengaruhi setelan keyguard untuk pengguna induk profil.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, yang hanya memengaruhi notifikasi yang dihasilkan oleh aplikasi di profil terkelola.
- Metode
DevicePolicyManager.createAndInitializeUser()
danDevicePolicyManager.createUser()
tidak digunakan lagi. - Metode
setScreenCaptureDisabled()
kini juga memblokir struktur bantuan saat aplikasi pengguna tertentu ada di latar depan. EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
kini ditetapkan secara default ke SHA-256. SHA-1 masih didukung untuk kompatibilitas mundur, tetapi akan dihapus pada masa mendatang.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
kini hanya menerima SHA-256.- API yang melakukan inisialiasi perangkat di Android 6.0 (API level 23) sekarang telah dibuang.
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
dihapus sehingga penyediaan NFC bump secara terprogram tidak dapat membuka kunci perangkat yang dilindungi oleh reset ke setelan pabrik.- Anda kini dapat menggunakan tambahan
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
untuk meneruskan data ke aplikasi pemilik perangkat selama penyediaan NFC untuk perangkat terkelola. - API Android for Work dioptimalkan untuk izin runtime M, termasuk profil Kerja,
lapisan bantuan, dan lainnya. API izin
DevicePolicyManager
baru tidak memengaruhi aplikasi pra-M. - Saat pengguna keluar dari bagian sinkron alur penyiapan yang dimulai melalui
intent
ACTION_PROVISION_MANAGED_PROFILE
atauACTION_PROVISION_MANAGED_DEVICE
, sistem kini menampilkan kode hasilRESULT_CANCELED
.
- Memanggil
metode
- Perubahan pada API lain:
- Penggunaan Data: Class
android.app.usage.NetworkUsageStats
telah diganti namanya menjadiNetworkStats
.
- Penggunaan Data: Class
- Perubahan pada setelan global:
- Setelan ini tidak dapat lagi disetel melalui
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Setelan global ini sekarang dapat disetel melalui
setGlobalSettings()
:
- Setelan ini tidak dapat lagi disetel melalui