Perubahan Android 6.0

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 dipahami dan diperhitungkan dalam aplikasi Anda.

Jika sebelumnya Anda telah memublikasikan aplikasi untuk Android, perhatikan bahwa perubahan dalam platform ini akan memengaruhi aplikasi Anda.

Izin Waktu Proses

Rilis ini memperkenalkan model izin baru, di mana pengguna kini dapat langsung mengelola izin aplikasi 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() baru. Meskipun aplikasi Anda tidak menargetkan Android 6.0 (API level 23), Anda harus menguji aplikasi dengan model izin yang baru.

Untuk mengetahui detail tentang mendukung model izin baru di aplikasi Anda, lihat Bekerja dengan Izin Sistem. Untuk tips cara menilai dampak pada aplikasi Anda, 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 untuk mencoba mempertahankan sistem dalam status tidur. Dalam mode ini, perangkat secara berkala melanjutkan operasi normal selama jangka waktu singkat sehingga sinkronisasi aplikasi dapat berlangsung dan sistem dapat menjalankan operasi yang tertunda.
  • Aplikasi Standby: Aplikasi Standby memungkinkan sistem menentukan apakah aplikasi 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 Aplikasi untuk 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. API ini lebih efisien karena mengurangi penggunaan jaringan melalui kompresi transparan dan cache 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 dalam aplikasi, jangan tautkan ke library kriptografis yang bukan bagian dari NDK API, seperti libcrypto.so dan libssl.so. Library ini bukan API publik, dan dapat berubah atau berhenti berfungsi 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 besar 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: Jika perangkat yang menjalankan Android 6.0 (API level 23) memulai pemindaian Wi-Fi atau Bluetooth di latar belakang, operasi ini 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 streaming tertentu melalui class AudioManager tidak lagi didukung. Metode setStreamSolo() tidak digunakan lagi, dan Anda harus memanggil metode requestAudioFocus(). Demikian pula, metode setStreamMute() tidak digunakan lagi; sebagai gantinya, panggil metode adjustStreamVolume() dan teruskan nilai arah ADJUST_MUTE atau ADJUST_UNMUTE.

Pemilihan Teks

Layar yang menampilkan fitur pemilihan teks baru dalam toolbar mengambang

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 implementasi panel tindakan kontekstual, seperti dijelaskan dalam Mengaktifkan mode tindakan kontekstual untuk tampilan individual.

Untuk mengimplementasikan toolbar mengambang untuk pemilihan teks, buat perubahan berikut pada aplikasi yang ada:

  1. Di objek View atau Activity, ubah panggilan ActionMode dari startActionMode(Callback) menjadi startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Ambil implementasi ActionMode.Callback yang sudah ada dan perluas ActionMode.Callback2 sebagai gantinya.
  3. Ganti metode onGetContentRect() untuk memberikan koordinat objek Rect konten (seperti kotak pemilihan teks) dalam tampilan.
  4. Jika penempatan persegi panjang tidak lagi valid, dan ini adalah satu-satunya elemen yang menjadi tidak valid, panggil metode invalidateContentRect().

Jika Anda menggunakan Android Support Library revisi 22.2, perhatikan bahwa toolbar mengambang tidak kompatibel dengan versi sebelumnya dan appcompat mengambil kontrol atas objek ActionMode secara default. Ini mencegah bilah alat mengambang ditampilkan. Untuk mengaktifkan dukungan ActionMode di 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 ActionBar atau mode toolbar mengambang, sementara 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 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 saat disimpan 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 objek WifiConfiguration yang dibuat oleh pengguna atau aplikasi lain.
  • Sebelumnya, jika aplikasi memaksa perangkat untuk terhubung ke jaringan Wi-Fi tertentu menggunakan enableNetwork() dengan setelan disableAllOthers=true, perangkat akan terputus dari jaringan lain seperti data seluler. Dalam rilis ini, perangkat tidak lagi memutus koneksi dari jaringan lain seperti itu. Jika targetSdkVersion aplikasi Anda adalah “20” atau lebih rendah, aplikasi akan disematkan ke jaringan Wi-Fi yang dipilih. Jika targetSdkVersion aplikasi Anda adalah “21” atau yang lebih tinggi, gunakan API multijaringan (seperti openConnection(), bindSocket(), dan metode bindProcessToNetwork() baru) untuk memastikan bahwa traffic jaringannya dikirim di jaringan yang dipilih.

