Perubahan Perilaku Android 7.0

Bersama dengan fitur dan kemampuan baru, Android 7.0 menyertakan berbagai perubahan sistem dan perilaku API. Dokumen ini menyoroti beberapa perubahan utama yang harus dipahami dan diperhitungkan dalam aplikasi Anda.

Jika Anda sebelumnya telah memublikasikan aplikasi untuk Android, ketahuilah bahwa aplikasi Anda mungkin terpengaruh oleh perubahan dalam platform ini.

Baterai dan Memori

Android 7.0 menyertakan perubahan perilaku sistem yang bertujuan untuk meningkatkan masa pakai baterai perangkat dan mengurangi penggunaan RAM. Perubahan ini dapat memengaruhi akses aplikasi Anda ke resource sistem, termasuk cara aplikasi Anda berinteraksi dengan aplikasi lain melalui intent implisit tertentu.

Istirahatkan

Diperkenalkan di Android 6.0 (API level 23), fitur Istirahatkan meningkatkan masa pakai baterai dengan menangguhkan aktivitas CPU dan jaringan saat pengguna tidak menghubungkan perangkat, diam, dan dengan layar nonaktif. Android 7.0 menghadirkan peningkatan lebih lanjut pada mode Istirahatkan dengan menerapkan subset CPU dan pembatasan jaringan saat perangkat tidak terhubung dengan layar nonaktif, tetapi tidak selalu diam, misalnya, saat handset berada di dalam saku.

Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem tingkat pertama untuk meningkatkan masa pakai baterai

Gambar 1. Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem level pertama untuk meningkatkan masa pakai baterai.

Jika perangkat menggunakan daya baterai, dan layar telah nonaktif selama waktu tertentu, perangkat akan memasuki mode Istirahatkan dan menerapkan subset pembatasan pertama: Menonaktifkan akses jaringan aplikasi, serta menangguhkan tugas dan sinkronisasi. Jika perangkat diam selama jangka waktu tertentu setelah memasuki mode Istirahatkan, sistem akan menerapkan pembatasan Istirahatkan lainnya pada alarm PowerManager.WakeLock, AlarmManager, GPS, dan pemindaian Wi-Fi. Terlepas dari apakah sebagian atau semua pembatasan Istirahatkan diterapkan, sistem akan membangunkan perangkat selama masa pemeliharaan singkat, dan selama itu aplikasi diizinkan mengakses jaringan dan dapat menjalankan semua tugas/sinkronisasi yang ditangguhkan.

Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem level kedua setelah perangkat diam selama jangka waktu tertentu

Gambar 2. Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem level kedua setelah perangkat diam selama jangka waktu tertentu.

Perhatikan bahwa mengaktifkan layar atau mencolokkan perangkat akan keluar dari mode Istirahatkan dan akan menghapus pembatasan pemrosesan ini. Perilaku tambahan ini tidak memengaruhi rekomendasi dan praktik terbaik dalam menyesuaikan aplikasi Anda dengan mode Istirahatkan versi sebelumnya yang diperkenalkan di Android 6.0 (API level 23), seperti yang dibahas dalam Mengoptimalkan fitur Istirahatkan dan Aplikasi Standby. Anda tetap harus mengikuti rekomendasi tersebut, seperti menggunakan Firebase Cloud Messaging (FCM) untuk mengirim dan menerima pesan, serta mulai merencanakan update untuk mengakomodasi perilaku Istirahatkan tambahan.

Project Svelte: Optimisasi Latar Belakang

Android 7.0 menghapus tiga siaran implisit untuk membantu mengoptimalkan penggunaan memori dan konsumsi daya. Perubahan ini diperlukan karena siaran implisit sering memulai aplikasi yang telah mendaftar untuk memprosesnya di latar belakang. Menghapus siaran ini dapat sangat menguntungkan performa perangkat dan pengalaman pengguna.

