page.title=Perubahan Perilaku page.keywords=pratinjau,sdk,kompatibilitas meta.tags="preview", "compatibility" page.tags="preview", "developer preview" page.image=images/cards/card-n-changes_2x.png @jd:body <div id="qv-wrapper"> <div id="qv"> <h2>Dalam dokumen ini</h2> <ol> <li><a href="#perf">Peningkatan Kinerja</a> <ol> <li><a href="#doze">Istirahatkan</a></li> <li><a href="#bg-opt">Optimalisasi Latar Belakang</a></li> </ol> </li> <li><a href="#perm">Perubahan Izin</a> </li> <li><a href="#sharing-files">Berbagi File Antar Aplikasi</a></li> <li><a href="#accessibility">Peningkatan Aksesibilitas</a> <ol> <li><a href="#screen-zoom">Perbesaran Layar</a></li> <li><a href="#vision-settings">Vision Settings di Setup Wizard</a></li> </ol> </li> <li><a href="#ndk">Penautan Aplikasi NDK ke Pustaka Platform</a></li> <li><a href="#afw">Android for Work</a></li> <li><a href="#annotations">Retensi Anotasi</a></li> <li><a href="#other">Poin Penting Lainnya</a></li> </ol> <h2>Lihat Juga</h2> <ol> <li><a href="{@docRoot}preview/api-overview.html"> Ringkasan Android N API</a></li> </ol> </div> </div> <p> Bersama fitur dan kemampuan baru, Android N menyertakan berbagai macam perubahan sistem dan perubahan perilaku API. Dokumen ini menyoroti beberapa perubahan utama yang harus dipahami dan diperhitungkan dalam aplikasi Anda. </p> <p> Jika Anda sebelumnya telah mempublikasikan aplikasi untuk Android, ketahuilah bahwa aplikasi Anda mungkin dipengaruhi oleh perubahan dalam platform. </p> <h2 id="perf">Baterai dan Memori</h2> <p> Android N menyertakan perubahan perilaku sistem yang bertujuan untuk meningkatkan daya tahan baterai perangkat dan mengurangi penggunaan RAM. Perubahan ini bisa memengaruhi akses aplikasi Anda ke sumber daya sistem, termasuk cara aplikasi Anda berinteraksi dengan aplikasi lain melalui intent implisit tertentu. </p> <h3 id="doze">Istirahatkan</h3> <p> Diperkenalkan dalam Android 6.0 (API level 23), Istirahatkan meningkatkan daya tahan baterai dengan menangguhkan aktivitas CPU dan jaringan bila pengguna tidak mencabut perangkat, tidak bergerak, dan layar dinonaktifkan. Android N lebih menyempurnakan Istirahatkan dengan menerapkan subset CPU dan pembatasan jaringan bila perangkat dicabut dan layar dinonaktifkan, namun tidak harus diam, misalnya, bila handset dibawa bepergian di saku pengguna. </p> <img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" /> <p class="img-caption"> <strong>Gambar 1.</strong> Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem level pertama untuk meningkatkan daya tahan baterai. </p> <p> Bila perangkat sedang menggunakan daya baterai, dan layar telah nonaktif selama jangka waktu tertentu, perangkat akan memasuki Istirahatkan dan menerapkan subset pembatasan pertama: Perangkat akan menutup akses jaringan aplikasi, serta menangguhkan pekerjaan dan sinkronisasi. Jika perangkat sedang diam selama jangka waktu tertentu setelah memasuki Istirahatkan, sistem akan menerapkan pembatasan Istirahatkan selebihnya terhadap alarm {@link android.os.PowerManager.WakeLock}, {@link android.app.AlarmManager}, GPS, dan pemindaian Wi-Fi. Tidak peduli apakah sebagian atau semua pembatasan Istirahatkan diterapkan, sistem akan membangunkan perangkat selama jeda pemeliharaan singkat, dan selama itu aplikasi diizinkan mengakses jaringan dan bisa mengeksekusi semua pekerjaan/sinkronisasi yang telah ditangguhkan. </p> <img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" /> <p class="img-caption"> <strong>Gambar 2.</strong> Ilustrasi tentang cara Istirahatkan menerapkan pembatasan aktivitas sistem level kedua setelah perangkat diam selama jangka waktu tertentu. </p> <p> Perhatikan, mengaktifkan layar atau mencolokkan steker perangkat akan mengeluarkan dari Istirahatkan dan membuang pembatasan pemrosesan ini. Perilaku tambahan ini tidak memengaruhi rekomendasi dan praktik terbaik dalam menyesuaikan aplikasi Anda dengan versi Istirahatkan sebelumnya yang diperkenalkan dalam Android 6.0 (API level 23), seperti yang dibahas di <a href="{@docRoot}training/monitoring-device-state/doze-standby.html"> Mengoptimalkan untuk Istirahatkan dan Aplikasi Siaga</a>. Anda tetap harus mengikuti rekomendasi itu, seperti menggunakan Google Cloud Messaging (GCM) untuk mengirim dan menerima pesan, serta mulai merencanakan pembaruan untuk mengakomodasi perilaku Istirahatkan tambahan. </p> <h3 id="bg-opt">Project Svelte: Optimalisasi Latar Belakang</h3> <p> Android N membuang tiga siaran implisit untuk membantu mengoptimalkan penggunaan memori dan konsumsi daya. Perubahan ini penting karena siaran implisit sering memulai aplikasi yang telah didaftarkan untuk mendengarkannya di latar belakang. Membuang siaran ini bisa sangat menguntungkan kinerja perangkat dan pengalaman pengguna. </p> <p> Perangkat seluler seringkali mengalami perubahan konektivitas, seperti saat berpindah antara Wi-Fi dan data seluler. Saat ini, aplikasi bisa memantau perubahan dalam konektivitas dengan mendaftarkan suatu penerima untuk siaran implisit {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} dalam manifes mereka. Karena banyak aplikasi yang didaftarkan untuk menerima siaran ini, switch jaringan tunggal bisa menyebabkan semuanya aktif dan memproses siaran tersebut secara bersamaan. </p> <p> Demikian pula, dalam Android versi sebelumnya, aplikasi bisa mendaftar untuk menerima siaran implisit {@link android.hardware.Camera#ACTION_NEW_PICTURE} dan {@link android.hardware.Camera#ACTION_NEW_VIDEO} dari aplikasi lain, seperti Kamera. Bila pengguna mengambil gambar dengan aplikasi Kamera, semua aplikasi ini akan aktif untuk memproses siaran. </p> <p> Untuk meminimalkan masalah ini, Android N menerapkan optimalisasi berikut: </p> <ul> <li>Aplikasi yang menargetkan Android N tidak menerima siaran {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, sekalipun memiliki entri manifes untuk meminta pemberitahuan mengenai kejadian ini. Aplikasi yang berjalan tetap bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread utama jika mereka meminta pemberitahuan dengan {@link android.content.BroadcastReceiver}. </li> <li>Aplikasi tidak bisa mengirim atau menerima siaran {@link android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link android.hardware.Camera#ACTION_NEW_VIDEO}. Optimalisasi ini memengaruhi semua aplikasi, bukan hanya aplikasi yang menargetkan Android N. </li> </ul> <p>Jika aplikasi Anda menggunakan intent ini, Anda harus membuang dependensi padanya secepat mungkin agar Anda bisa menargetkan perangkat Android N dengan benar. Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler} API menyediakan mekanisme yang tangguh untuk menjadwalkan operasi jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan berbiaya tetap, terpenuhi. Anda juga dapat menggunakan {@link android.app.job.JobScheduler} untuk bereaksi terhadap perubahan pada penyedia materi. </p> <p> Untuk informasi selengkapnya tentang optimalisasi latar belakang di N dan cara menyesuaikan aplikasi Anda, lihat <a href="{@docRoot}preview/features/background-optimization.html">Optimalisasi Latar Belakang</a>. </p> <h2 id="perm">Perubahan Izin</h2> <p> Android N menyertakan perubahan pada izin yang bisa memengaruhi aplikasi Anda. </p> <h3 id="permfilesys">Perubahan izin sistem file</h3> <p> Guna meningkatkan keamanan file privat, direktori privat aplikasi yang menargetkan Android N atau yang lebih tinggi memiliki akses terbatas (<code>0700</code>). Pengaturan ini mencegah kebocoran metadata dari file privat, seperti ukuran atau eksistensi. Perubahan izin ini memiliki beberapa efek samping: </p> <ul> <li> Izin file privat tidak boleh dianggap remeh oleh pemilik, dan usaha untuk melakukannya menggunakan {@link android.content.Context#MODE_WORLD_READABLE} dan/atau {@link android.content.Context#MODE_WORLD_WRITEABLE}, akan memicu sebuah {@link java.lang.SecurityException}. <p class="note"> <strong>Catatan:</strong> Seperti sebelumnya, pembatasan ini tidak sepenuhnya diterapkan. Aplikasi mungkin masih memodifikasi izin ke direktori privat mereka menggunakan API asal atau {@link java.io.File File} API. Akan tetapi, kami sangat tidak menyarankan Anda meremehkan izin direktori privat. </p> </li> <li> Meneruskan URI <code>file://</code> di luar domain paket dapat meninggalkan penerima dengan jalur yang tidak bisa di akses. Karena itu, upaya untuk meneruskan URI <code>file://</code> akan memicu <code>FileUriExposedException</code>. Cara yang disarankan adalah materi file privat menggunakan {@link android.support.v4.content.FileProvider}. </li> <li> {@link android.app.DownloadManager} tidak bisa lagi berbagi file yang tersimpan secara privat berdasarkan nama file. Aplikasi lawas dapat mengakibatkan jalur yang tidak dapat diakses saat mengakses {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Aplikasi yang menargetkan Android N atau yang lebih tinggi akan memicu {@link java.lang.SecurityException} saat berupaya mengakses {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Aplikasi lawas yang menyetel lokasi unduhan ke lokasi publik dengan menggunakan {@link android.app.DownloadManager.Request#setDestinationInExternalFilesDir DownloadManager.Request.setDestinationInExternalFilesDir()} atau {@link android.app.DownloadManager.Request#setDestinationInExternalPublicDir DownloadManager.Request.setDestinationInExternalPublicDir()} tetap bisa mengakses jalur tersebut di {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}, akan tetapi, metode ini sangat tidak disarankan. Cara yang disarankan untuk mengakses file yang diekspos oleh {@link android.app.DownloadManager} adalah menggunakan {@link android.content.ContentResolver#openFileDescriptor ContentResolver.openFileDescriptor()}. </li> </ul> <h2 id="sharing-files">Berbagi File Antar Aplikasi</h2> <p> Untuk aplikasi yang menargetkan Android N, kerangka kerja Android menerapkan kebijakan {@link android.os.StrictMode} API yang melarang mengekspos URI {@code file://} di luar aplikasi Anda. Jika sebuah intent berisi URI file meninggalkan aplikasi Anda, aplikasi tersebut akan gagal dengan pengecualian {@code FileUriExposedException}. </p> <p> Untuk berbagi file antar aplikasi, Anda harus mengirim URI {@code content://} dan memberikan izin akses sementara pada URI. Cara termudah untuk memberikan izin ini adalah dengan menggunakan kelas {@link android.support.v4.content.FileProvider}. Untuk informasi selengkapnya mengenai izin dan berbagi file, lihat <a href="{@docRoot}training/secure-file-sharing/index.html">Berbagi File</a>. </p> <h2 id="accessibility">Peningkatan Aksesibilitas</h2> <p> Android N menyertakan perubahan yang bertujuan meningkatkan kegunaan platform untuk pengguna dengan penglihatan yang rendah atau lemah. Perubahan ini umumnya tidak memerlukan perubahan kode dalam aplikasi Anda, akan tetapi Anda harus memeriksa fitur ini dan mengujinya dengan aplikasi untuk menilai kemungkinan dampaknya terhadap pengalaman pengguna. </p> <h3 id="screen-zoom">Perbesaran Layar</h3> <p> Android N memungkinkan pengguna menyetel <strong>Display size</strong> yang akan memperbesar atau memperkecil semua elemen pada layar, sehingga meningkatkan aksesibilitas perangkat bagi pengguna yang kurang melihat. Pengguna tidak bisa memperbesar layar melewati lebar layar minimum <a href="http://developer.android.com/guide/topics/resources/providing-resources.html"> sw320dp</a>, yang merupakan lebar Nexus 4, yakni ponsel ukuran sedang pada umumnya. </p> <div class="cols"> <div class="col-6"> <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" /> </div> <div class="col-6"> <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" /> </div> </div> <!-- end cols --> <p class="img-caption"> <strong>Gambar 3.</strong> Layar di sebelah kanan menampilkan efek penambahan Display size perangkat yang menjalankan citra sistem Android N. </p> <p> Bila kepadatan perangkat berubah, sistem akan memberi tahu aplikasi yang sedang berjalan dengan cara berikut: </p> <ul> <li>Jika aplikasi menargetkan API level 23 atau yang lebih rendah, sistem secara otomatis akan mematikan semua proses latar belakang. Artinya, jika pengguna beralih dari aplikasi tersebut untuk membuka layar <em>Settings</em> dan mengubah setelan <strong>Display size</strong>, maka sistem akan mematikan aplikasi tersebut dengan cara yang sama dengan saat memori tinggal sedikit. Jika aplikasi memiliki beberapa proses latar depan, sistem akan memberi tahu proses tersebut mengenai perubahan konfigurasi seperti dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan Waktu Proses</a>, seolah-olah orientasi perangkat telah berubah. </li> <li>Jika sebuah aplikasi menargetkan Android N, semua prosesnya (latar depan dan latar belakang) akan diberi tahu mengenai perubahan konfigurasi seperti dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan Waktu Proses</a>. </li> </ul> <p> Sebagian besar aplikasi tidak perlu melakukan perubahan untuk mendukung fitur ini, asalkan aplikasi tersebut mengikuti praktik terbaik Android. Hal-hal tertentu yang harus diperiksa: </p> <ul> <li>Uji aplikasi Anda pada perangkat dengan lebar layar <code><a href= "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code> dan pastikan aplikasi berjalan dengan semestinya. </li> <li>Bila konfigurasi perangkat berubah, perbarui informasi cache yang bergantung pada kepadatan, seperti bitmap di cache atau sumber daya yang dimuat dari jaringan. Periksa perubahan konfigurasi bila aplikasi melanjutkan dari status dihentikan sementara. <p class="note"> <strong>Catatan:</strong> Catatan: Jika Anda meng-cache data yang bergantung pada konfigurasi, ada baiknya untuk menyertakan metadata yang relevan seperti ukuran layar atau kepadatan piksel yang sesuai untuk data tersebut. Menyimpan metadata ini memungkinkan Anda untuk memutuskan apakah Anda perlu segarkan data cache setelah perubahan konfigurasi. </p> </li> <li>Hindari menetapkan dimensi dengan satuan px, karena satuan ini tidak diskalakan dengan kepadatan layar. Sebagai gantinya, tetapkan dimensi dengan satuan <a href="{@docRoot}guide/practices/screens_support.html">piksel yang tidak bergantung kepadatan </a> (<code>dp</code>). </li> </ul> <h3 id="vision-settings">Vision Settings di Setup Wizard</h3> <p> Android N menyertakan Vision Settings di layar Sambutan, di mana pengguna bisa menyiapkan setelan aksesibilitas berikut pada perangkat baru: <strong>Magnification gesture</strong>, <strong>Font size</strong>, <strong>Display size</strong> dan <strong>TalkBack</strong>. Perubahan ini meningkatkan visibilitas bug terkait dengan setelan layar yang berbeda. Untuk mengurangi dampak fitur ini, Anda harus menguji aplikasi dengan setelan ini diaktifkan. Anda bisa menemukannya pada <strong>Settings > Accessibility</strong>. </p> <h2 id="ndk">Penautan Aplikasi NDK ke Pustaka Platform</h2> <p> Android N menyertakan perubahan ruang nama untuk mencegah pemuatan API non-publik. Jika menggunakan NDK, Anda hanya boleh menggunakan API publik dari platform Android. Menggunakan API non-publik dalam rilis Android resmi berikutnya bisa menyebabkan aplikasi mogok. </p> <p> Untuk memberi tahu Anda agar menggunakan API non-publik, aplikasi yang berjalan pada perangkat Android N akan menghasilkan kesalahan dalam keluaran logcat bila aplikasi memanggil API non-publik. Kesalahan ini juga ditampilkan di layar perangkat berupa pesan untuk membantu meningkatkan kepedulian terhadap situasi ini. Anda harus memeriksa kode aplikasi untuk membuang penggunaan API platform non-publik dan secara saksama menguji aplikasi Anda menggunakan perangkat pratinjau atau emulator. </p> <p> Jika aplikasi Anda bergantung pada pustaka platform, lihat dokumentasi NDK untuk perbaikan tipikal guna menggantikan API privat umum dengan padanan API publik. Anda mungkin juga menautkan ke pustaka platform tanpa menyadarinya, terutama jika aplikasi Anda menggunakan pustaka yang merupakan bagian dari platform ini (seperti <code>libpng</code>), namun bukan bagian dari NDK. Dalam hal itu, pastikan APK Anda berisi semua file .so yang ingin ditautkan. </p> <p class="caution"> <strong>Perhatian:</strong> Beberapa pustaka pihak ketiga mungkin menautkan ke API non-publik. Jika menggunakan pustaka ini, aplikasi Anda bisa mogok saat dijalankan pada rilis resmi Android berikutnya. </p> <p> Aplikasi tidak boleh bergantung pada atau menggunakan pustaka bawaan yang tidak disertakan dalam NDK, karena bisa mengalami perubahan, atau dipindahkan dari satu rilis Android ke rilis lainnya. Peralihan dari OpenSSL ke BoringSSL merupakan satu contoh dari perubahan semacam ini. Selain itu, perangkat yang berbeda bisa menawarkan tingkat kompatibilitas yang berbeda, karena tidak ada persyaratan kompatibilitas untuk pustaka platform yang tidak disertakan dalam NDK. Jika Anda harus mengakses pustaka non-NDK pada perangkat yang lebih lama, jadikan pemuatan bergantung pada level Android API. </p> <p> Untuk membantu Anda mendiagnosis tipe masalah ini ada beberapa contoh kesalahan Java dan NDK yang mungkin Anda temui saat berusaha membangun aplikasi dengan Android N: </p> <p>Contoh kesalahan Java:</p> <pre class="no-pretty-print"> java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace" </pre> <p>Contoh kesalahan NDK:</p> <pre class="no-pretty-print"> dlopen failed: cannot locate symbol "__system_property_get" referenced by ... </pre> <p> Inilah beberapa perbaikan tipikal untuk aplikasi yang mengalami tipe kesalahan ini: </p> <ul> <li>Penggunaan getJavaVM dan getJNIEnv dari libandroid_runtime.so bisa diganti dengan fungsi JNI standar: <pre class="no-pretty-print"> AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from <jni.h>. </pre> </li> <li>Penggunaan simbol {@code property_get} dari {@code libcutils.so} bisa diganti dengan {@code alternative __system_property_get} publik. Caranya, gunakan {@code __system_property_get} dengan menyertakan yang berikut: <pre> #include <sys/system_properties.h> </pre> </li> <li>Penggunaan simbol {@code SSL_ctrl} dari {@code libcrypto.so} harus diganti dengan aplikasi versi lokal. Misalnya, Anda harus menautkan {@code libcyrpto.a} secara statis dalam file {@code .so} atau menyertakan {@code libcrypto.so} Anda sendiri secara dinamis dari BoringSSL atau OpenSSL dalam aplikasi Anda. </li> </ul> <h2 id="afw">Android for Work</h2> <p> Android N berisi perubahan untuk aplikasi yang menargetkan Android for Work, termasuk perubahan pada pemasangan sertifikat, penyetelan ulang sandi, manajemen pengguna tambahan, dan akses ke identifier perangkat. Jika Anda membangun aplikasi untuk lingkungan Android for Work, Anda harus meninjau perubahan ini dan memodifikasi aplikasi sebagaimana mestinya. </p> <ul> <li>Anda harus pasang pemasang sertifikat yang didelegasikan sebelum DPC bisa menyetelnya. Untuk aplikasi profil dan aplikasi pemilik perangkat yang menargetkan N SDK, Anda harus pasang pemasang sertifikat yang didelegasikan sebelum pengontrol kebijakan perangkat (DPC) memanggil <code>DevicePolicyManager.setCertInstallerPackage()</code>. Jika pemasang belum dipasang, sistem akan melontarkan <code>IllegalArgumentException</code>. </li> <li>Pembatasan sandi penyetelan ulang untuk admin perangkat sekarang diterapkan ke pemilik profil. Admin perangkat tidak bisa lagi menggunakan {@code DevicePolicyManager.resetPassword()} untuk menghapus sandi atau mengubah sandi yang sudah disetel. Admin perangkat tetap bisa menyetel sandi, namun hanya bila perangkat belum memiliki sandi, PIN, atau pola. </li> <li>Pemilik perangkat dan profil bisa mengelola akun meskipun pembatasan telah disetel. Pemilik perangkat dan pemilik profil bisa memanggil Account Management API sekalipun pembatasan pengguna <code>DISALLOW_MODIFY_ACCOUNTS</code> diberlakukan. </li> <li>Pemilik perangkat bisa mengelola pengguna tambahan lebih mudah. Bila perangkat berjalan dalam mode pemilik perangkat, maka pembatasan <code>DISALLOW_ADD_USER</code> secara otomatis akan ditetapkan. Ini mencegah pengguna membuat pengguna tambahan yang tidak terkelola. Selain itu, <code>CreateUser()</code> dan <code>createAndInitializeUser()</code> metode tidak digunakan lagi; metode <code>DevicePolicyManager.createAndManageUser()</code> telah menggantikannya. </li> <li>Pemilik perangkat bisa mengakses identifier perangkat. Pemilik perangkat bisa mengakses alamat MAC Wi-Fi dari perangkat, menggunakan <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Jika Wi-Fi belum pernah diaktifkan pada perangkat tersebut, metode ini akan mengembalikan nilai {@code null}. </li> <li>Setelan Mode Kerja mengontrol akses ke aplikasi kerja. Bila mode kerja tidak aktif, peluncur sistem akan menunjukkan aplikasi kerja tidak tersedia dengan membuat warnanya jadi abu-abu. Mengaktifkan kembali mode kerja akan memulihkan perilaku normal. </ul> <p> Untuk informasi selengkapnya tentang perubahan Android for Work di Android N, lihat <a href="{@docRoot}preview/features/afw.html">Pembaruan Android for Work</a>. </p> <h2 id="annotations">Retensi Anotasi</h2> <p> Android N memperbaiki bug dengan visibilitas anotasi diabaikan. Masalah ini mengaktifkan waktu proses untuk mengakses anotasi yang seharusnya tidak bisa dilakukan. Anotasi ini termasuk: </p> <ul> <li>{@code VISIBILITY_BUILD}: Dimaksudkan agar hanya bisa terlihat pada waktu pembuatan.</li> <li>{@code VISIBILITY_SYSTEM}: Dimaksud agar bisa terlihat pada waktu proses, namun hanya pada sistem yang mendasarinya.</li> </ul> <p> Jika aplikasi Anda mengandalkan perilaku ini, tambahkan kebijakan retensi untuk anotasi yang harus tersedia di waktu proses. Caranya dengan menggunakan {@code @Retention(RetentionPolicy.RUNTIME)}. </p> <h2 id="other">Poin Penting Lainnya</h2> <ul> <li>Bila aplikasi berjalan pada Android N, namun menargetkan level API yang lebih rendah, dan pengguna mengubah ukuran tampilan, proses aplikasi akan dimatikan. Aplikasi harus dapat menangani skenario ini dengan lancar. Jika tidak, maka akan mogok bila pengguna memulihkannya dari Recents. <p> Anda harus menguji aplikasi untuk memastikan perilaku ini tidak terjadi. Anda bisa melakukannya dengan menyebabkan suatu mogok yang identik saat mematikan aplikasi secara manual melalui DDMS. </p> <p> Aplikasi yang menargetkan N dan yang di atasnya tidak secara otomatis dimatikan saat perubahan kepadatan; akan tetapi, aplikasi tersebut mungkin tetap merespons perubahan konfigurasi dengan buruk. </p> </li> <li> Aplikasi pada Android N harus mampu menangani perubahan konfigurasi dengan lancar, dan tidak boleh mengalami mogok pada start selanjutnya. Anda bisa memverifikasi perilaku aplikasi dengan mengubah ukuran font (<strong>Setting</strong> > <strong>Display</strong> > <strong>Font size</strong>), kemudian memulihkan aplikasi dari Recents. </li> <li> Dikarenakan adanya bug di versi Android sebelumnya, sistem tidak menandai penulisan ke soket TCP di thread utama sebagai pelanggaran mode-ketat. Android N memperbaiki bug ini. Aplikasi yang menunjukkan perilaku ini kini melontarkan sebuah {@code android.os.NetworkOnMainThreadException}. Secara umum, melakukan operasi jaringan di thread utama tidak baik karena operasi ini biasanya memiliki latensi tinggi yang menyebabkan ANR dan jank. </li> <li> Kelompok metode {@code Debug.startMethodTracing()} kini default ke keluaran penyimpanan di direktori paket tertentu di penyimpanan bersama, sebagai ganti di level teratas kartu SD. Berarti aplikasi tidak perlu lagi meminta izin {@code WRITE_EXTERNAL_STORAGE} untuk menggunakan API ini. </li> <li> Banyak platform API yang kini mulai memeriksa beban besar yang dikirim ke seluruh transaksi {@link android.os.Binder}, dan sistem kini melontarkan kembali {@code TransactionTooLargeExceptions} sebagai {@code RuntimeExceptions}, sebagai ganti logging secara diam-diam atau menyembunyikannya. Satu contoh umum adalah menyimpan terlalu banyak data di {@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()}, yang menyebabkan {@code ActivityThread.StopInfo} melontarkan {@code RuntimeException} bila aplikasi Anda menargetkan Android N. </li> <li> Jika sebuah aplikasi mengeposkan tugas {@link java.lang.Runnable} ke{@link android.view.View}, dan {@link android.view.View} tidak terpasang ke jendela, sistem akan mengantrekan tugas {@link java.lang.Runnable} dengan {@link android.view.View}; tugas {@link java.lang.Runnable} tidak akan dieksekusi hingga {@link android.view.View} terpasang ke jendela. Perilaku ini mengatasi bug berikut: <ul> <li>Jika sebuah aplikasi mengeposkan ke {@link android.view.View} dari thread selain thread UI jendela yang dimaksud, maka {@link java.lang.Runnable} mungkin akan menjalankan thread yang salah. </li> <li>Jika tugas {@link java.lang.Runnable} diposkan dari thread selain looper-thread, aplikasi bisa mengekspos tugas {@link java.lang.Runnable}.</li> </ul> </li> <li> Jika sebuah aplikasi di Android N dengan izin{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES} mencoba menghapus sebuah paket, namun sebuah aplikasi berbeda telah memasang paket itu, sistem akan memerlukan konfirmasi pengguna. Dalam skenario ini, aplikasi harus mengharapkan {@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION} sebagai status kembalian bila memanggil {@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}. </li> </ul>