Bersama fitur dan kemampuan baru, Android 6.0 (API level 23) menyertakan berbagai perubahan sistem dan perilaku API. Dokumen ini menyoroti beberapa perubahan penting yang harus Anda pahami dan perhitungkan di aplikasi Anda.
Jika Anda sebelumnya telah memublikasikan aplikasi untuk Android, ketahuilah bahwa perubahan ini dalam memengaruhi aplikasi Anda.
Izin Waktu Proses
Rilis ini memperkenalkan model izin baru, di mana pengguna kini dapat mengelola secara langsung izin akses aplikasi pada runtime. Model ini memberikan visibilitas dan kontrol yang lebih baik kepada pengguna atas izin, sekaligus menyederhanakan proses instalasi dan pembaruan otomatis untuk pengembang 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 untuk memeriksa dan meminta
pada runtime. Untuk menentukan apakah aplikasi Anda telah diberi izin, panggil metode
checkSelfPermission()
baru
. Untuk meminta izin, panggil metode
requestPermissions()
. Meskipun aplikasi tidak menargetkan Android 6.0 (API level 23), Anda harus menguji aplikasi dengan
model izin yang baru.
Untuk detail tentang cara mendukung model izin baru di aplikasi Anda, lihat Bekerja dengan Izin Sistem. Untuk mendapatkan tips tentang cara menilai dampaknya 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. Ini memengaruhi semua aplikasi jadi pastikan untuk menguji aplikasi Anda dalam mode baru ini.
- Istirahatkan: Jika pengguna mencabut perangkat dan membiarkannya tidak bergerak, dengan layar nonaktif, selama jangka waktu tertentu, perangkat masuk ke mode Istirahatkan, yang berusaha menjaga sistem dalam kondisi tidur. Dalam mode ini, perangkat secara berkala melanjutkan pengoperasian normal selama sehingga sinkronisasi aplikasi dapat terjadi dan sistem bisa melakukan operasi yang tertunda.
- Aplikasi Standby: Aplikasi Standby memungkinkan sistem menentukan bahwa aplikasi sedang tidak ada aktivitas ketika pengguna tidak menggunakannya secara aktif. Sistem membuat penentuan ini ketika pengguna tidak sentuh aplikasi untuk jangka waktu tertentu. Jika perangkat dicabut, sistem akan menonaktifkan jaringan mengakses dan menangguhkan sinkronisasi dan tugas untuk aplikasi yang dianggap tidak ada aktivitas.
Untuk mempelajari perubahan hemat daya ini lebih lanjut, lihat Mengoptimalkan mode 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
sebagai gantinya. API ini lebih efisien karena mengurangi penggunaan jaringan melalui kompresi transparan
dan respons penyimpanan dalam cache, serta meminimalkan konsumsi daya. Untuk terus menggunakan API HTTP Apache, Anda
harus mendeklarasikan dependensi waktu kompilasi berikut terlebih dahulu dalam file build.gradle
Anda:
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android beralih dari OpenSSL ke
Membosankan
library. Jika Anda menggunakan Android NDK di aplikasi, jangan tautkan ke library kriptografis
yang bukan bagian dari NDK API, seperti libcrypto.so
dan libssl.so
. Ini
library bukanlah 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 untuk memanggil API kriptografi Java lewat JNI atau menautkan secara statis dengan
koleksi kriptografi pilihan Anda.
Akses ke Identifier Perangkat Keras
Untuk memberikan perlindungan data yang lebih besar kepada pengguna, mulai rilis ini, Android
menghapus akses terprogram ke ID hardware lokal perangkat untuk
menggunakan Wi-Fi dan Bluetooth API. Tujuan
WifiInfo.getMacAddress()
dan
Metode BluetoothAdapter.getAddress()
sekarang menampilkan nilai konstanta 02:00:00:00:00:00
.
Untuk mengakses ID hardware dari perangkat eksternal di sekitar melalui pemindaian Bluetooth dan Wi-Fi,
aplikasi Anda sekarang harus memiliki ACCESS_FINE_LOCATION
atau
Izin ACCESS_COARSE_LOCATION
:
Catatan: Saat perangkat yang menjalankan Android 6.0 (API level 23) memulai pemindaian Wi-Fi atau Bluetooth di latar belakang, operasi ini terlihat oleh perangkat eksternal ketika yang berasal dari alamat MAC acak.
Notifikasi
Rilis ini menghapus metode Notification.setLatestEventInfo()
. Gunakan
Notification.Builder
, bukan untuk membuat notifikasi. Untuk memperbarui
berulang kali, gunakan kembali instance Notification.Builder
. Panggil
build()
metode untuk mendapatkan
Notification
instance 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 streaming tertentu melalui AudioManager
tidak lagi didukung. Metode setStreamSolo()
tidak digunakan lagi, dan Anda harus memanggil metode
requestAudioFocus()
metode tersebut. Demikian pula,
Metode setStreamMute()
saat ini
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 di toolbar mengambang. Implementasi interaksi pengguna mirip dengan yang untuk bilah aksi kontekstual, seperti dijelaskan dalam Mengaktifkan mode tindakan kontekstual untuk tampilan individual.
Guna mengimplementasikan toolbar mengambang untuk pemilihan teks, buat perubahan berikut dalam file aplikasi:
- Di objek
View
atauActivity
, ubah elemenActionMode
panggilan daristartActionMode(Callback)
kestartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - Gunakan implementasi
ActionMode.Callback
yang ada dan perluas Sebagai gantinya,ActionMode.Callback2
. - Ganti
onGetContentRect()
untuk memberikan koordinat objekRect
konten (seperti kotak pemilihan teks) dalam tampilan. - Jika pemosisian persegi panjang tidak lagi valid, dan ini adalah satu-satunya elemen yang dibatalkan,
panggil metode
invalidateContentRect()
.
Jika Anda menggunakan
Android Support Library revisi 22.2, perlu diketahui bahwa toolbar mengambang
kompatibel dengan versi lama dan compat mengambil kontrol atas objek ActionMode
dengan
secara default. Ini mencegah bilah alat mengambang ditampilkan. Untuk mengaktifkan
Dukungan ActionMode
di
AppCompatActivity
, telepon
getDelegate()
, lalu panggil
setHandleNativeActionModesEnabled()
di item yang ditampilkan
AppCompatDelegate
dan menyetel input
parameter ke false
. Panggilan ini menampilkan kontrol objek ActionMode
ke
kerangka kerja. Di perangkat yang menjalankan Android 6.0 (API level 23), yang memungkinkan framework mendukung
ActionBar
atau mode toolbar mengambang, saat di perangkat yang berjalan
Android 5.1 (API level 22) atau lebih rendah, hanya mode ActionBar
yang
didukung.
Perubahan Bookmark Browser
Rilis ini membuang dukungan untuk bookmark global. Tujuan
android.provider.Browser.getAllBookmarks()
dan android.provider.Browser.saveBookmark()
sekarang telah dihapus. Demikian juga, READ_HISTORY_BOOKMARKS
dan WRITE_HISTORY_BOOKMARKS
izin akses dihapus. Jika aplikasi Anda menargetkan Android 6.0 (API level 23) atau yang lebih tinggi, jangan akses
bookmark dari penyedia global atau
gunakan izin bookmark. Sebagai gantinya, aplikasi Anda
harus menyimpan
data bookmark secara internal.
Perubahan Keystore Android
Dengan rilis ini, Penyedia Android Keystore tidak lagi mendukung dengan 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 dalam penyimpanan 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 hanya dapat mengubah status objek
WifiConfiguration
jika Anda yang membuat objek ini. Anda tidak diizinkan untuk 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
, koneksi perangkat 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, dan disematkan ke Jaringan Wi-Fi. JikatargetSdkVersion
aplikasi Anda adalah“21”
atau yang lebih tinggi, gunakan API multijaringan (sepertiopenConnection()
,bindSocket()
, dan yang barubindProcessToNetwork()
) untuk memastikan traffic jaringannya dikirim di 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 layanan” ke model akses yang memiliki prioritas tinggi proses-proses tersebut disukai. 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 sumber daya kamera akuisisi dan penggunaan pengguna yang lebih dapat diandalkan.
- Klien kamera aktif untuk aplikasi berprioritas lebih rendah dapat "dikeluarkan" jika prioritasnya lebih tinggi
aplikasi mencoba menggunakan kamera. Dalam
Camera
API yang tidak digunakan lagi, hal ini menghasilkanonError()
sedang meminta klien yang dikeluarkan ini. DiCamera2
API, hal ini menghasilkanonDisconnected()
dipanggil untuk klien yang ditinggalkan. - Pada perangkat dengan perangkat keras kamera yang sesuai, proses aplikasi terpisah mampu secara mandiri dan menggunakan perangkat kamera terpisah secara bersamaan. Namun, penggunaan multiproses kasus, di mana akses simultan menyebabkan penurunan signifikan pada performa salah satu perangkat kamera yang terbuka, kini terdeteksi dan tidak diizinkan oleh layanan kamera. Perubahan ini dapat mengakibatkan “dikeluarkan” untuk klien berprioritas 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 untuk 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 dibiarkan berjalan proses yang menggunakan subsistem kamera ketika pengguna beralih ke akun yang berbeda.
Runtime
Runtime ART kini mengimplementasikan aturan akses dengan benar untuk
Metode newInstance()
. Ini
perubahan akan memperbaiki masalah Dalvik yang salah memeriksa aturan akses dalam versi sebelumnya.
Jika aplikasi Anda menggunakan
Metode newInstance()
dan Anda
ingin mengganti pemeriksaan akses, panggil metode
Metode setAccessible()
dengan input
disetel ke true
. Jika aplikasi Anda menggunakan
Library compat v7 atau
Library AOSP pada v7,
Anda harus mengupdate aplikasi agar menggunakan versi terbaru library ini. Jika tidak, pastikan bahwa
setiap class kustom yang dirujuk dari XML akan diupdate sehingga konstruktor class-nya bisa diakses.
Rilis ini memperbarui perilaku linker dinamis. Penaut dinamis kini memahami
perbedaan antara soname
library dan jalurnya
(
bug publik 6670), dan penelusuran berdasarkan soname
kini
diimplementasikan. Aplikasi yang sebelumnya berfungsi dengan entri DT_NEEDED
yang buruk
(biasanya jalur absolut pada sistem file mesin build) mungkin gagal saat dimuat.
Flag dlopen(3) RTLD_LOCAL
kini diterapkan dengan benar. Perlu diketahui bahwa
RTLD_LOCAL
adalah default, jadi panggilan ke dlopen(3)
yang tidak menggunakan secara eksplisit
RTLD_LOCAL
akan terpengaruh (kecuali aplikasi Anda secara eksplisit menggunakan RTLD_GLOBAL
). Dengan
RTLD_LOCAL
, simbol tidak akan tersedia ke library yang dimuat oleh panggilan berikutnya ke
dlopen(3)
(bukan dirujuk oleh entri DT_NEEDED
).
Pada Android versi sebelumnya, jika aplikasi Anda meminta sistem memuat pustaka bersama dengan
relokasi teks, sistem akan menampilkan peringatan tetapi masih memungkinkan library 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 log
dlopen(3)
gagal, dan menyertakan teks deskripsi masalah yang ditunjukkan oleh dlerror(3)
mengembalikan panggilan. Untuk mempelajari lebih lanjut cara menangani relokasi teks, lihat artikel 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 maka konten akan 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 jelas memberikan izin untuk interaksi. Jika aplikasi Anda mendukung interaksi pengguna dengan perangkat melalui port USB, pertimbangan 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. Google Telepon
Log Panggilan kini menampilkan kontak kerja saat pengguna melihat panggilan sebelumnya.
Latar (Setting)
setCrossProfileCallerIdDisabled()
ketrue
akan menyembunyikan kontak profil kerja di Log Panggilan Google Telepon. Kontak kantor dapat ditampilkan bersama dengan kontak pribadi ke perangkat melalui Bluetooth hanya jika Anda menetapkansetBluetoothContactSharingDisabled()
kefalse
. Secara default, nilai ini ditetapkan ketrue
. - Penghapusan konfigurasi Wi-Fi: Konfigurasi Wi-Fi yang ditambahkan oleh Pemilik Profil
(misalnya, melalui panggilan ke
addNetwork()
) sekarang dihapus jika profil kerja tersebut dihapus. - Penguncian konfigurasi Wi-Fi: Konfigurasi Wi-Fi apa pun yang dibuat oleh
Pemilik Perangkat yang aktif tidak lagi
dapat diubah atau dihapus oleh pengguna jika
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
bukan nol. Pengguna tetap bisa membuat dan memodifikasi konfigurasi Wi-Fi-nya sendiri. Perangkat Aktif Pemilik memiliki hak istimewa untuk mengedit atau menghapus konfigurasi Wi-Fi apa pun, termasuk yang tidak dibuat oleh mereka. - Download pengontrol kebijakan perangkat melalui penambahan akun Google: Saat akun Google akun yang memerlukan pengelolaan melalui aplikasi pengontrol kebijakan perangkat (DPC) ditambahkan ke perangkat di luar konteks terkelola, alur penambahan akun sekarang meminta pengguna untuk menginstal WPC yang relevan. Perilaku ini juga berlaku untuk akun yang ditambahkan melalui Setelan > Akun dan wizard penyiapan perangkat awal.
- Perubahan pada perilaku API
DevicePolicyManager
tertentu:- Memanggil
setCameraDisabled()
memengaruhi kamera hanya untuk pengguna yang memanggil; memanggilnya dari profil terkelola tidak memengaruhi aplikasi kamera yang berjalan pada pengguna utama. - Selain itu,
setKeyguardDisabledFeatures()
kini tersedia untuk Pemilik Profil, serta Pemilik Perangkat. - Pemilik Profil dapat menetapkan 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. setScreenCaptureDisabled()
kini juga memblokir struktur bantuan saat aplikasi pengguna tertentu berada di latar depan.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
sekarang menjadi SHA-256 secara default. SHA-1 masih didukung untuk kompatibilitas mundur tetapi akan dihapus di 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 NFC ditempelkan tidak dapat membuka kunci perangkat yang dilindungi reset ke setelan pabrik secara terprogram.- Anda sekarang dapat menggunakan
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
tambahan untuk meneruskan data ke aplikasi pemilik perangkat selama penyediaan NFC perangkat terkelola. - API Android for Work telah dioptimalkan untuk izin runtime M, termasuk profil Kerja,
lapisan Bantuan, dan lainnya. API izin
DevicePolicyManager
baru tidak memengaruhi aplikasi pra-M. - Saat pengguna kembali dari bagian sinkron alur penyiapan yang dimulai melalui
ACTION_PROVISION_MANAGED_PROFILE
atau intentACTION_PROVISION_MANAGED_DEVICE
, sistem sekarang menampilkan kode hasilRESULT_CANCELED
.
- Memanggil
- Perubahan pada API lain:
- Penggunaan Data: Class
android.app.usage.NetworkUsageStats
telah diganti namanyaNetworkStats
.
- Penggunaan Data: Class
- Perubahan pada setelan global:
- Setelan ini tidak dapat ditetapkan lagi 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 ditetapkan lagi melalui