Perangkat seluler sering mengalami perubahan konektivitas, seperti saat berpindah antara Wi-Fi dan data seluler. Saat ini, aplikasi dapat memantau perubahan konektivitas dengan mendaftarkan penerima untuk siaran CONNECTIVITY_ACTION implisit dalam manifesnya. Karena banyak aplikasi yang terdaftar untuk menerima siaran ini, satu switch jaringan dapat menyebabkan semuanya aktif dan memproses siaran secara bersamaan.

Demikian pula, pada versi Android sebelumnya, aplikasi dapat mendaftar untuk menerima siaran ACTION_NEW_PICTURE dan ACTION_NEW_VIDEO implisit dari aplikasi lain, seperti Kamera. Saat pengguna mengambil gambar dengan aplikasi Kamera, aplikasi ini akan aktif untuk memproses siaran.

Untuk mengatasi masalah ini, Android 7.0 menerapkan pengoptimalan berikut:

Jika aplikasi Anda menggunakan salah satu intent ini, Anda harus menghapus dependensi pada intent tersebut sesegera mungkin agar dapat menargetkan perangkat Android 7.0 dengan benar. Framework Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan siaran implisit ini. Misalnya, JobScheduler API menyediakan mekanisme yang andal untuk menjadwalkan operasi jaringan jika kondisi tertentu terpenuhi, misalnya koneksi ke jaringan tidak berbayar. Anda bahkan dapat menggunakan JobScheduler untuk bereaksi terhadap perubahan pada penyedia konten.

Untuk mengetahui informasi selengkapnya tentang pengoptimalan latar belakang di Android 7.0 (API level 24) dan cara menyesuaikan aplikasi, lihat Pengoptimalan Latar Belakang.

Perubahan Izin

Android 7.0 menyertakan perubahan pada izin yang bisa memengaruhi aplikasi Anda.

Perubahan izin sistem file

Untuk meningkatkan keamanan file pribadi, direktori pribadi aplikasi yang menargetkan Android 7.0 atau yang lebih tinggi memiliki akses terbatas (0700). Setelan ini mencegah kebocoran metadata file pribadi, seperti ukuran atau keberadaannya. Perubahan izin ini memiliki beberapa efek samping:

Berbagi File Antar Aplikasi

Untuk aplikasi yang menargetkan Android 7.0, framework Android menerapkan kebijakan API StrictMode yang melarang mengekspos URI file:// di luar aplikasi Anda. Jika intent yang berisi URI file keluar dari aplikasi Anda, aplikasi akan gagal dengan pengecualian FileUriExposedException.

Untuk berbagi file antar-aplikasi, Anda harus mengirim URI content:// dan memberikan izin akses sementara pada URI. Cara termudah untuk memberikan izin ini adalah dengan menggunakan class FileProvider. Untuk mengetahui informasi selengkapnya tentang izin dan berbagi file, lihat Berbagi File.

Peningkatan Aksesibilitas

Android 7.0 menyertakan perubahan yang dimaksudkan untuk meningkatkan kegunaan platform bagi pengguna dengan gangguan penglihatan atau rendah. Perubahan ini umumnya tidak memerlukan perubahan kode pada aplikasi, tetapi Anda harus meninjau fitur ini dan mengujinya dengan aplikasi untuk menilai potensi dampaknya terhadap pengalaman pengguna.

Zoom Layar

Android 7.0 memungkinkan pengguna menyetel Display size yang akan memperbesar atau memperkecil semua elemen pada layar, sehingga meningkatkan aksesibilitas perangkat bagi pengguna dengan gangguan penglihatan. Pengguna tidak dapat memperbesar layar melewati lebar layar minimum sw320dp, yang merupakan lebar Nexus 4, yakni ponsel ukuran sedang pada umumnya.

Layar menunjukkan ukuran tampilan perangkat yang tidak diperbesar yang menjalankan image sistem Android 7.0
Layar yang menunjukkan efek penambahan ukuran tampilan perangkat yang menjalankan image sistem Android 7.0

Gambar 3. Layar di sebelah kanan menunjukkan efek penambahan Ukuran tampilan perangkat yang menjalankan image sistem Android 7.0.

