1page.title=Perubahan Perilaku 2page.keywords=pratinjau,sdk,kompatibilitas 3meta.tags="preview", "compatibility" 4page.tags="preview", "developer preview" 5page.image=images/cards/card-n-changes_2x.png 6@jd:body 7 8 9<div id="qv-wrapper"> 10<div id="qv"> 11 12<h2>Dalam dokumen ini</h2> 13 14<ol> 15 <li><a href="#perf">Peningkatan Kinerja</a> 16 <ol> 17 <li><a href="#doze">Istirahatkan</a></li> 18 <li><a href="#bg-opt">Optimalisasi Latar Belakang</a></li> 19 </ol> 20 </li> 21 <li><a href="#perm">Perubahan Izin</a> 22 </li> 23 <li><a href="#sharing-files">Berbagi File Antar Aplikasi</a></li> 24 <li><a href="#accessibility">Peningkatan Aksesibilitas</a> 25 <ol> 26 <li><a href="#screen-zoom">Perbesaran Layar</a></li> 27 <li><a href="#vision-settings">Vision Settings di Setup Wizard</a></li> 28 </ol> 29 </li> 30 <li><a href="#ndk">Penautan Aplikasi NDK ke Pustaka Platform</a></li> 31 <li><a href="#afw">Android for Work</a></li> 32 <li><a href="#annotations">Retensi Anotasi</a></li> 33 <li><a href="#other">Poin Penting Lainnya</a></li> 34</ol> 35 36<h2>Lihat Juga</h2> 37<ol> 38 <li><a href="{@docRoot}preview/api-overview.html"> 39 Ringkasan Android N API</a></li> 40</ol> 41 42</div> 43</div> 44 45 46<p> 47 Bersama fitur dan kemampuan baru, Android N 48 menyertakan berbagai macam perubahan sistem dan perubahan perilaku API. Dokumen ini 49 menyoroti beberapa perubahan utama yang harus dipahami dan diperhitungkan 50 dalam aplikasi Anda. 51</p> 52 53<p> 54 Jika Anda sebelumnya telah mempublikasikan aplikasi untuk Android, ketahuilah bahwa aplikasi Anda 55 mungkin dipengaruhi oleh perubahan dalam platform. 56</p> 57 58 59<h2 id="perf">Baterai dan Memori</h2> 60 61<p> 62Android N menyertakan perubahan perilaku sistem yang bertujuan untuk meningkatkan daya tahan baterai 63perangkat dan mengurangi penggunaan RAM. Perubahan ini bisa memengaruhi akses aplikasi Anda ke 64sumber daya sistem, termasuk cara aplikasi Anda berinteraksi dengan aplikasi lain melalui 65intent implisit tertentu. 66</p> 67 68<h3 id="doze">Istirahatkan</h3> 69 70<p> 71 Diperkenalkan dalam Android 6.0 (API level 23), Istirahatkan meningkatkan daya tahan baterai dengan 72 menangguhkan aktivitas CPU dan jaringan bila pengguna tidak mencabut perangkat, 73 tidak bergerak, dan layar dinonaktifkan. Android N lebih 74 menyempurnakan Istirahatkan dengan menerapkan subset CPU dan pembatasan jaringan 75 bila perangkat dicabut dan layar dinonaktifkan, namun tidak harus 76 diam, misalnya, bila handset dibawa bepergian di saku pengguna. 77</p> 78 79 80<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" /> 81<p class="img-caption"> 82 <strong>Gambar 1.</strong> Ilustrasi tentang cara Istirahatkan menerapkan pembatasan 83 aktivitas sistem level pertama untuk meningkatkan daya tahan baterai. 84</p> 85 86<p> 87 Bila perangkat sedang menggunakan daya baterai, dan layar telah nonaktif selama jangka waktu 88 tertentu, perangkat akan memasuki Istirahatkan dan menerapkan subset pembatasan pertama: Perangkat 89 akan menutup akses jaringan aplikasi, serta menangguhkan pekerjaan dan sinkronisasi. Jika perangkat sedang 90 diam selama jangka waktu tertentu setelah memasuki Istirahatkan, sistem akan menerapkan 91 pembatasan Istirahatkan selebihnya terhadap alarm {@link android.os.PowerManager.WakeLock}, 92 {@link android.app.AlarmManager}, GPS, dan pemindaian Wi-Fi. Tidak peduli 93 apakah sebagian atau semua pembatasan Istirahatkan diterapkan, sistem akan membangunkan 94 perangkat selama jeda pemeliharaan singkat, dan selama itu aplikasi diizinkan 95 mengakses jaringan dan bisa mengeksekusi semua pekerjaan/sinkronisasi yang telah ditangguhkan. 96</p> 97 98 99<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" /> 100<p class="img-caption"> 101 <strong>Gambar 2.</strong> Ilustrasi tentang cara Istirahatkan menerapkan pembatasan 102 aktivitas sistem level kedua setelah perangkat diam selama jangka waktu tertentu. 103</p> 104 105<p> 106 Perhatikan, mengaktifkan layar atau mencolokkan steker perangkat akan mengeluarkan dari Istirahatkan 107 dan membuang pembatasan pemrosesan ini. Perilaku tambahan ini tidak 108 memengaruhi rekomendasi dan praktik terbaik dalam menyesuaikan aplikasi Anda dengan versi 109 Istirahatkan sebelumnya yang diperkenalkan dalam Android 6.0 (API level 23), seperti yang dibahas di 110 <a href="{@docRoot}training/monitoring-device-state/doze-standby.html"> 111 Mengoptimalkan untuk Istirahatkan dan Aplikasi Siaga</a>. Anda tetap harus 112 mengikuti rekomendasi itu, seperti menggunakan Google Cloud Messaging (GCM) untuk 113 mengirim dan menerima pesan, serta mulai merencanakan pembaruan 114 untuk mengakomodasi perilaku Istirahatkan tambahan. 115</p> 116 117 118<h3 id="bg-opt">Project Svelte: Optimalisasi Latar Belakang</h3> 119 120<p> 121 Android N membuang tiga siaran implisit untuk membantu mengoptimalkan 122 penggunaan memori dan konsumsi daya. Perubahan ini penting karena siaran 123 implisit sering memulai aplikasi yang telah didaftarkan untuk mendengarkannya di 124 latar belakang. Membuang siaran ini bisa sangat menguntungkan 125 kinerja perangkat dan pengalaman pengguna. 126</p> 127 128<p> 129 Perangkat seluler seringkali mengalami perubahan konektivitas, seperti saat berpindah 130 antara Wi-Fi dan data seluler. Saat ini, aplikasi bisa memantau perubahan dalam 131 konektivitas dengan mendaftarkan suatu penerima untuk siaran implisit {@link 132 android.net.ConnectivityManager#CONNECTIVITY_ACTION} dalam manifes 133 mereka. Karena banyak aplikasi yang didaftarkan untuk menerima siaran ini, switch jaringan tunggal 134 bisa menyebabkan semuanya aktif dan memproses siaran tersebut 135 secara bersamaan. 136</p> 137 138<p> 139 Demikian pula, dalam Android versi sebelumnya, aplikasi bisa mendaftar untuk menerima siaran implisit {@link 140 android.hardware.Camera#ACTION_NEW_PICTURE} dan {@link 141 android.hardware.Camera#ACTION_NEW_VIDEO} dari aplikasi lain, seperti 142 Kamera. Bila pengguna mengambil gambar dengan aplikasi Kamera, semua aplikasi ini akan aktif 143 untuk memproses siaran. 144</p> 145 146<p> 147 Untuk meminimalkan masalah ini, Android N menerapkan optimalisasi 148 berikut: 149</p> 150 151<ul> 152 <li>Aplikasi yang menargetkan Android N tidak menerima siaran {@link 153 android.net.ConnectivityManager#CONNECTIVITY_ACTION}, sekalipun 154 memiliki entri manifes untuk meminta pemberitahuan mengenai kejadian ini. Aplikasi 155 yang berjalan tetap bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread utama 156 jika mereka meminta pemberitahuan dengan {@link android.content.BroadcastReceiver}. 157 </li> 158 159 <li>Aplikasi tidak bisa mengirim atau menerima siaran {@link 160 android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link 161 android.hardware.Camera#ACTION_NEW_VIDEO}. Optimalisasi ini 162 memengaruhi semua aplikasi, bukan hanya aplikasi yang menargetkan Android N. 163 </li> 164</ul> 165 166<p>Jika aplikasi Anda menggunakan intent ini, Anda harus membuang dependensi padanya 167 secepat mungkin agar Anda bisa menargetkan perangkat Android N dengan benar. 168 Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan 169 siaran implisit ini. Misalnya, {@link 170 android.app.job.JobScheduler} API menyediakan mekanisme yang tangguh untuk menjadwalkan 171 operasi jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan 172 berbiaya tetap, terpenuhi. Anda juga dapat menggunakan {@link 173 android.app.job.JobScheduler} untuk bereaksi terhadap perubahan pada penyedia materi. 174</p> 175 176<p> 177 Untuk informasi selengkapnya tentang optimalisasi latar belakang di N dan cara menyesuaikan aplikasi Anda, 178 lihat <a href="{@docRoot}preview/features/background-optimization.html">Optimalisasi 179 Latar Belakang</a>. 180</p> 181 182<h2 id="perm">Perubahan Izin</h2> 183 184<p> 185 Android N menyertakan perubahan pada izin yang bisa memengaruhi aplikasi Anda. 186</p> 187 188<h3 id="permfilesys">Perubahan izin sistem file</h3> 189 190<p> 191 Guna meningkatkan keamanan file privat, direktori privat 192 aplikasi yang menargetkan Android N atau yang lebih tinggi memiliki akses terbatas (<code>0700</code>). 193 Pengaturan ini mencegah kebocoran metadata dari file privat, seperti ukuran 194 atau eksistensi. Perubahan izin ini memiliki beberapa efek samping: 195</p> 196 197<ul> 198 <li> 199 Izin file privat tidak boleh dianggap remeh oleh pemilik, 200 dan usaha untuk melakukannya menggunakan 201 {@link android.content.Context#MODE_WORLD_READABLE} dan/atau 202 {@link android.content.Context#MODE_WORLD_WRITEABLE}, akan memicu sebuah 203 {@link java.lang.SecurityException}. 204 <p class="note"> 205 <strong>Catatan:</strong> Seperti sebelumnya, pembatasan ini tidak sepenuhnya diterapkan. 206 Aplikasi mungkin masih memodifikasi izin ke direktori privat mereka menggunakan 207 API asal atau {@link java.io.File File} API. Akan tetapi, kami sangat 208 tidak menyarankan Anda meremehkan izin direktori privat. 209 </p> 210 </li> 211 <li> 212 Meneruskan URI <code>file://</code> di luar domain paket dapat meninggalkan 213 penerima dengan jalur yang tidak bisa di akses. Karena itu, upaya untuk meneruskan URI 214 <code>file://</code> akan memicu 215 <code>FileUriExposedException</code>. Cara yang disarankan adalah 216 materi file privat menggunakan {@link 217 android.support.v4.content.FileProvider}. 218 </li> 219 <li> 220 {@link android.app.DownloadManager} tidak bisa lagi berbagi 221 file yang tersimpan secara privat berdasarkan nama file. Aplikasi lawas dapat mengakibatkan 222 jalur yang tidak dapat diakses saat mengakses {@link 223 android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Aplikasi yang menargetkan 224 Android N atau yang lebih tinggi akan memicu {@link java.lang.SecurityException} saat 225 berupaya mengakses 226 {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. 227 Aplikasi lawas yang menyetel lokasi unduhan ke lokasi publik dengan 228 menggunakan 229 {@link 230 android.app.DownloadManager.Request#setDestinationInExternalFilesDir 231 DownloadManager.Request.setDestinationInExternalFilesDir()} atau 232 {@link 233 android.app.DownloadManager.Request#setDestinationInExternalPublicDir 234 DownloadManager.Request.setDestinationInExternalPublicDir()} 235 tetap bisa mengakses jalur tersebut di 236 {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}, akan tetapi, 237 metode ini sangat tidak disarankan. Cara yang disarankan untuk mengakses file 238 yang diekspos oleh {@link android.app.DownloadManager} adalah menggunakan 239 {@link android.content.ContentResolver#openFileDescriptor 240 ContentResolver.openFileDescriptor()}. 241 </li> 242</ul> 243 244<h2 id="sharing-files">Berbagi File Antar Aplikasi</h2> 245 246<p> 247Untuk aplikasi yang menargetkan Android N, kerangka kerja Android menerapkan 248kebijakan {@link android.os.StrictMode} API yang melarang mengekspos URI {@code file://} 249di luar aplikasi Anda. Jika sebuah intent berisi URI file meninggalkan aplikasi Anda, aplikasi tersebut akan gagal 250dengan pengecualian {@code FileUriExposedException}. 251</p> 252 253<p> 254Untuk berbagi file antar aplikasi, Anda harus mengirim URI {@code content://} 255dan memberikan izin akses sementara pada URI. Cara termudah untuk memberikan izin ini adalah dengan 256menggunakan kelas {@link android.support.v4.content.FileProvider}. Untuk informasi selengkapnya 257mengenai izin dan berbagi file, 258lihat <a href="{@docRoot}training/secure-file-sharing/index.html">Berbagi File</a>. 259</p> 260 261<h2 id="accessibility">Peningkatan Aksesibilitas</h2> 262 263<p> 264 Android N menyertakan perubahan yang bertujuan meningkatkan kegunaan 265 platform untuk pengguna dengan penglihatan yang rendah atau lemah. Perubahan ini umumnya tidak 266 memerlukan perubahan kode dalam aplikasi Anda, akan tetapi Anda harus memeriksa 267 fitur ini dan mengujinya dengan aplikasi untuk menilai kemungkinan dampaknya terhadap pengalaman 268 pengguna. 269</p> 270 271 272<h3 id="screen-zoom">Perbesaran Layar</h3> 273 274<p> 275 Android N memungkinkan pengguna menyetel <strong>Display size</strong> yang akan memperbesar 276 atau memperkecil semua elemen pada layar, sehingga meningkatkan aksesibilitas perangkat 277 bagi pengguna yang kurang melihat. Pengguna tidak bisa memperbesar layar melewati lebar layar 278 minimum <a href="http://developer.android.com/guide/topics/resources/providing-resources.html"> 279 sw320dp</a>, yang merupakan lebar Nexus 4, yakni ponsel ukuran sedang pada umumnya. 280</p> 281 282<div class="cols"> 283 284<div class="col-6"> 285 <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" /> 286</div> 287<div class="col-6"> 288 <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" /> 289</div> 290 291</div> <!-- end cols --> 292<p class="img-caption"> 293 <strong>Gambar 3.</strong> Layar di sebelah kanan menampilkan efek 294 penambahan Display size perangkat yang menjalankan citra sistem Android N. 295</p> 296 297 298<p> 299 Bila kepadatan perangkat berubah, sistem akan memberi tahu aplikasi yang sedang berjalan dengan 300 cara berikut: 301</p> 302 303<ul> 304 <li>Jika aplikasi menargetkan API level 23 atau yang lebih rendah, sistem secara otomatis akan mematikan 305 semua proses latar belakang. Artinya, jika pengguna beralih dari 306 aplikasi tersebut untuk membuka layar <em>Settings</em> dan mengubah 307 setelan <strong>Display size</strong>, maka sistem akan mematikan aplikasi tersebut dengan cara yang 308 sama dengan saat memori tinggal sedikit. Jika aplikasi memiliki beberapa proses 309 latar depan, sistem akan memberi tahu proses tersebut mengenai perubahan konfigurasi seperti 310 dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan 311 Waktu Proses</a>, seolah-olah orientasi perangkat telah berubah. 312 </li> 313 314 <li>Jika sebuah aplikasi menargetkan Android N, semua prosesnya 315 (latar depan dan latar belakang) akan diberi tahu mengenai perubahan konfigurasi seperti 316 dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan 317 Waktu Proses</a>. 318 </li> 319</ul> 320 321<p> 322 Sebagian besar aplikasi tidak perlu melakukan perubahan untuk mendukung fitur ini, asalkan 323 aplikasi tersebut mengikuti praktik terbaik Android. Hal-hal tertentu yang harus diperiksa: 324</p> 325 326<ul> 327 <li>Uji aplikasi Anda pada perangkat dengan lebar layar <code><a href= 328 "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code> 329 dan pastikan aplikasi berjalan dengan semestinya. 330 </li> 331 332 <li>Bila konfigurasi perangkat berubah, perbarui informasi cache 333 yang bergantung pada kepadatan, seperti bitmap di cache atau sumber daya yang dimuat dari 334 jaringan. Periksa perubahan konfigurasi bila aplikasi melanjutkan dari status dihentikan 335 sementara. 336 <p class="note"> 337 <strong>Catatan:</strong> Catatan: Jika Anda meng-cache data yang bergantung pada konfigurasi, ada 338 baiknya untuk menyertakan metadata yang relevan seperti ukuran layar 339 atau kepadatan piksel yang sesuai untuk data tersebut. Menyimpan metadata ini memungkinkan Anda untuk 340 memutuskan apakah Anda perlu segarkan data cache setelah perubahan 341 konfigurasi. 342 </p> 343 </li> 344 345 <li>Hindari menetapkan dimensi dengan satuan px, karena satuan ini tidak diskalakan dengan 346 kepadatan layar. Sebagai gantinya, tetapkan dimensi dengan satuan <a href="{@docRoot}guide/practices/screens_support.html">piksel yang tidak bergantung kepadatan 347 </a> (<code>dp</code>). 348 </li> 349</ul> 350 351<h3 id="vision-settings">Vision Settings di Setup Wizard</h3> 352 353<p> 354 Android N menyertakan Vision Settings di layar Sambutan, di mana pengguna bisa 355 menyiapkan setelan aksesibilitas berikut pada perangkat baru: 356 <strong>Magnification gesture</strong>, <strong>Font size</strong>, 357 <strong>Display size</strong> dan <strong>TalkBack</strong>. Perubahan ini 358 meningkatkan visibilitas bug terkait dengan setelan layar yang berbeda. Untuk 359 mengurangi dampak fitur ini, Anda harus menguji aplikasi dengan setelan ini 360 diaktifkan. Anda bisa menemukannya pada <strong>Settings > 361 Accessibility</strong>. 362</p> 363 364<h2 id="ndk">Penautan Aplikasi NDK ke Pustaka Platform</h2> 365 366<p> 367 Android N menyertakan perubahan ruang nama untuk mencegah pemuatan API non-publik. 368 Jika menggunakan NDK, Anda hanya boleh menggunakan API publik dari platform 369 Android. Menggunakan API non-publik dalam rilis Android resmi berikutnya 370 bisa menyebabkan aplikasi mogok. 371</p> 372 373<p> 374 Untuk memberi tahu Anda agar menggunakan API non-publik, aplikasi yang berjalan pada perangkat 375 Android N akan menghasilkan kesalahan dalam keluaran logcat bila aplikasi memanggil API non-publik. 376 Kesalahan ini juga ditampilkan di layar perangkat berupa pesan untuk membantu 377 meningkatkan kepedulian terhadap situasi ini. Anda harus memeriksa kode aplikasi untuk 378 membuang penggunaan API platform non-publik dan secara saksama menguji aplikasi Anda menggunakan 379 perangkat pratinjau atau emulator. 380</p> 381 382<p> 383 Jika aplikasi Anda bergantung pada pustaka platform, lihat dokumentasi NDK untuk 384 perbaikan tipikal guna menggantikan API privat umum dengan padanan API publik. 385 Anda mungkin juga menautkan ke pustaka platform tanpa menyadarinya, 386 terutama jika aplikasi Anda menggunakan pustaka yang merupakan bagian dari platform ini (seperti 387 <code>libpng</code>), namun bukan bagian dari NDK. Dalam hal itu, pastikan 388 APK Anda berisi semua file .so yang ingin ditautkan. 389</p> 390 391<p class="caution"> 392 <strong>Perhatian:</strong> Beberapa pustaka pihak ketiga mungkin menautkan ke API 393 non-publik. Jika menggunakan pustaka ini, aplikasi Anda bisa mogok saat dijalankan 394 pada rilis resmi Android berikutnya. 395</p> 396 397<p> 398 Aplikasi tidak boleh bergantung pada atau menggunakan pustaka bawaan yang tidak disertakan dalam 399 NDK, karena bisa mengalami perubahan, atau dipindahkan dari satu rilis Android ke 400 rilis lainnya. Peralihan dari OpenSSL ke BoringSSL merupakan satu contoh dari perubahan semacam ini. 401 Selain itu, perangkat yang berbeda bisa menawarkan tingkat kompatibilitas yang berbeda, karena 402 tidak ada persyaratan kompatibilitas untuk pustaka platform yang tidak disertakan 403 dalam NDK. Jika Anda harus mengakses pustaka non-NDK pada perangkat yang lebih lama, jadikan 404 pemuatan bergantung pada level Android API. 405</p> 406 407<p> 408 Untuk membantu Anda mendiagnosis tipe masalah ini ada beberapa contoh kesalahan Java dan NDK 409 yang mungkin Anda temui saat berusaha membangun aplikasi dengan Android N: 410</p> 411 412<p>Contoh kesalahan Java:</p> 413<pre class="no-pretty-print"> 414java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" 415 is not accessible for the namespace "classloader-namespace" 416</pre> 417 418<p>Contoh kesalahan NDK:</p> 419<pre class="no-pretty-print"> 420dlopen failed: cannot locate symbol "__system_property_get" referenced by ... 421</pre> 422 423 424<p> 425 Inilah beberapa perbaikan tipikal untuk aplikasi yang mengalami tipe kesalahan ini: 426</p> 427 428<ul> 429 <li>Penggunaan getJavaVM dan getJNIEnv dari libandroid_runtime.so bisa diganti 430 dengan fungsi JNI standar: 431<pre class="no-pretty-print"> 432AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> 433AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or 434JavaVM::AttachCurrentThread from <jni.h>. 435</pre> 436 </li> 437 438 <li>Penggunaan simbol {@code property_get} dari {@code libcutils.so} bisa 439 diganti dengan {@code alternative __system_property_get} publik. 440 Caranya, gunakan {@code __system_property_get} dengan menyertakan yang berikut: 441<pre> 442#include <sys/system_properties.h> 443</pre> 444 </li> 445 446 <li>Penggunaan simbol {@code SSL_ctrl} dari {@code libcrypto.so} harus 447 diganti dengan aplikasi versi lokal. Misalnya, Anda harus menautkan 448 {@code libcyrpto.a} secara statis dalam file {@code .so} atau menyertakan 449 {@code libcrypto.so} Anda sendiri secara dinamis dari BoringSSL atau OpenSSL dalam aplikasi Anda. 450 </li> 451</ul> 452 453<h2 id="afw">Android for Work</h2> 454<p> 455 Android N berisi perubahan untuk aplikasi yang menargetkan Android for Work, termasuk 456 perubahan pada pemasangan sertifikat, penyetelan ulang sandi, manajemen pengguna 457 tambahan, dan akses ke identifier perangkat. Jika Anda membangun aplikasi untuk 458 lingkungan Android for Work, Anda harus meninjau perubahan ini dan memodifikasi 459 aplikasi sebagaimana mestinya. 460</p> 461 462<ul> 463 <li>Anda harus pasang pemasang sertifikat yang didelegasikan sebelum DPC bisa 464 menyetelnya. Untuk aplikasi profil dan aplikasi pemilik perangkat yang menargetkan N SDK, Anda harus 465 pasang pemasang sertifikat yang didelegasikan sebelum pengontrol kebijakan 466 perangkat (DPC) memanggil 467 <code>DevicePolicyManager.setCertInstallerPackage()</code>. Jika pemasang 468 belum dipasang, sistem akan melontarkan 469 <code>IllegalArgumentException</code>. 470 </li> 471 472 <li>Pembatasan sandi penyetelan ulang untuk admin perangkat sekarang diterapkan ke pemilik 473 profil. Admin perangkat tidak bisa lagi menggunakan 474 {@code DevicePolicyManager.resetPassword()} untuk menghapus sandi atau mengubah 475 sandi yang sudah disetel. Admin perangkat tetap bisa menyetel sandi, namun hanya 476 bila perangkat belum memiliki sandi, PIN, atau pola. 477 </li> 478 479 <li>Pemilik perangkat dan profil bisa mengelola akun meskipun pembatasan 480 telah disetel. Pemilik perangkat dan pemilik profil bisa memanggil Account Management API 481 sekalipun pembatasan pengguna <code>DISALLOW_MODIFY_ACCOUNTS</code> diberlakukan. 482 </li> 483 484 <li>Pemilik perangkat bisa mengelola pengguna tambahan lebih mudah. Bila perangkat 485 berjalan dalam mode pemilik perangkat, maka pembatasan <code>DISALLOW_ADD_USER</code> 486 secara otomatis akan ditetapkan. Ini mencegah pengguna membuat pengguna tambahan yang 487 tidak terkelola. Selain itu, <code>CreateUser()</code> dan 488 <code>createAndInitializeUser()</code> metode tidak digunakan lagi; metode 489 <code>DevicePolicyManager.createAndManageUser()</code> telah menggantikannya. 490 </li> 491 492 <li>Pemilik perangkat bisa mengakses identifier perangkat. Pemilik perangkat bisa mengakses 493 alamat MAC Wi-Fi dari perangkat, menggunakan 494 <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Jika Wi-Fi belum pernah 495 diaktifkan pada perangkat tersebut, metode ini akan mengembalikan nilai {@code null}. 496 </li> 497 498 <li>Setelan Mode Kerja mengontrol akses ke aplikasi kerja. Bila mode kerja tidak aktif, peluncur sistem 499 akan menunjukkan aplikasi kerja tidak tersedia dengan membuat warnanya jadi abu-abu. Mengaktifkan kembali 500 mode kerja akan memulihkan perilaku normal. 501</ul> 502 503<p> 504 Untuk informasi selengkapnya tentang perubahan Android for Work di Android N, lihat 505 <a href="{@docRoot}preview/features/afw.html">Pembaruan Android for Work</a>. 506</p> 507 508<h2 id="annotations">Retensi Anotasi</h2> 509 510<p> 511Android N memperbaiki bug dengan visibilitas anotasi diabaikan. 512Masalah ini mengaktifkan waktu proses untuk mengakses anotasi yang seharusnya tidak bisa 513dilakukan. Anotasi ini termasuk: 514</p> 515 516<ul> 517 <li>{@code VISIBILITY_BUILD}: Dimaksudkan agar hanya bisa terlihat pada waktu pembuatan.</li> 518 <li>{@code VISIBILITY_SYSTEM}: Dimaksud agar bisa terlihat pada waktu proses, namun hanya pada 519 sistem yang mendasarinya.</li> 520</ul> 521 522<p> 523Jika aplikasi Anda mengandalkan perilaku ini, tambahkan kebijakan retensi untuk anotasi yang harus 524tersedia di waktu proses. Caranya dengan menggunakan {@code @Retention(RetentionPolicy.RUNTIME)}. 525</p> 526 527<h2 id="other">Poin Penting Lainnya</h2> 528 529<ul> 530<li>Bila aplikasi berjalan pada Android N, namun menargetkan level API yang lebih rendah, 531dan pengguna mengubah ukuran tampilan, proses aplikasi akan dimatikan. Aplikasi 532harus dapat menangani skenario ini dengan lancar. Jika tidak, maka akan mogok 533bila pengguna memulihkannya dari Recents. 534 535<p> 536Anda harus menguji aplikasi untuk memastikan 537perilaku ini tidak terjadi. 538Anda bisa melakukannya dengan menyebabkan suatu mogok yang identik 539saat mematikan aplikasi secara manual melalui DDMS. 540</p> 541 542<p> 543Aplikasi yang menargetkan N dan yang di atasnya tidak secara otomatis dimatikan saat perubahan kepadatan; 544akan tetapi, aplikasi tersebut mungkin tetap merespons perubahan konfigurasi dengan buruk. 545</p> 546</li> 547 548<li> 549Aplikasi pada Android N harus mampu menangani perubahan konfigurasi dengan lancar, 550dan tidak boleh mengalami mogok pada start selanjutnya. Anda bisa memverifikasi perilaku aplikasi 551dengan mengubah ukuran font (<strong>Setting</strong> > 552<strong>Display</strong> > <strong>Font size</strong>), kemudian memulihkan 553aplikasi dari Recents. 554</li> 555 556<li> 557Dikarenakan adanya bug di versi Android sebelumnya, sistem tidak menandai penulisan 558 ke soket TCP di thread utama sebagai pelanggaran mode-ketat. Android N memperbaiki bug ini. 559Aplikasi yang menunjukkan perilaku ini kini melontarkan sebuah {@code android.os.NetworkOnMainThreadException}. 560Secara umum, melakukan operasi jaringan di thread utama tidak baik karena operasi ini 561biasanya memiliki latensi tinggi yang menyebabkan ANR dan jank. 562</li> 563 564<li> 565Kelompok metode {@code Debug.startMethodTracing()} kini default ke 566keluaran penyimpanan di direktori paket tertentu di penyimpanan bersama, 567sebagai ganti di level teratas 568kartu SD. Berarti aplikasi tidak perlu lagi meminta izin {@code WRITE_EXTERNAL_STORAGE} untuk menggunakan API ini. 569</li> 570 571<li> 572Banyak platform API yang kini mulai memeriksa beban besar yang dikirim 573ke seluruh transaksi {@link android.os.Binder}, dan sistem 574kini melontarkan kembali {@code TransactionTooLargeExceptions} 575sebagai {@code RuntimeExceptions}, sebagai ganti logging secara diam-diam atau menyembunyikannya. Satu contoh 576umum adalah menyimpan terlalu banyak data di 577{@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()}, 578yang menyebabkan {@code ActivityThread.StopInfo} melontarkan 579{@code RuntimeException} bila aplikasi Anda menargetkan Android N. 580</li> 581 582<li> 583Jika sebuah aplikasi mengeposkan tugas {@link java.lang.Runnable} ke{@link android.view.View}, dan 584{@link android.view.View} 585tidak terpasang ke jendela, sistem 586akan mengantrekan tugas {@link java.lang.Runnable} dengan {@link android.view.View}; 587tugas {@link java.lang.Runnable} tidak akan dieksekusi hingga 588{@link android.view.View} terpasang 589ke jendela. Perilaku ini mengatasi bug berikut: 590<ul> 591 <li>Jika sebuah aplikasi mengeposkan ke {@link android.view.View} dari thread selain thread UI jendela yang dimaksud, 592 maka {@link java.lang.Runnable} mungkin akan menjalankan thread yang salah. 593 </li> 594 <li>Jika tugas {@link java.lang.Runnable} diposkan dari thread selain 595 looper-thread, aplikasi bisa mengekspos tugas {@link java.lang.Runnable}.</li> 596</ul> 597</li> 598 599<li> 600Jika sebuah aplikasi di Android N dengan 601izin{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES} 602mencoba menghapus sebuah paket, namun sebuah aplikasi berbeda telah memasang paket itu, 603sistem akan memerlukan konfirmasi pengguna. Dalam skenario ini, aplikasi harus mengharapkan 604{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION} 605sebagai status kembalian bila memanggil 606{@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}. 607</li> 608 609</ul> 610 611