| 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> |
| |