Saat kepadatan perangkat berubah, sistem akan memberi tahu aplikasi yang sedang berjalan dengan cara berikut:

  • Jika aplikasi menargetkan API level 23 atau yang lebih rendah, sistem akan otomatis menghentikan semua proses latar belakangnya. Artinya, jika pengguna beralih dari aplikasi tersebut untuk membuka layar Settings dan mengubah setelan Display size, sistem akan menghentikan aplikasi dengan cara yang sama seperti dalam situasi memori rendah. Jika aplikasi memiliki beberapa proses latar depan, sistem akan memberi tahu proses tersebut tentang perubahan konfigurasi seperti yang dijelaskan dalam Menangani Perubahan Runtime, seolah-olah orientasi perangkat telah berubah.
  • Jika aplikasi menargetkan Android 7.0, semua prosesnya (latar depan dan latar belakang) akan diberi tahu mengenai perubahan konfigurasi seperti yang dijelaskan dalam Menangani Perubahan Runtime.

Sebagian besar aplikasi tidak perlu melakukan perubahan apa pun untuk mendukung fitur ini, asalkan aplikasi tersebut mengikuti praktik terbaik Android. Hal-hal tertentu yang harus diperiksa:

  • Uji aplikasi Anda di perangkat dengan lebar layar sw320dp dan pastikan aplikasi berjalan secara memadai.
  • Saat konfigurasi perangkat berubah, perbarui informasi cache yang bergantung pada kepadatan, seperti bitmap dalam cache atau resource yang dimuat dari jaringan. Periksa perubahan konfigurasi saat aplikasi melanjutkan dari status dijeda.

    Catatan: Jika Anda meng-cache data yang bergantung pada konfigurasi, sebaiknya sertakan metadata yang relevan seperti ukuran layar atau kepadatan piksel yang sesuai untuk data tersebut. Dengan menyimpan metadata ini, Anda dapat memutuskan apakah Anda perlu memuat ulang data yang disimpan dalam cache setelah perubahan konfigurasi.

  • Hindari menentukan dimensi dengan satuan px, karena satuan ini tidak diskalakan dengan kepadatan layar. Sebagai gantinya, tentukan dimensi dengan unit piksel kepadatan mandiri (dp).

Vision Settings di Setup Wizard

Android 7.0 menyertakan Setelan Vision pada layar Sambutan, tempat pengguna dapat menyiapkan setelan aksesibilitas berikut di perangkat baru: Gestur pembesaran, Ukuran font, Ukuran tampilan, dan TalkBack. Perubahan ini meningkatkan visibilitas bug terkait berbagai setelan layar. Untuk menilai dampak fitur ini, Anda harus menguji aplikasi dengan mengaktifkan setelan ini. Anda dapat menemukan setelan ini pada Setelan > Aksesibilitas.

Penautan Aplikasi NDK ke Pustaka Platform

Mulai Android 7.0, sistem mencegah aplikasi menautkan secara dinamis ke library non-NDK, sehingga dapat menyebabkan aplikasi Anda error. Perubahan perilaku ini bertujuan untuk menciptakan pengalaman aplikasi yang konsisten di seluruh update platform dan perangkat yang berbeda. Meskipun kode Anda mungkin tidak ditautkan ke library pribadi, mungkin saja library statis pihak ketiga di aplikasi Anda dapat melakukannya. Oleh karena itu, semua developer harus memeriksa untuk memastikan bahwa aplikasi mereka tidak error di perangkat yang menjalankan Android 7.0. Jika aplikasi menggunakan kode native, Anda hanya boleh menggunakan API NDK publik.

