Bersama fitur dan kemampuan baru, Android 6.0 (API level 23) menyertakan berbagai macam perubahan sistem dan perubahan perilaku API. Dokumen ini menyoroti beberapa perubahan utama yang harus dipahami dan diperhitungkan dalam aplikasi Anda.
Jika Anda sebelumnya telah mempublikasikan aplikasi untuk Android, ketahuilah bahwa perubahan ini dalam platform akan memengaruhi aplikasi Anda.
Izin Waktu Proses
Rilis ini memperkenalkan model izin baru, di mana pengguna sekarang bisa mengelola secara langsung izin aplikasi pada waktu proses. Model ini memberikan visibilitas dan kontrol yang ditingkatkan kepada pengguna atas izin, sekaligus menyederhanakan proses pemasangan dan pembaruan otomatis bagi developer aplikasi. Pengguna bisa memberikan atau mencabut izin satu per satu untuk aplikasi yang telah dipasang.
Pada aplikasi Anda yang menargetkan Android 6.0 (API level 23) atau yang lebih tinggi, pastikan memeriksa dan meminta izin pada waktu proses. Untuk menentukan apakah aplikasi Anda telah diberi izin, panggil metode checkSelfPermission()
yang baru. Untuk meminta izin, panggil metode requestPermissions()
yang baru. Meskipun aplikasi Anda tidak menargetkan Android 6.0 (API level 23), Anda harus menguji aplikasi dengan model izin yang baru.
Untuk detail tentang mendukung model izin baru ini dalam aplikasi Anda, lihat Bekerja dengan Izin Sistem. Untuk mendapatkan tip mengenai cara menilai dampak pada aplikasi Anda, lihat Praktik Terbaik Izin.
Istirahatkan dan Aplikasi Siaga
Rilis ini memperkenalkan optimalisasi penghematan daya yang baru untuk perangkat yang dan aplikasi yang pasif. Fitur-fitur ini memengaruhi semua aplikasi jadi pastikan menguji aplikasi Anda dalam mode baru ini.
- Istirahatkan: Jika pengguna mencabut perangkat dan membiarkannya diam, dengan layar dalam keadaan mati, selama jangka waktu tertentu, perangkat akan masuk ke mode Istirahatkan, dalam hal ini perangkat mencoba mempertahankan sistem dalam keadaan tidur. Dalam mode ini, perangkat secara berkala melanjutkan pengoperasian normalnya selama jangka waktu singkat sehingga sinkronisasi aplikasi bisa berlangsung dan sistem bisa melakukan setiap pengoperasian yang menunggu.
- Aplikasi Siaga: Aplikasi Siaga memungkinkan sistem menentukan apakah aplikasi dalam keadaan pasif bila pengguna tidak menggunakannya secara aktif. Sistem menentukan hal ini bila pengguna tidak menyentuh aplikasi selama jangka waktu tertentu. Jika perangkat dicabut, sistem akan menonaktifkan akses jaringan dan menangguhkan sinkronisasi serta tugas untuk aplikasi yang dianggapnya pasif.
Untuk mengetahui selengkapnya tentang perubahan penghematan daya ini, lihat Mengoptimalkan untuk Istirahatkan dan Aplikasi Siaga.
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, sebagai gantinya gunakan kelas HttpURLConnection
. API ini lebih efisien karena mengurangi penggunaan jaringan melalui kompresi transparan dan caching respons, serta meminimalkan konsumsi daya. Untuk melanjutkan penggunaan 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 pustaka BoringSSL. Jika Anda menggunakan Android NDK dalam aplikasi, jangan tautkan dengan pustaka kriptografik yang bukan bagian dari NDK API, seperti libcrypto.so
dan libssl.so
. Pustaka ini bukanlah API publik, dan bisa berubah atau dihentikan tanpa notifikasi di seluruh rilis dan perangkat. Selain itu, keamanan Anda bisa menjadi rentan. Sebagai gantinya, modifikasi kode asli Anda untuk memanggil API kriptografi Java lewat JNI atau menautkan secara statistik dengan pustaka kriptografi pilihan Anda.
Akses ke Identifier Perangkat Keras
Untuk menyediakan perlindungan data yang lebih besar kepada pengguna, mulai rilis ini Android membuang akses terprogram ke identifier perangkat keras lokal dari perangkat untuk aplikasi yang menggunakan API Wi-Fi dan Bluetooth. Metode WifiInfo.getMacAddress()
dan BluetoothAdapter.getAddress()
sekarang mengembalikan nilai konstanta 02:00:00:00:00:00
.
Untuk mengakses identifier perangkat keras dari perangkat eksternal terdekat lewat pemindaian Bluetooth dan Wi-Fi, aplikasi Anda sekarang harus memiliki izin ACCESS_FINE_LOCATION
atau ACCESS_COARSE_LOCATION
:
Catatan: Bila perangkat yang menjalankan Android 6.0 (API level 23) memulai pemindaian Wi-Fi atau Bluetooth di latar belakang, operasi ini akan terlihat pada perangkat eksternal sebagai berasal dari alamat MAC yang diacak.
Notifikasi
Rilis ini membuang metode Notification.setLatestEventInfo()
. Gunakan kelas Notification.Builder
sebagai ganti membuat notifikasi. Untuk memperbarui 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. Gunakan perintah adb shell dumpsys notification --noredact
sebagai gantinya untuk mencetak teks dalam objek notifikasi.
Perubahan AudioManager
Menyetel volume secara langsung atau membungkam aliran tertentu lewat kelas 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

