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 &gt;
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 -&gt; GetJavaVM from &lt;jni.h&gt;
433AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
434JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
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 &lt;sys/system_properties.h&gt;
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> &gt;
552<strong>Display</strong> &gt; <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