Ada tiga cara yang dapat digunakan aplikasi Anda untuk mencoba mengakses API platform pribadi:

  • Aplikasi Anda mengakses langsung pustaka platform privat. Anda harus mengupdate aplikasi agar menyertakan salinan library tersebut sendiri atau menggunakan NDK API publik.
  • Aplikasi Anda menggunakan library pihak ketiga yang mengakses library platform pribadi. Meskipun Anda yakin bahwa aplikasi tidak mengakses library pribadi secara langsung, Anda tetap harus menguji aplikasi dalam skenario ini.
  • Aplikasi Anda mereferensikan pustaka yang tidak disertakan dalam APK-nya. Misalnya, hal ini bisa terjadi jika Anda mencoba menggunakan salinan OpenSSL Anda sendiri, tetapi lupa memaketkannya dengan APK aplikasi. Aplikasi dapat berjalan normal pada versi platform Android yang menyertakan libcrypto.so. Namun, aplikasi dapat mengalami error pada versi Android lebih baru yang tidak menyertakan library ini (seperti Android 6.0 dan yang lebih baru). Untuk memperbaikinya, pastikan Anda memaketkan semua library non-NDK bersama APK Anda.

Aplikasi tidak boleh menggunakan library native yang tidak disertakan dalam NDK karena dapat berubah atau dihapus antara versi Android yang berbeda. Peralihan dari OpenSSL ke BoringSSL adalah contoh perubahan semacam ini. Selain itu, karena tidak ada persyaratan kompatibilitas untuk library platform yang tidak disertakan dalam NDK, perangkat yang berbeda mungkin menawarkan tingkat kompatibilitas yang berbeda pula.

Untuk mengurangi dampak pembatasan ini terhadap aplikasi yang dirilis saat ini, sekumpulan library yang mengalami penggunaan signifikan—seperti libandroid_runtime.so, libcutils.so, libcrypto.so, dan libssl.so—dapat diakses sementara di Android 7.0 (API level 24) untuk aplikasi yang menargetkan API level 23 atau yang lebih rendah. Jika aplikasi Anda memuat salah satu library ini, logcat akan menghasilkan peringatan dan toast akan muncul di perangkat target untuk memberi tahu Anda. Jika melihat peringatan ini, Anda harus mengupdate aplikasi agar menyertakan salinan library-nya sendiri atau hanya menggunakan NDK API publik. Rilis platform Android mendatang mungkin akan membatasi penggunaan library pribadi sepenuhnya dan menyebabkan aplikasi Anda error.

Semua aplikasi menghasilkan error runtime jika memanggil API yang tidak bersifat publik atau dapat diakses untuk sementara. Hasilnya adalah System.loadLibrary dan dlopen(3) menampilkan NULL, dan dapat menyebabkan aplikasi Anda error. Anda harus meninjau kode aplikasi untuk menghapus penggunaan API platform pribadi dan menguji aplikasi secara menyeluruh menggunakan perangkat atau emulator yang menjalankan Android 7.0 (API level 24). Jika tidak yakin apakah aplikasi menggunakan library pribadi atau tidak, Anda dapat memeriksa logcat untuk mengidentifikasi error runtime.

Tabel berikut menjelaskan perilaku yang akan Anda lihat dari aplikasi, bergantung pada penggunaan library native pribadi dan level API targetnya (android:targetSdkVersion).

Library Tingkat API target Akses waktu proses lewat linker dinamis Perilaku Android 7.0 (API level 24) Perilaku platform Android mendatang
Publik NDK Ada Mudah diakses Bekerja sesuai harapan Bekerja sesuai harapan
Privat (pustaka privat yang dapat diakses sementara) 23 atau yang lebih rendah Untuk sementara dapat diakses Bekerja sesuai harapan, namun Anda menerima peringatan logcat. Kesalahan waktu proses
Privat (pustaka privat yang dapat diakses sementara) 24 atau yang lebih tinggi Dibatasi Kesalahan waktu proses Kesalahan waktu proses
Privat (lainnya) Ada Dibatasi Kesalahan waktu proses Kesalahan waktu proses

Periksa apakah aplikasi Anda menggunakan pustaka privat

Untuk membantu Anda mengidentifikasi masalah saat memuat library pribadi, logcat mungkin menghasilkan peringatan atau error runtime. Misalnya, jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah, dan mencoba mengakses library pribadi pada perangkat yang menjalankan Android 7.0, Anda mungkin melihat peringatan yang serupa dengan berikut ini:

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