Bila pengguna memilih teks dalam aplikasi, Anda sekarang bisa menampilkan tindakan pemilihan teks seperti Potong, Salin, dan Tempel dalam bilah alat mengambang. Implementasi interaksi pengguna serupa dengan yang ada pada bilah aksi kontekstual, seperti yang dijelaskan dalam Mengaktifkan mode tindakan kontekstual untuk tampilan individual.
Untuk mengimplementasikan bilah alat mengambang bagi pemilihan teks, pastikan membuat perubahan berikut dalam aplikasi saat ini:
- Dalam objek
View
atauActivity
, ubah panggilanActionMode
Anda daristartActionMode(Callback)
menjadistartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Ambil implementasi Anda saat ini untuk
ActionMode.Callback
dan perluasActionMode.Callback2
sebagai gantinya. - Ganti metode
onGetContentRect()
untuk menyediakan koordinat objekRect
materi (seperti kotak pemilihan teks) dalam tampilan. - Jika pemosisian kotak tidak lagi valid, dan ini satu-satunya elemen yang dijadikan tidak valid, panggil metode
invalidateContentRect()
.
Jika Anda menggunakan Android Support Library revisi 22.2, ketahuilah bahwa bilah alat mengambang tidak kompatibel dengan versi lama dan appcompat mengambil alih kontrol objek ActionMode
secara default. Ini mencegah bilah alat mengambang ditampilkan. Untuk mengaktifkan dukungan ActionMode
dalam AppCompatActivity
, panggil getDelegate()
, kemudian panggil setHandleNativeActionModesEnabled()
pada objek AppCompatDelegate
yang dikembalikan dan setel parameter masukan ke false
. Panggilan ini mengembalikan kontrol objek ActionMode
ke kerangka kerja. Dalam perangkat yang menjalankan Android 6.0 (API level 23), yang memungkinkan kerangka kerja mendukung ActionBar
atau mode bilah alat mengambang, saat 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()
sekarang telah dibuang. Izin READ_HISTORY_BOOKMARKS
dan WRITE_HISTORY_BOOKMARKS
juga telah dibuang. Jika aplikasi Anda menargetkan Android 6.0 (API level 23) atau yang lebih tinggi, jangan akses bookmark dari penyedia global atau menggunakan izin bookmark. Sebagai gantinya, aplikasi Anda harus menyimpan data bookmark secara internal.
Perubahan Keystore Android
Bersama rilis ini, penyedia Android Keystore tidak lagi mendukung DSA. ECDSA masih didukung.
Kunci yang tidak membutuhkan enkripsi saat disimpan tidak akan lagi dihapus saat layar kunci aman dinonaktifkan atau disetel ulang (misalnya, oleh pengguna atau Administrator Perangkat). Kunci yang memerlukan enkripsi saat disimpan akan dihapus selama kejadian ini.
Perubahan Wi-Fi dan Jaringan
Rilis ini memperkenalkan perubahan perilaku berikut pada API Wi-Fi dan jaringan.
- Aplikasi Anda sekarang bisa mengubah status objek
WifiConfiguration
hanya jika Anda yang membuat objek ini. Anda tidak diizinkan memodifikasi atau menghapus objekWifiConfiguration
yang dibuat oleh pengguna atau oleh aplikasi lain. -
Sebelumnya, jika aplikasi memaksa perangkat untuk menghubungkan ke jaringan Wi-Fi tertentu dengan menggunakan
enableNetwork()
dengan setelandisableAllOthers=true
, perangkat akan terputus dari jaringan lain seperti halnya data seluler. Dalam rilis ini, perangkat tidak lagi memutus koneksi dari jaringan lain seperti itu. JikatargetSdkVersion
aplikasi Anda adalah“20”
atau yang lebih rendah, maka akan dipatok ke jaringan Wi-Fi terpilih. JikatargetSdkVersion
aplikasi Anda adalah“21”
atau yang lebih tinggi, gunakan API multijaringan (sepertiopenConnection()
,bindSocket()
, dan metodebindProcessToNetwork()
baru) untuk memastikan lalu lintas jaringannya dikirim pada jaringan yang dipilih.
Perubahan Layanan Kamera
Dalam rilis ini, model untuk mengakses sumber daya bersama dalam layanan kamera telah berubah dari mode akses sebelumnya “pertama datang, pertama dilayani” menjadi mode akses yang mendahulukan proses berprioritas tinggi. Perubahan pada perilaku layanan mencakup:
- Akses ke sumber daya subsistem, termasuk membuka dan mengonfigurasi perangkat kamera, diberikan berdasarkan "prioritas" proses aplikasi klien. Proses aplikasi dengan aktivitas yang bisa dilihat pengguna atau latar depan biasanya diberikan prioritas lebih tinggi, sehingga akuisisi dan penggunaan sumber daya kamera menjadi lebih bisa diandalkan.
- Klien kamera aktif untuk aplikasi prioritas lebih rendah bisa "ditinggalkan" bila aplikasi berprioritas lebih tinggi mencoba menggunakan kamera. Dalam
Camera
API yang tidak digunakan lagi, ini mengakibatkanonError()
dipanggil untuk klien yang ditinggalkan tadi. DalamCamera2
API, ini mengakibatkanonDisconnected()
dipanggil untuk klien yang ditinggalkan tadi. - Pada perangkat dengan perangkat keras kamera yang sesuai, masing-masing proses aplikasi dapat membuka dan menggunakan masing-masing perangkat kamera secara simultan. Akan tetapi, dalam kasus penggunaan multiproses, yang akses simultannya menyebabkan penurunan signifikan pada kinerja dan kemampuan setiap perangkat kamera yang dibuka, sekarang terdeteksi dan tidak diperbolehkan oleh layanan kamera. Perubahan ini bisa mengakibatkan "ditinggalkannya" klien prioritas yang lebih rendah meskipun tidak ada aplikasi lain yang secara langsung berupaya mengakses perangkat kamera yang sama.
- Mengubah pengguna saat ini menyebabkan klien kamera aktif dalam aplikasi yang dimiliki oleh akun pengguna sebelumnya menjadi ditinggalkan. Akses ke kamera dibatasi pada profil pengguna yang dimiliki oleh pengguna perangkat saat ini. Pada praktiknya, ini berarti akun "Tamu", misalnya tidak akan bisa meninggalkan proses berjalan yang menggunakan subsistem kamera bila pengguna telah beralih ke akun yang berbeda.
Waktu Proses
Waktu proses ART sekarang mengimplementasikan dengan benar aturan akses bagi metode newInstance()
. Perubahan ini memperbaiki masalah Dalvik yang salah memeriksa aturan akses dalam versi sebelumnya. Jika aplikasi Anda menggunakan metode newInstance()
dan ingin mengganti pemeriksaan akses, panggil metode setAccessible()
dengan parameter masukan disetel ke true
. Jika aplikasi Anda menggunakan v7 Appcompat Library atau v7 Recyclerview Library, Anda harus memperbarui aplikasi agar menggunakan versi terbaru dari pustaka ini. Jika tidak, pastikan setiap kelas khusus yang dirujuk dari XML telah diperbarui sehingga konstruktor kelasnya bisa diakses.
Rilis ini memperbarui perilaku linker dinamis. Linker dinamis sekarang memahami perbedaan antara soname
pustaka dan jalurnya ( public bug 6670), dan penelusuran berdasar soname
sekarang diimplementasikan. Aplikasi yang sebelumnya bekerja dan memiliki entri DT_NEEDED
yang buruk (biasanya jalur mutlak pada sistem file mesin versi) mungkin gagal bila dimuat.
Flag dlopen(3) RTLD_LOCAL
sekarang diimplementasikan dengan benar. Perhatikan, RTLD_LOCAL
adalah default, jadi panggilan ke dlopen(3)
yang tidak secara eksplisit menggunakan RTLD_LOCAL
akan terpengaruh (kecuali jika aplikasi Anda secara eksplisit menggunakan RTLD_GLOBAL
). Dengan RTLD_LOCAL
, simbol tidak akan disediakan ke pustaka yang dimuat oleh panggilan sesudahnya ke dlopen(3)
(tidak seperti yang direferensikan oleh entri DT_NEEDED
).
Pada Android versi sebelumnya, jika aplikasi Anda meminta sistem memuat pustaka bersama dengan relokasi teks, sistem akan menampilkan peringatan namun masih memperbolehkan pustaka dimuat. Mulai rilis ini, sistem akan menolak pustaka ini jika versi SDK target aplikasi Anda adalah 23 atau yang lebih tinggi. Untuk membantu mendeteksi apakah pustaka gagal dimuat, aplikasi Anda harus mencatat log kegagalan dlopen(3)
, dan menyertakan teks keterangan masalah yang dikembalikan oleh panggilan dlerror(3)
. Untuk mengetahui selengkapnya tentang 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 namun tidak ada dalam APK itu sendiri. APK harus ditandatangani lagi jika salah satu materi ini dibuang.
Koneksi USB
Koneksi perangkat melalui porta USB sekarang secara default disetel ke mode hanya-mengisi. Untuk mengakses perangkat dan materinya lewat koneksi USB, pengguna harus secara eksplisit memberi izin bagi interaksi seperti itu. Jika aplikasi Anda mendukung interaksi pengguna dengan perangkat lewat porta USB, pertimbangkan agar interaksi harus diaktifkan secara eksplisit.
Perubahan Android for Work
Rilis ini menyertakan perubahan perilaku berikut untuk Android for Work:
- Kontak kerja dalam konteks pribadi. Google Dialer Call Log sekarang menampilkan kontak kerja bila pengguna menampilkan panggilan yang lalu. Menyetel
setCrossProfileCallerIdDisabled()
ketrue
akan menyembunyikan kontak profil kerja dalam Google Dialer Call Log. Kontak kerja bisa ditampilkan bersama kontak pribadi ke perangkat melalui Bluetooth saja jika Anda menyetelsetBluetoothContactSharingDisabled()
kefalse
. Secara default, ini telah disetel ketrue
. - Penghapusan konfigurasi Wi-Fi: Konfigurasi Wi-Fi yang ditambahkan oleh Pemilik Profil (misalnya, melalui panggilan ke metode
addNetwork()
sekarang dibuang jika profil kerja itu dihapus. - Penguncian konfigurasi Wi-Fi: Setiap konfigurasi Wi-Fi yang dibuat oleh Pemilik Perangkat aktif tidak bisa lagi dimodifikasi 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 privilese untuk mengedit atau menghapus setiap konfigurasi Wi-Fi, termasuk yang tidak dibuat oleh mereka. - Unduh pengontrol kebijakan perangkat lewat tambahan akun Google: Bila akun Google yang memerlukan pengelolaan lewat aplikasi pengontrol kebijakan perangkat (device policy controller/DPC) ditambahkan ke perangkat di luar konteks yang dikelola, alur penambahan akun sekarang meminta pengguna untuk memasang WPC yang sesuai. Perilaku ini juga berlaku untuk akun yang ditambahkan lewat Settings > Accounts dan dalam wizard penyiapan perangkat pertama kali.
- Perubahan pada perilaku
DevicePolicyManager
API tertentu:- Memanggil metode
setCameraDisabled()
akan memengaruhi kamera untuk pengguna yang memanggil saja, memanggilnya dari profil terkelola tidak memengaruhi aplikasi kamera yang berjalan pada pengguna utama. - Selain itu, metode
setKeyguardDisabledFeatures()
sekarang tersedia untuk Pemilik Profil, serta Pemilik Perangkat. - Pemilik Profil bisa menyetel pembatasan keyguard ini:
KEYGUARD_DISABLE_TRUST_AGENTS
danKEYGUARD_DISABLE_FINGERPRINT
, yang memengaruhi setelan keyguard untuk pengguna induk profil.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, yang hanya memengaruhi notifikasi yang dibuat oleh aplikasi dalam profil terkelola.
- Metode
DevicePolicyManager.createAndInitializeUser()
danDevicePolicyManager.createUser()
tidak digunakan lagi. - Metode
setScreenCaptureDisabled()
sekarang juga memblokir struktur bantuan bila aplikasi pengguna yang dimaksud ada di latar depan. EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
sekarang menjadi default untuk SHA-256. SHA-1 masih mendukung kompatibilitas mundur namun akan dibuang di masa mendatang.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
sekarang hanya menerima SHA-256.- API yang melakukan inisialiasi perangkat di Android 6.0 (API level 23) sekarang telah dibuang.
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
telah dibuang sehingga penyediaan NFC bump lewat program tidak bisa membuka kunci perangkat yang dilindungi oleh penyetelan ulang pabrik.- Anda kini bisa menggunakan ekstra
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
untuk meneruskan data ke aplikasi pemilik perangkat selama penyediaan NFC dari perangkat yang dikelola. - Android for Work API telah dioptimalkan untuk izin waktu proses M, termasuk profil Work, layer bantuan, dan lainnya. API izin
DevicePolicyManager
baru tidak memengaruhi aplikasi pre-M. - Bila pengguna menarik mundur dari bagian sinkron alur penyiapan yang dimulai melalui maksud
ACTION_PROVISION_MANAGED_PROFILE
atauACTION_PROVISION_MANAGED_DEVICE
, sistem sekarang akan mengembalikan kode hasilRESULT_CANCELED
.
- Memanggil metode
- Perubahan pada API lain:
- Penggunaan Data: Kelas
android.app.usage.NetworkUsageStats
telah berganti nama menjadiNetworkStats
.
- Penggunaan Data: Kelas
- Perubahan pada setelan global:
- Setelan ini tidak bisa lagi disetel lewat
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Setelan global ini sekarang bisa disetel lewat
setGlobalSettings()
:
- Setelan ini tidak bisa lagi disetel lewat