Home | History | Annotate | Download | only in nougat
      1 page.title=Perubahan Perilaku
      2 page.keywords=pratinjau,sdk,kompatibilitas
      3 meta.tags="preview", "compatibility"
      4 page.tags="preview", "developer preview"
      5 page.image=images/cards/card-n-changes_2x.png
      6 @jd:body
      7 
      8 
      9 <div id="tb-wrapper">
     10 <div id="tb">
     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>
     62 Android N menyertakan perubahan perilaku sistem yang bertujuan untuk meningkatkan daya tahan baterai
     63 perangkat dan mengurangi penggunaan RAM. Perubahan ini bisa memengaruhi akses aplikasi Anda ke
     64 sumber daya sistem, termasuk cara aplikasi Anda berinteraksi dengan aplikasi lain melalui
     65 intent 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}images/android-7.0/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}images/android-7.0/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>
    247 Untuk aplikasi yang menargetkan Android N, kerangka kerja Android menerapkan
    248 kebijakan {@link android.os.StrictMode} API yang melarang mengekspos URI {@code file://}
    249 di luar aplikasi Anda. Jika sebuah intent berisi URI file meninggalkan aplikasi Anda, aplikasi tersebut akan gagal
    250 dengan pengecualian {@code FileUriExposedException}.
    251 </p>
    252 
    253 <p>
    254 Untuk berbagi file antar aplikasi, Anda harus mengirim URI {@code content://}
    255 dan memberikan izin akses sementara pada URI. Cara termudah untuk memberikan izin ini adalah dengan
    256 menggunakan kelas {@link android.support.v4.content.FileProvider}. Untuk informasi selengkapnya
    257 mengenai izin dan berbagi file,
    258 lihat <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}images/android-7.0/screen-zoom-1.png" alt="" height="XXX" id="figure1" />
    286 </div>
    287 <div class="col-6">
    288   <img src="{@docRoot}images/android-7.0/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">
    414 java.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">
    420 dlopen 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">
    432 AndroidRuntime::getJavaVM -&gt; GetJavaVM from &lt;jni.h&gt;
    433 AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
    434 JavaVM::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>
    511 Android N memperbaiki bug dengan visibilitas anotasi diabaikan.
    512 Masalah ini mengaktifkan waktu proses untuk mengakses anotasi yang seharusnya tidak bisa
    513 dilakukan. 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>
    523 Jika aplikasi Anda mengandalkan perilaku ini, tambahkan kebijakan retensi untuk anotasi yang harus
    524 tersedia 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,
    531 dan pengguna mengubah ukuran tampilan, proses aplikasi akan dimatikan. Aplikasi
    532 harus dapat menangani skenario ini dengan lancar. Jika tidak, maka akan mogok
    533 bila pengguna memulihkannya dari Recents.
    534 
    535 <p>
    536 Anda harus menguji aplikasi untuk memastikan
    537 perilaku ini tidak terjadi.
    538 Anda bisa melakukannya dengan menyebabkan suatu mogok yang identik
    539 saat mematikan aplikasi secara manual melalui DDMS.
    540 </p>
    541 
    542 <p>
    543 Aplikasi yang menargetkan N dan yang di atasnya tidak secara otomatis dimatikan saat perubahan kepadatan;
    544 akan tetapi, aplikasi tersebut mungkin tetap merespons perubahan konfigurasi dengan buruk.
    545 </p>
    546 </li>
    547 
    548 <li>
    549 Aplikasi pada Android N harus mampu menangani perubahan konfigurasi dengan lancar,
    550 dan tidak boleh mengalami mogok pada start selanjutnya. Anda bisa memverifikasi perilaku aplikasi
    551 dengan mengubah ukuran font (<strong>Setting</strong> &gt;
    552 <strong>Display</strong> &gt; <strong>Font size</strong>), kemudian memulihkan
    553 aplikasi dari Recents.
    554 </li>
    555 
    556 <li>
    557 Dikarenakan 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.
    559 Aplikasi yang menunjukkan perilaku ini kini melontarkan sebuah {@code android.os.NetworkOnMainThreadException}.
    560 Secara umum, melakukan operasi jaringan di thread utama tidak baik karena operasi ini
    561 biasanya memiliki latensi tinggi yang menyebabkan ANR dan jank.
    562 </li>
    563 
    564 <li>
    565 Kelompok metode {@code Debug.startMethodTracing()} kini default ke
    566 keluaran penyimpanan di direktori paket tertentu di penyimpanan bersama,
    567 sebagai ganti di level teratas
    568 kartu SD.  Berarti aplikasi tidak perlu lagi meminta izin {@code WRITE_EXTERNAL_STORAGE} untuk menggunakan API ini.
    569 </li>
    570 
    571 <li>
    572 Banyak platform API yang kini mulai memeriksa beban besar yang dikirim
    573 ke seluruh transaksi {@link android.os.Binder}, dan sistem
    574 kini melontarkan kembali {@code TransactionTooLargeExceptions}
    575 sebagai {@code RuntimeExceptions}, sebagai ganti logging secara diam-diam atau menyembunyikannya.  Satu contoh
    576 umum adalah menyimpan terlalu banyak data di
    577 {@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()},
    578 yang menyebabkan {@code ActivityThread.StopInfo} melontarkan
    579 {@code RuntimeException} bila aplikasi Anda menargetkan Android N.
    580 </li>
    581 
    582 <li>
    583 Jika sebuah aplikasi mengeposkan tugas {@link java.lang.Runnable} ke{@link android.view.View}, dan
    584 {@link android.view.View}
    585 tidak terpasang ke jendela, sistem
    586 akan mengantrekan tugas {@link java.lang.Runnable} dengan {@link android.view.View};
    587 tugas {@link java.lang.Runnable} tidak akan dieksekusi hingga
    588 {@link android.view.View} terpasang
    589 ke 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>
    600 Jika sebuah aplikasi di Android N dengan
    601 izin{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES}
    602 mencoba menghapus sebuah paket, namun sebuah aplikasi berbeda telah memasang paket itu,
    603 sistem akan memerlukan konfirmasi pengguna. Dalam skenario ini, aplikasi harus mengharapkan
    604 {@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION}
    605 sebagai status kembalian bila memanggil
    606 {@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}.
    607 </li>
    608 
    609 </ul>
    610 
    611