Peringatan logcat ini memberi tahu Anda library mana yang mencoba mengakses API platform pribadi, tetapi tidak akan menyebabkan aplikasi error. Namun, jika aplikasi menargetkan API level 24 atau yang lebih tinggi, logcat akan menghasilkan error runtime berikut dan aplikasi Anda mungkin akan error:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

Anda juga mungkin melihat output logcat ini jika aplikasi Anda menggunakan library pihak ketiga yang secara dinamis menautkan ke API platform pribadi. Alat readelf di Android 7.0DK memungkinkan Anda membuat daftar semua library bersama yang tertaut secara dinamis dari file .so tertentu dengan menjalankan perintah berikut:

aarch64-linux-android-readelf -dW libMyLibrary.so

Mengupdate aplikasi Anda

Berikut adalah beberapa langkah yang dapat Anda ambil untuk memperbaiki jenis error ini dan memastikan aplikasi Anda tidak mengalami error pada update platform mendatang:

  • Jika aplikasi Anda menggunakan library platform pribadi, Anda harus mengupdatenya agar menyertakan salinan library-nya sendiri atau menggunakan NDK API publik.
  • Jika aplikasi Anda menggunakan library pihak ketiga yang mengakses simbol pribadi, hubungi pembuat library untuk mengupdate library.
  • Pastikan Anda mengemas semua pustaka non-NDK bersama APK.
  • Gunakan fungsi JNI standar, bukan getJavaVM dan getJNIEnv dari libandroid_runtime.so:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
    
  • Gunakan __system_property_get, bukan simbol property_get pribadi dari libcutils.so. Untuk melakukannya, gunakan __system_property_get dengan hal berikut:
    #include <sys/system_properties.h>
    

    Catatan: Ketersediaan dan isi properti sistem tidak diuji melalui CTS. Perbaikan yang lebih baik adalah menghindari penggunaan properti ini sama sekali.

  • Gunakan versi lokal simbol SSL_ctrl dari libcrypto.so. Misalnya, Anda harus menautkan libcyrpto.a secara statis di file .so, atau menyertakan versi libcrypto.so yang ditautkan secara dinamis dari BoringSSL/OpenSSL dan memaketkannya dalam APK.

Android for Work