Perubahan Layanan Kamera

Dalam rilis ini, model untuk mengakses resource bersama di layanan kamera telah diubah dari model akses “pertama datang, pertama dilayani” menjadi model akses yang mengutamakan 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 menjadi lebih dapat diandalkan.
  • Klien kamera aktif untuk aplikasi berprioritas lebih rendah dapat "ditinggalkan" saat aplikasi berprioritas lebih tinggi mencoba menggunakan kamera. Dalam Camera API yang tidak digunakan lagi, hal ini menyebabkan onError() dipanggil untuk klien yang dikeluarkan. Dalam Camera2 API, hal ini menyebabkan onDisconnected() dipanggil untuk klien yang dikeluarkan.
  • Pada perangkat dengan hardware kamera yang sesuai, masing-masing proses aplikasi dapat membuka dan menggunakan perangkat kamera terpisah secara simultan. Namun, dalam kasus penggunaan multiproses, yang akses simultannya menyebabkan penurunan performa atau kemampuan yang signifikan pada perangkat kamera yang terbuka, sekarang terdeteksi dan tidak diizinkan oleh layanan kamera. Perubahan ini dapat mengakibatkan "dikeluarkannya" 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 akan dihapus. Akses ke kamera dibatasi pada profil pengguna yang dimiliki oleh pengguna perangkat saat ini. Dalam praktiknya, hal ini berarti akun "Tamu", misalnya, tidak akan dapat meninggalkan proses yang berjalan yang menggunakan subsistem kamera saat pengguna telah beralih ke akun lain.

Runtime

Runtime ART sekarang mengimplementasikan aturan akses dengan benar untuk metode newInstance(). Perubahan ini memperbaiki masalah saat Dalvik memeriksa aturan akses secara tidak benar pada versi sebelumnya. Jika aplikasi menggunakan metode newInstance() dan Anda ingin mengganti pemeriksaan akses, panggil metode setAccessible() dengan parameter input disetel ke true. Jika aplikasi Anda menggunakan library appcompat v7 atau library appcompat v7, Anda harus mengupdate aplikasi agar dapat 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. Sekarang linker dinamis memahami perbedaan antara soname library dan jalurnya ( bug publik 6670), dan penelusuran berdasarkan 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. Perhatikan bahwa RTLD_LOCAL adalah default, sehingga panggilan ke dlopen(3) yang tidak secara eksplisit menggunakan RTLD_LOCAL akan terpengaruh (kecuali aplikasi Anda secara eksplisit menggunakan RTLD_GLOBAL). Dengan RTLD_LOCAL, simbol tidak akan disediakan 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 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 bagi 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 Telepon sekarang menampilkan kontak kerja saat pengguna melihat panggilan sebelumnya. Menyetel setCrossProfileCallerIdDisabled() ke true akan menyembunyikan kontak profil kerja di Log Panggilan Telepon Google. Kontak kerja dapat ditampilkan bersama kontak pribadi ke perangkat melalui Bluetooth hanya jika Anda menetapkan setBluetoothContactSharingDisabled() ke false. Secara default, opsi ini disetel ke true.
  • Penghapusan konfigurasi Wi-Fi: Konfigurasi Wi-Fi yang ditambahkan oleh Pemilik Profil (misalnya, melalui panggilan ke metode addNetwork()) sekarang 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 sekarang akan 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:
  • Perubahan pada API lain:
    • Penggunaan Data: Class android.app.usage.NetworkUsageStats telah diganti namanya menjadi NetworkStats.
  • Perubahan pada setelan global: