Bersama dengan fitur dan kemampuan baru, Android 7.0 menyertakan berbagai perubahan perilaku sistem dan API. Dokumen ini menyoroti beberapa perubahan penting yang harus Anda pahami dan perhitungkan dalam aplikasi Anda.
Jika sebelumnya Anda telah memublikasikan aplikasi untuk Android, perlu diketahui bahwa aplikasi Anda mungkin terpengaruh oleh perubahan ini di platform.
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, serta cara aplikasi Anda berinteraksi dengan aplikasi lain menggunakan intent implisit tertentu.
Istirahatkan
Diperkenalkan di Android 6.0 (API level 23), mode Istirahat meningkatkan masa pakai baterai dengan menunda aktivitas CPU dan jaringan saat pengguna membiarkan perangkat tidak dicolokkan, tidak bergerak, dan dengan layar dinonaktifkan. Android 7.0 menghadirkan peningkatan lebih lanjut pada mode Istirahat dengan menerapkan subset pembatasan CPU dan jaringan saat perangkat tidak dicolokkan dengan layar dinonaktifkan, tetapi tidak harus tidak bergerak, misalnya, saat handset dibawa dalam saku pengguna.
Gambar 1. Ilustrasi tentang cara mode Istirahat menerapkan tingkat pertama pembatasan aktivitas sistem untuk meningkatkan masa pakai baterai.
Saat perangkat menggunakan daya baterai, dan layar telah nonaktif selama waktu tertentu, perangkat akan memasuki mode Istirahatkan dan menerapkan subset pembatasan pertama: Perangkat akan menonaktifkan akses jaringan aplikasi, serta menunda tugas dan sinkronisasi. Jika perangkat
tidak bergerak selama waktu tertentu setelah memasuki mode Istirahatkan, sistem akan menerapkan
pembatasan mode Istirahatkan lainnya ke PowerManager.WakeLock,
alarm AlarmManager, GPS, dan pemindaian Wi-Fi. Terlepas dari
apakah beberapa atau semua pembatasan Istirahat diterapkan, sistem akan mengaktifkan
perangkat untuk masa pemeliharaan singkat, yang memungkinkan aplikasi mengakses
jaringan dan dapat menjalankan tugas/sinkronisasi yang tertunda.
Gambar 2. Ilustrasi cara mode Istirahatkan menerapkan pembatasan aktivitas sistem tingkat kedua setelah perangkat tidak bergerak selama waktu tertentu.
Perlu diperhatikan bahwa mengaktifkan layar atau mencolokkan perangkat akan keluar dari mode Istirahat dan menghapus batasan pemrosesan ini. Perilaku tambahan tidak memengaruhi rekomendasi dan praktik terbaik dalam menyesuaikan aplikasi Anda dengan versi Doze sebelumnya yang diperkenalkan di Android 6.0 (level API 23), seperti yang dibahas dalam Mengoptimalkan Doze 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 Istirahat tambahan.
Project Svelte: Pengoptimalan Latar Belakang
Android 7.0 menghapus tiga siaran implisit untuk membantu mengoptimalkan penggunaan memori dan konsumsi daya. Perubahan ini diperlukan karena siaran implisit sering kali memulai aplikasi yang telah terdaftar untuk memprosesnya di latar belakang. Menghapus siaran ini dapat memberikan manfaat yang signifikan bagi 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 mendaftar untuk menerima siaran ini, satu
peralihan jaringan dapat menyebabkan semuanya aktif dan memproses siaran
sekaligus.
Demikian pula, di Android versi sebelumnya, aplikasi dapat mendaftar untuk menerima siaran ACTION_NEW_PICTURE dan ACTION_NEW_VIDEO implisit dari aplikasi lain, seperti
Kamera. Saat pengguna mengambil foto dengan aplikasi Kamera, aplikasi ini akan aktif
untuk memproses siaran.
Untuk mengatasi masalah ini, Android 7.0 menerapkan pengoptimalan berikut:
- Aplikasi yang menargetkan Android 7.0 (level API 24) dan yang lebih tinggi tidak menerima
siaran
CONNECTIVITY_ACTIONjika aplikasi tersebut mendeklarasikan penerima siarannya di manifes. Aplikasi akan tetap menerima siaranCONNECTIVITY_ACTIONjika mendaftarkanBroadcastReceiverdenganContext.registerReceiver()dan konteks tersebut masih valid. - Sistem tidak lagi mengirim siaran
ACTION_NEW_PICTUREatauACTION_NEW_VIDEO. Pengoptimalan ini memengaruhi semua aplikasi, tidak hanya yang menargetkan Android 7.0.
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 tepat.
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 merespons perubahan pada penyedia konten.
Untuk mengetahui informasi selengkapnya tentang pengoptimalan latar belakang di Android 7.0 (level API 24) dan cara menyesuaikan aplikasi Anda, lihat Pengoptimalan Latar Belakang.
Perubahan Izin
Android 7.0 menyertakan perubahan pada izin yang dapat 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:
-
Izin file pribadi tidak boleh lagi dilonggarkan oleh pemilik,
dan upaya untuk melakukannya menggunakan
MODE_WORLD_READABLEdan/atauMODE_WORLD_WRITEABLE, akan memicuSecurityException.Catatan: Hingga saat ini, pembatasan ini belum sepenuhnya diterapkan. Aplikasi masih dapat mengubah izin ke direktori pribadinya menggunakan API native atau API
File. Namun, sebaiknya jangan melonggarkan izin ke direktori pribadi. -
Meneruskan URI
file://di luar domain paket dapat membuat penerima memiliki jalur yang tidak dapat diakses. Oleh karena itu, upaya untuk meneruskan URIfile://akan memicuFileUriExposedException. Cara yang direkomendasikan untuk membagikan konten file pribadi adalah menggunakanFileProvider. -
DownloadManagertidak dapat lagi membagikan file yang disimpan secara pribadi berdasarkan nama file. Aplikasi lama mungkin berakhir dengan jalur yang tidak dapat diakses saat mengaksesCOLUMN_LOCAL_FILENAME. Aplikasi yang menargetkan Android 7.0 atau yang lebih tinggi akan memicuSecurityExceptionsaat mencoba mengaksesCOLUMN_LOCAL_FILENAME. Aplikasi lama yang menetapkan lokasi download ke lokasi publik dengan menggunakanDownloadManager.Request.setDestinationInExternalFilesDir()atauDownloadManager.Request.setDestinationInExternalPublicDir()masih dapat mengakses jalur diCOLUMN_LOCAL_FILENAME, tetapi metode ini sangat tidak dianjurkan. Cara yang direkomendasikan untuk mengakses file yang diekspos olehDownloadManageradalah menggunakanContentResolver.openFileDescriptor().
Berbagi File Antar-Aplikasi
Untuk aplikasi yang menargetkan Android 7.0, framework Android menerapkan
kebijakan API StrictMode yang melarang ekspos 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 tersebut. 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 penglihatan yang lemah. Perubahan ini umumnya tidak memerlukan perubahan kode di aplikasi Anda, tetapi Anda harus meninjau fitur ini dan mengujinya dengan aplikasi Anda untuk menilai potensi dampak terhadap pengalaman pengguna.
Zoom Layar
Android 7.0 memungkinkan pengguna menyetel Ukuran tampilan yang memperbesar atau memperkecil semua elemen di layar, sehingga meningkatkan aksesibilitas perangkat bagi pengguna dengan gangguan penglihatan. Pengguna tidak dapat memperbesar layar melebihi lebar layar minimum sw320dp, yang merupakan lebar Nexus 4, ponsel berukuran sedang yang umum.
Gambar 3. Layar di sebelah kanan menunjukkan efek peningkatan Ukuran tampilan perangkat yang menjalankan image sistem Android 7.0.
Saat kepadatan perangkat berubah, sistem akan memberi tahu aplikasi yang 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 Setelan dan mengubah setelan Ukuran tampilan, sistem akan menghentikan aplikasi dengan cara yang sama seperti dalam situasi memori rendah. Jika aplikasi memiliki 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 tentang 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 spesifik yang perlu diperiksa:
- Uji aplikasi Anda di perangkat dengan lebar layar
sw320dpdan pastikan aplikasi berfungsi dengan baik. - Saat konfigurasi perangkat berubah, perbarui informasi yang di-cache dan bergantung pada kepadatan, seperti bitmap yang di-cache atau resource yang dimuat dari
jaringan. Periksa perubahan konfigurasi saat aplikasi dilanjutkan 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 perlu me-refresh data yang di-cache setelah perubahan konfigurasi.
- Hindari menentukan dimensi dengan unit px, karena tidak diskalakan dengan
kepadatan layar. Sebagai gantinya, tentukan dimensi dengan unit piksel kepadatan
mandiri (
dp).
Setelan Penglihatan di Wizard Penyiapan
Android 7.0 menyertakan Setelan Penglihatan di 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 yang terkait dengan setelan layar yang berbeda. Untuk menilai dampak fitur ini, Anda harus menguji aplikasi dengan mengaktifkan setelan ini. Anda dapat menemukan setelan di bagian Setelan > Aksesibilitas.
Penautan Aplikasi NDK ke Library Platform
Mulai Android 7.0, sistem mencegah aplikasi menautkan secara dinamis ke library non-NDK, yang dapat menyebabkan aplikasi Anda error. Perubahan perilaku ini bertujuan untuk menciptakan pengalaman aplikasi yang konsisten di seluruh update platform dan berbagai perangkat. Meskipun kode Anda mungkin tidak ditautkan ke library pribadi, ada kemungkinan library statis pihak ketiga di aplikasi Anda melakukannya. Oleh karena itu, semua developer harus memeriksa untuk memastikan bahwa aplikasi mereka tidak error di perangkat yang menjalankan Android 7.0. Jika aplikasi Anda menggunakan kode native, Anda hanya boleh menggunakan NDK API publik.
Ada tiga cara aplikasi Anda mungkin mencoba mengakses API platform pribadi:
- Aplikasi Anda mengakses library platform pribadi secara langsung. Anda harus mengupdate aplikasi untuk menyertakan salinan library tersebut atau menggunakan NDK API publik.
- Aplikasi Anda menggunakan library pihak ketiga yang mengakses library platform pribadi. Meskipun Anda yakin aplikasi Anda tidak mengakses library pribadi secara langsung, Anda tetap harus menguji aplikasi untuk skenario ini.
- Aplikasi Anda merujuk ke library yang tidak disertakan dalam APK-nya. Misalnya,
hal ini dapat terjadi jika Anda mencoba menggunakan salinan OpenSSL Anda sendiri, tetapi
lupa memaketkannya dengan APK aplikasi Anda. Aplikasi dapat berjalan normal pada versi
platform Android yang menyertakan
libcrypto.so. Namun, aplikasi dapat error pada versi Android yang lebih baru yang tidak menyertakan library ini (seperti, Android 6.0 dan yang lebih baru). Untuk memperbaikinya, pastikan Anda memaketkan semua library non-NDK dengan APK Anda.
Aplikasi tidak boleh menggunakan library native yang tidak disertakan dalam NDK karena library tersebut dapat berubah atau dihapus di antara berbagai versi Android. Peralihan dari OpenSSL ke BoringSSL adalah contoh perubahan tersebut. Selain itu, karena tidak ada persyaratan kompatibilitas untuk library platform yang tidak disertakan dalam NDK, perangkat yang berbeda mungkin menawarkan tingkat kompatibilitas yang berbeda.
Untuk mengurangi dampak yang mungkin ditimbulkan oleh pembatasan ini pada aplikasi yang saat ini
dirilis, serangkaian library yang digunakan secara 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 untuk menyertakan salinan library
tersebut atau hanya menggunakan API NDK publik. Rilis platform Android
pada masa mendatang mungkin akan membatasi penggunaan library pribadi sepenuhnya dan menyebabkan
aplikasi Anda error.
Semua aplikasi menghasilkan error runtime saat memanggil API yang tidak
publik atau tidak dapat diakses untuk sementara. Hasilnya,
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 (level API 24). Jika tidak yakin apakah aplikasi Anda 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 runtime menggunakan penaut dinamis | Perilaku Android 7.0 (API level 24) | Perilaku platform Android mendatang |
|---|---|---|---|---|
| NDK Publik | Semua | Mudah diakses | Berfungsi sebagaimana mestinya | Berfungsi sebagaimana mestinya |
| Pribadi (library pribadi yang dapat diakses sementara) | 23 atau yang lebih rendah | Dapat diakses untuk sementara | Berfungsi seperti yang diharapkan, tetapi Anda menerima peringatan logcat. | Error runtime |
| Pribadi (library pribadi yang dapat diakses sementara) | 24 atau lebih tinggi | Dibatasi | Error runtime | Error runtime |
| Pribadi (lainnya) | Semua | Dibatasi | Error runtime | Error runtime |
Memeriksa apakah aplikasi Anda menggunakan library pribadi
Untuk membantu Anda mengidentifikasi masalah saat memuat library pribadi, logcat dapat menghasilkan peringatan atau error runtime. Misalnya, jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah, dan mencoba mengakses library pribadi di perangkat yang menjalankan Android 7.0, Anda mungkin akan melihat peringatan seperti berikut:
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 Anda error. Namun, jika aplikasi menargetkan level API target 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 dapat melihat output logcat ini jika aplikasi Anda menggunakan library pihak ketiga
yang secara dinamis menautkan ke API platform pribadi. Alat readelf di
NDK Android 7.0 memungkinkan Anda membuat daftar semua library bersama yang ditautkan secara dinamis
dari file .so tertentu dengan menjalankan perintah berikut:
aarch64-linux-android-readelf -dW libMyLibrary.so
Update aplikasi Anda
Berikut beberapa langkah yang dapat Anda lakukan 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 untuk menyertakan salinan library tersebut atau menggunakan NDK API publik.
- Jika aplikasi Anda menggunakan library pihak ketiga yang mengakses simbol pribadi, hubungi pembuat library untuk mengupdate library.
- Pastikan Anda memaketkan semua library non-NDK dengan APK Anda.
- Gunakan fungsi JNI standar, bukan
getJavaVMdangetJNIEnvdarilibandroid_runtime.so:AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from <jni.h>.
- Gunakan
__system_property_get, bukan simbolproperty_getpribadi darilibcutils.so. Untuk melakukannya, gunakan__system_property_getdengan penyertaan berikut:#include <sys/system_properties.h>Catatan: Ketersediaan dan konten properti sistem tidak diuji melalui CTS. Perbaikan yang lebih baik adalah dengan menghindari penggunaan properti ini sama sekali.
- Gunakan versi lokal simbol
SSL_ctrldarilibcrypto.so. Misalnya, Anda harus menautkanlibcyrpto.asecara statis dalam file.so, atau menyertakan versilibcrypto.soyang ditautkan secara dinamis dari BoringSSL/OpenSSL dan memaketkannya dalam APK Anda.
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, Anda harus meninjau perubahan ini dan memodifikasi aplikasi Anda.
- Anda harus menginstal penginstal sertifikat yang didelegasikan sebelum DPC dapat
menyetelnya. Untuk aplikasi pemilik perangkat dan profil yang menargetkan Android 7.0 (level API 24),
Anda harus menginstal penginstal sertifikat yang didelegasikan sebelum pengontrol kebijakan
perangkat (DPC) memanggil
DevicePolicyManager.setCertInstallerPackage(). Jika penginstal belum diinstal, sistem akan menampilkanIllegalArgumentException. - Pembatasan reset sandi untuk admin perangkat kini berlaku untuk pemilik
profil. Admin perangkat tidak dapat lagi menggunakan
DevicePolicyManager.resetPassword()untuk menghapus sandi atau mengubah sandi yang sudah ditetapkan. Admin perangkat masih dapat menyetel sandi, tetapi hanya jika perangkat tidak memiliki sandi, PIN, atau pola. - Pemilik perangkat dan profil dapat mengelola akun meskipun pembatasan
ditetapkan. Pemilik perangkat dan pemilik profil dapat memanggil Account Management API
meskipun pembatasan pengguna
DISALLOW_MODIFY_ACCOUNTSditerapkan. - Pemilik perangkat dapat mengelola pengguna sekunder. Saat perangkat
berjalan dalam mode pemilik perangkat, batasan
DISALLOW_ADD_USERakan otomatis ditetapkan. Tindakan ini mencegah pengguna membuat pengguna sekunder yang tidak dikelola. Selain itu, metodeCreateUser()dancreateAndInitializeUser()tidak digunakan lagi; metodeDevicePolicyManager.createAndManageUser()baru menggantikannya. - Pemilik perangkat dapat mengakses ID 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 nilainull. - Setelan Mode Kerja mengontrol akses ke aplikasi kerja. Saat mode kerja nonaktif, peluncur sistem menunjukkan bahwa aplikasi kerja tidak tersedia dengan mengubah warnanya menjadi abu-abu. Mengaktifkan mode kerja lagi akan memulihkan perilaku normal.
- Saat menginstal file PKCS #12 yang berisi rantai sertifikat klien dan
kunci pribadi yang sesuai dari UI Setelan, sertifikat CA dalam
rantai 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 menggunakan UI Setelan secara terpisah, dengan format berenkode DER di ekstensi file .crt atau .cer. - Mulai Android 7.0, pendaftaran dan penyimpanan sidik jari dikelola per pengguna. Jika Device Policy Client (DPC) pemilik profil menargetkan API level 23 (atau 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 tinggi, pengguna dapat menyetel sidik jari khusus untuk profil kerja dengan membuka Setelan > Keamanan > Keamanan profil kerja.
- Status enkripsi baru
ENCRYPTION_STATUS_ACTIVE_PER_USERditampilkan olehDevicePolicyManager.getStorageEncryptionStatus(), untuk menunjukkan bahwa enkripsi aktif dan kunci enkripsi terkait dengan pengguna. Status baru hanya ditampilkan jika DPC menargetkan API Level 24 dan yang lebih tinggi. Untuk aplikasi yang menargetkan API level yang lebih lama,ENCRYPTION_STATUS_ACTIVEakan ditampilkan, meskipun kunci enkripsi bersifat spesifik untuk pengguna atau profil. - Di Android 7.0, beberapa metode yang biasanya memengaruhi seluruh
perangkat akan berperilaku berbeda jika perangkat memiliki profil kerja yang diinstal dengan
tantangan kerja terpisah. Daripada memengaruhi seluruh perangkat, metode
ini hanya berlaku untuk profil kerja. (Daftar lengkap metode tersebut ada 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 indukDevicePolicyManager; Anda bisa mendapatkan induk ini dengan memanggilDevicePolicyManager.getParentProfileInstance(). Misalnya, jika Anda memanggil metodelockNow()instance induk, seluruh perangkat akan dikunci.
Retensi Anotasi
Android 7.0 memperbaiki bug yang menyebabkan visibilitas anotasi diabaikan. Masalah ini memungkinkan runtime mengakses anotasi yang seharusnya tidak dapat diakses. Anotasi ini mencakup:
VISIBILITY_BUILD: Ditujukan agar hanya terlihat pada waktu build.VISIBILITY_SYSTEM: Ditujukan agar terlihat saat runtime, tetapi hanya untuk sistem yang mendasarinya.
Jika aplikasi Anda mengandalkan perilaku ini, tambahkan kebijakan retensi ke anotasi
yang harus
tersedia saat runtime. Anda dapat 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 pada konektivitas HTTPS atau TLS/SSL jika server tidak menegosiasikan cipher suite modern. Perbaikan yang direkomendasikan adalah meningkatkan konfigurasi server untuk mengaktifkan cipher suite dan protokol yang lebih kuat dan lebih modern. Idealnya, TLSv1.2 dan AES-GCM harus diaktifkan, dan cipher suite Forward Secrecy (ECDHE) harus diaktifkan dan diutamakan.
Alternatifnya adalah mengubah aplikasi agar menggunakan SSLSocketFactory kustom untuk berkomunikasi dengan server. Factory
harus dirancang untuk membuat instance SSLSocket
yang mengaktifkan beberapa cipher suite yang diperlukan oleh server,
selain cipher suite default.
Catatan: Perubahan ini tidak berkaitan dengan WebView.
Aplikasi yang menargetkan Android 7.0
Perubahan perilaku ini berlaku secara eksklusif untuk aplikasi yang menargetkan
Android 7.0 (level API 24) atau yang lebih tinggi. Aplikasi yang mengompilasi terhadap Android 7.0,
atau menetapkan targetSdkVersion ke Android 7.0 atau yang lebih tinggi harus memodifikasi
aplikasinya untuk mendukung perilaku ini dengan benar, jika berlaku untuk aplikasi.
Perubahan Serialisasi
Android 7.0 (level API 24) memperbaiki bug dalam penghitungan serialVersionUID default yang tidak sesuai dengan spesifikasi.
Class yang mengimplementasikan Serializable
dan tidak menentukan kolom serialVersionUID eksplisit dapat
mengalami perubahan pada serialVersionUID default-nya, yang akan menyebabkan pengecualian
dimunculkan 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, tambahkan 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, penghitungan juga akan memeriksa super class untuk
penginisialisasi statis jika class tidak memilikinya.
Untuk memperjelas, perubahan ini tidak memengaruhi aplikasi yang menargetkan API level 23 atau
yang lebih rendah, class yang memiliki kolom serialVersionUID, atau class
yang memiliki metode penginisialisasi statis.
Poin Penting Lainnya
- Saat aplikasi berjalan di Android 7.0, tetapi menargetkan level API yang lebih rendah,
dan pengguna mengubah ukuran layar, proses aplikasi akan dihentikan. Aplikasi
harus dapat menangani skenario ini dengan baik. Jika tidak, aplikasi akan error
saat pengguna memulihkannya dari Terbaru.
Anda harus menguji aplikasi untuk memastikan bahwa perilaku ini tidak terjadi. Anda dapat melakukannya dengan menyebabkan error yang sama saat menghentikan aplikasi secara manual menggunakan DDMS.
Aplikasi yang menargetkan Android 7.0 (level API 24) dan yang lebih tinggi tidak otomatis dihentikan saat terjadi 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 error saat dimulai berikutnya. Anda dapat memverifikasi perilaku aplikasi dengan mengubah ukuran font (Setelan > Tampilan > Ukuran font), lalu memulihkan aplikasi dari Terbaru.
-
Karena bug di Android versi sebelumnya, sistem tidak menandai penulisan
ke soket TCP di thread utama sebagai pelanggaran mode ketat. Android 7.0 memperbaiki bug ini.
Aplikasi yang menunjukkan perilaku ini sekarang menampilkan
android.os.NetworkOnMainThreadException. Umumnya, menjalankan operasi jaringan di thread utama bukanlah ide yang baik karena operasi ini biasanya memiliki latensi tinggi yang menyebabkan ANR dan jank. -
Kelompok metode
Debug.startMethodTracing()kini secara default menyimpan output di direktori khusus paket Anda di penyimpanan bersama, bukan di tingkat teratas kartu SD. Artinya, aplikasi tidak perlu lagi meminta izinWRITE_EXTERNAL_STORAGEuntuk menggunakan API ini. -
Banyak API platform kini mulai memeriksa payload besar yang dikirim
di seluruh transaksi
Binder, dan sistem kini menampilkan ulangTransactionTooLargeExceptionssebagaiRuntimeExceptions, bukan mencatat atau menyembunyikannya secara otomatis. Salah satu contoh umum adalah menyimpan terlalu banyak data diActivity.onSaveInstanceState(), yang menyebabkanActivityThread.StopInfomenampilkanRuntimeExceptionsaat aplikasi Anda menargetkan Android 7.0. -
Jika aplikasi memposting tugas
RunnablekeView, danViewtidak dilampirkan ke jendela, sistem akan mengantrekan tugasRunnabledenganView; tugasRunnabletidak akan dieksekusi hinggaViewdilampirkan ke jendela. Perilaku ini memperbaiki bug berikut: -
Jika aplikasi di Android 7.0 dengan izin
DELETE_PACKAGESmencoba menghapus paket, tetapi aplikasi lain telah menginstal paket tersebut, sistem akan memerlukan konfirmasi pengguna. Dalam skenario ini, aplikasi akan menerimaSTATUS_PENDING_USER_ACTIONsebagai status yang ditampilkan saat memanggilPackageInstaller.uninstall(). - Penyedia JCA yang disebut Crypto tidak digunakan lagi, karena satu-satunya algoritmanya, SHA1PRNG, lemah secara kriptografis. Aplikasi tidak dapat lagi menggunakan SHA1PRNG untuk memperoleh kunci (secara tidak aman), karena penyedia ini tidak lagi tersedia. Untuk mengetahui informasi selengkapnya, lihat postingan blog Penyedia "Crypto" Keamanan tidak digunakan lagi di Android N.