Android 7.0 berisi perubahan untuk aplikasi yang menargetkan Android for Work, termasuk perubahan pada penginstalan sertifikat, reset sandi, pengelolaan pengguna sekunder, dan akses ke ID perangkat. Jika Anda membangun aplikasi untuk lingkungan Android for Work, sebaiknya tinjau perubahan ini dan modifikasi aplikasi Anda.

  • Anda harus menginstal penginstal sertifikat yang didelegasikan sebelum DPC dapat menyetelnya. Untuk aplikasi pemilik perangkat dan profil yang menargetkan Android 7.0 (API level 24), Anda harus menginstal penginstal sertifikat yang didelegasikan sebelum pengontrol kebijakan perangkat (DPC) memanggil DevicePolicyManager.setCertInstallerPackage(). Jika penginstal belum diinstal, sistem akan menampilkan IllegalArgumentException.
  • Pembatasan sandi reset untuk admin perangkat kini diterapkan ke pemilik profil. Admin perangkat tidak dapat lagi menggunakan DevicePolicyManager.resetPassword() untuk menghapus sandi atau mengubah sandi yang sudah disetel. Admin perangkat tetap bisa menyetel sandi, tetapi hanya jika perangkat tidak memiliki sandi, PIN, atau pola.
  • Pemilik profil dan perangkat dapat mengelola akun meskipun batasan ditetapkan. Pemilik perangkat dan pemilik profil dapat memanggil Account Management API meskipun pembatasan pengguna DISALLOW_MODIFY_ACCOUNTS diberlakukan.
  • Pemilik perangkat bisa mengelola pengguna tambahan lebih mudah. Saat perangkat berjalan dalam mode pemilik perangkat, batasan DISALLOW_ADD_USER akan otomatis disetel. Tindakan ini mencegah pengguna membuat pengguna sekunder yang tidak terkelola. Selain itu, metode CreateUser() dan createAndInitializeUser() tidak digunakan lagi; metode DevicePolicyManager.createAndManageUser() baru akan menggantikannya.
  • Pemilik perangkat bisa mengakses identifier perangkat. Pemilik perangkat dapat mengakses alamat MAC Wi-Fi perangkat, menggunakan DevicePolicyManager.getWifiMacAddress(). Jika Wi-Fi belum pernah diaktifkan di perangkat, metode ini akan menampilkan nilai null.
  • Setelan Mode Kerja mengontrol akses ke aplikasi kerja. Jika mode kerja nonaktif, peluncur sistem akan menunjukkan aplikasi kerja tidak tersedia dengan membuat warnanya jadi abu-abu. Mengaktifkan kembali mode kerja akan memulihkan perilaku normal.
  • Saat menginstal file PKCS #12 yang berisi rantai sertifikat klien dan kunci pribadi yang terkait dari Settings UI, sertifikat CA dalam rantai tersebut tidak lagi diinstal ke penyimpanan kredensial tepercaya. Hal ini tidak memengaruhi hasil KeyChain.getCertificateChain() saat aplikasi mencoba mengambil rantai sertifikat klien nanti. Jika diperlukan, sertifikat CA harus diinstal ke penyimpanan kredensial tepercaya melalui UI Setelan secara terpisah, dengan format yang dienkode DER menggunakan ekstensi file .crt atau .cer.
  • Mulai Android 7.0, pendaftaran dan penyimpanan sidik jari dikelola per pengguna. Jika Klien Kebijakan Perangkat (DPC) pemilik profil menargetkan API level 23 (atau yang lebih rendah) di perangkat yang menjalankan Android 7.0 (API level 24), pengguna masih dapat menyetel sidik jari di perangkat, tetapi aplikasi kerja tidak dapat mengakses sidik jari perangkat. Jika DPC menargetkan API level 24 dan yang lebih baru, pengguna dapat menyetel sidik jari secara khusus untuk profil kerja dengan membuka Setelan > Keamanan > Keamanan profil kerja.
  • Status enkripsi baru ENCRYPTION_STATUS_ACTIVE_PER_USER ditampilkan oleh DevicePolicyManager.getStorageEncryptionStatus(), untuk menunjukkan bahwa enkripsi aktif dan kunci enkripsi terkait dengan pengguna. Status baru hanya dikembalikan jika DPC menargetkan API Level 24 dan yang lebih tinggi. Untuk aplikasi yang menargetkan API level sebelumnya, ENCRYPTION_STATUS_ACTIVE akan ditampilkan, meskipun kunci enkripsi bersifat khusus untuk pengguna atau profil tersebut.
  • Di Android 7.0, beberapa metode yang biasanya akan memengaruhi seluruh perangkat berperilaku berbeda jika perangkat memiliki profil kerja yang diinstal dengan tantangan kerja terpisah. Bukannya memengaruhi seluruh perangkat, metode ini hanya berlaku untuk profil kerja. (Daftar lengkap metode tersebut tersedia dalam dokumentasi DevicePolicyManager.getParentProfileInstance().) Misalnya, DevicePolicyManager.lockNow() hanya mengunci profil kerja, bukan mengunci seluruh perangkat. Untuk setiap metode ini, Anda bisa mendapatkan perilaku lama dengan memanggil metode pada instance induk DevicePolicyManager; Anda bisa mendapatkan induk ini dengan memanggil DevicePolicyManager.getParentProfileInstance(). Jadi misalnya, jika Anda memanggil metode lockNow() instance induk, seluruh perangkat akan dikunci.

Retensi Anotasi

Android 7.0 memperbaiki bug yang membuat visibilitas anotasi menjadi terabaikan. Masalah ini memungkinkan runtime untuk mengakses anotasi yang seharusnya tidak dapat digunakan. Anotasi ini termasuk:

  • VISIBILITY_BUILD: Dimaksudkan agar hanya terlihat pada waktu build.
  • VISIBILITY_SYSTEM: Dimaksudkan agar terlihat pada runtime, tetapi hanya pada sistem yang mendasarinya.

Jika aplikasi Anda mengandalkan perilaku ini, tambahkan kebijakan retensi ke anotasi yang harus tersedia pada runtime. Anda melakukannya menggunakan @Retention(RetentionPolicy.RUNTIME).

Perubahan Konfigurasi Default TLS/SSL

Android 7.0 membuat perubahan berikut pada konfigurasi TLS/SSL default yang digunakan oleh aplikasi untuk HTTPS dan traffic TLS/SSL lainnya:

  • Cipher suite RC4 kini dinonaktifkan.
  • Cipher suite CHACHA20-POLY1305 kini diaktifkan.

RC4 yang dinonaktifkan secara default dapat menyebabkan kerusakan dalam konektivitas HTTPS atau TLS/SSL jika server tidak menegosiasikan cipher suite modern. Perbaikan yang diutamakan adalah meningkatkan konfigurasi server untuk memungkinkan cipher suite dan protokol yang lebih kuat dan lebih modern. Idealnya, TLSv1.2 dan AES-GCM harus diaktifkan, sedangkan cipher suite Forward Secrecy (ECDHE) harus diaktifkan dan diutamakan.

Alternatifnya adalah memodifikasi aplikasi agar menggunakan SSLSocketFactory kustom untuk berkomunikasi dengan server. Selain cipher suite default, factory harus didesain untuk membuat instance SSLSocket yang memiliki beberapa cipher suite yang diperlukan oleh server.

Catatan: Perubahan ini tidak berlaku untuk WebView.

Aplikasi yang menargetkan Android 7.0

Perubahan perilaku ini berlaku secara eksklusif pada aplikasi yang menargetkan Android 7.0 (API level 24) atau yang lebih tinggi. Aplikasi yang mengompilasi di Android 7.0, atau menetapkan targetSdkVersion ke Android 7.0 atau yang lebih tinggi, harus memodifikasi aplikasi tersebut untuk mendukung perilaku ini dengan benar, jika memungkinkan bagi aplikasi tersebut.

Perubahan Serialisasi

Android 7.0 (API level 24) memperbaiki bug dalam penghitungan serialVersionUID default jika tidak cocok dengan spesifikasi.

Class yang mengimplementasikan Serializable dan tidak menentukan kolom serialVersionUID eksplisit dapat melihat perubahan dalam serialVersionUID default-nya yang akan menyebabkan pengecualian ditampilkan saat mencoba melakukan deserialisasi instance class yang diserialisasi pada versi sebelumnya atau diserialisasi oleh aplikasi yang menargetkan versi sebelumnya. Pesan error akan terlihat seperti ini:

local class incompatible: stream classdesc serialVersionUID = 1234, local class serialVersionUID = 4567

Untuk memperbaiki masalah ini, Anda harus menambahkan kolom serialVersionUID ke class yang terpengaruh dengan nilai stream classdesc serialVersionUID dari pesan error, misalnya, 1234 dalam kasus ini. Perubahan tersebut mematuhi semua rekomendasi praktik yang baik untuk menulis kode serialisasi dan akan berfungsi di semua versi Android.

Bug spesifik yang diperbaiki terkait dengan keberadaan metode penginisialisasi statis, yaitu <clinit>. Menurut spesifikasi, ada atau tidaknya metode penginisialisasi statis di class akan memengaruhi serialVersionUID default yang dihitung untuk class tersebut. Sebelum perbaikan bug, kalkulasi juga akan memeriksa class super untuk penginisialisasi statis jika class tidak memilikinya.

Untuk memperjelas, perubahan ini tidak memengaruhi aplikasi yang menargetkan API level 23 atau lebih rendah, class yang memiliki kolom serialVersionUID atau class yang memiliki metode penginisialisasi statis.

Poin Penting Lainnya

  • Saat aplikasi berjalan di Android 7.0, namun menargetkan level API yang lebih rendah, dan pengguna mengubah ukuran tampilan, proses aplikasi akan dihentikan. Aplikasi harus dapat menangani skenario ini dengan baik. Jika tidak, aplikasi akan error saat pengguna memulihkannya dari Recents.

    Anda harus menguji aplikasi untuk memastikan perilaku ini tidak terjadi. Anda dapat melakukannya dengan menyebabkan error yang identik saat mematikan aplikasi secara manual melalui DDMS.

    Aplikasi yang menargetkan Android 7.0 (API level 24) dan yang lebih baru tidak secara otomatis dimatikan saat perubahan kepadatan; namun, aplikasi tersebut mungkin masih merespons perubahan konfigurasi dengan buruk.

  • Aplikasi di Android 7.0 harus dapat menangani perubahan konfigurasi dengan baik, dan tidak boleh mengalami error pada waktu mulai berikutnya. Anda dapat memverifikasi perilaku aplikasi dengan mengubah ukuran font (Setting > Display > Font size), lalu memulihkan aplikasi dari Recents.
  • Karena adanya bug di versi Android sebelumnya, sistem tidak menandai penulisan ke soket TCP di thread utama sebagai pelanggaran mode ketat. Android 7.0 telah memperbaiki bug ini. Aplikasi yang menunjukkan perilaku ini sekarang akan menampilkan android.os.NetworkOnMainThreadException. Secara umum, menjalankan operasi jaringan di thread utama merupakan ide yang buruk karena operasi ini biasanya memiliki latensi tinggi yang menyebabkan ANR dan jank.
  • Kelompok metode Debug.startMethodTracing() kini ditetapkan secara default ke output penyimpanan dalam direktori khusus paket di penyimpanan bersama, bukan di tingkat teratas kartu SD. Artinya, aplikasi tidak perlu lagi meminta izin WRITE_EXTERNAL_STORAGE untuk menggunakan API ini.
  • Banyak API platform kini telah mulai memeriksa payload besar yang dikirim ke seluruh transaksi Binder, dan sistem kini menampilkan kembali TransactionTooLargeExceptions sebagai RuntimeExceptions, bukan mencatat log atau menyembunyikannya secara otomatis. Salah satu contoh umum adalah menyimpan terlalu banyak data di Activity.onSaveInstanceState(), yang menyebabkan ActivityThread.StopInfo menampilkan RuntimeException saat aplikasi Anda menargetkan Android 7.0.
  • Jika aplikasi memposting tugas Runnable ke View, dan View tidak terpasang ke jendela, sistem akan mengantrekan tugas Runnable dengan View; tugas Runnable tidak akan dijalankan hingga View terpasang ke jendela. Perilaku ini memperbaiki bug berikut:
    • Jika aplikasi memposting ke View dari thread selain UI thread jendela yang dimaksud, Runnable mungkin akan berjalan di thread yang salah.
    • Jika tugas Runnable diposting dari thread selain thread looper, aplikasi dapat mengekspos tugas Runnable.
  • Jika aplikasi di Android 7.0 dengan izin DELETE_PACKAGES mencoba menghapus paket, tetapi aplikasi yang berbeda telah menginstal paket tersebut, sistem akan memerlukan konfirmasi pengguna. Dalam skenario ini, aplikasi harus mengharapkan STATUS_PENDING_USER_ACTION sebagai status nilai yang ditampilkan saat memanggil PackageInstaller.uninstall().
  • Penyedia JCA yang disebut Crypto tidak digunakan lagi, karena satu-satunya algoritmenya, SHA1PRNG, lemah secara kriptografis. Aplikasi tidak dapat lagi menggunakan SHA1PRNG untuk memperoleh kunci (secara tidak aman), karena penyedia ini sudah tidak tersedia lagi. Untuk informasi selengkapnya, lihat postingan blog Penyedia keamanan "Crypto" yang tidak digunakan lagi di Android N.