1page.title=Mudanças de comportamento
2page.keywords=preview,sdk,compatibility
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>Neste documento</h2>
13
14<ol>
15  <li><a href="#perf">Melhorias no desempenho</a>
16    <ol>
17      <li><a href="#doze">Soneca</a></li>
18      <li><a href="#bg-opt">Otimizações em segundo plano</a></li>
19    </ol>
20  </li>
21  <li><a href="#perm">Alterações nas permissões</a>
22  </li>
23  <li><a href="#sharing-files">Compartilhamento de arquivos entre aplicativos</a></li>
24  <li><a href="#accessibility">Melhorias na acessibilidade</a>
25    <ol>
26      <li><a href="#screen-zoom">Zoom de tela</a></li>
27      <li><a href="#vision-settings">Configurações de visão no assistente de configuração</a></li>
28    </ol>
29  </li>
30  <li><a href="#ndk">Aplicativos NDK vinculados a bibliotecas de plataforma</a></li>
31  <li><a href="#afw">Android for Work</a></li>
32  <li><a href="#annotations">Retenção de anotações</a></li>
33  <li><a href="#other">Outros pontos importantes</a></li>
34</ol>
35
36<h2>Veja também</h2>
37<ol>
38  <li><a href="{@docRoot}preview/api-overview.html">
39Visão geral da API do Android N</a></li>
40</ol>
41
42</div>
43</div>
44
45
46<p>
47  Junto com novos recursos e funcionalidades, o Android N
48inclui uma variedade de mudanças de comportamento do sistema e da API. Este documento
49destaca algumas das principais mudanças que você deve entender e considerar
50nos aplicativos.
51</p>
52
53<p>
54  Caso tenha publicado anteriormente um aplicativo para Android, saiba que ele pode ser afetado
55 pelas alterações na plataforma.
56</p>
57
58
59<h2 id="perf">Bateria e memória</h2>
60
61<p>
62O Android N inclui alterações de comportamento do sistema com o objetivo de melhorar a vida útil da bateria
63nos dispositivos e reduzir o uso de RAM. Essas alterações podem afetar o acesso do aplicativo aos
64recursos do sistema, bem como a forma como ele interage com outros aplicativos por meio de
65 certas intenções explícitas .
66</p>
67
68<h3 id="doze">Soneca</h3>
69
70<p>
71  Introduzido no Android 6.0 (nível da API 23), o modo soneca aumenta a vida útil da bateria
72 adiando atividades de CPU e rede quando um usuário deixa um dispositivo desconectado,
73 estacionário e com a tela desativada. O Android N aprimora
74 ainda mais o modo soneca aplicando um subconjunto de restrições de CPU e rede
75 quando o dispositivo está desconectado e com a tela desativada, mas não necessariamente
76 estacionário, como, por exemplo, quando o celular está no bolso do usuário.
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>Figura 1.</strong> Ilustração de como o modo soneca aplica um primeiro nível de
83 restrições de atividades de sistema para aumentar a vida útil da bateria.
84</p>
85
86<p>
87  Quando o dispositivo estiver sendo alimentado pela bateria e a tela estiver desativada por um determinado
88 período, o dispositivo entrará no modo de soneca e aplicará o primeiro subconjunto de restrições: o
89acesso do aplicativo à rede será desativado e os trabalhos e sincronizações serão adiados. Se o dispositivo permanecer
90estacionário por um determinado período após entrar no modo soneca, o sistema aplicará
91as demais restrições de soneca a {@link android.os.PowerManager.WakeLock}, aos alarmes
92{@link android.app.AlarmManager} e às verificações de GPS e Wi-Fi. Independentemente
93 de as restrições de soneca serem aplicadas parcial ou totalmente, o sistema despertará o
94 dispositivo para breves janelas de manutenção, quando os aplicativos
95 poderão acessar a rede e executar todos os trabalhos/sincronizações adiados.
96</p>
97
98
99<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
100<p class="img-caption">
101  <strong>Figura 2.</strong> Ilustração de como o modo soneca aplica um segundo nível de
102 restrições de atividades de sistema após o dispositivo permanecer estacionário por um determinado período.
103</p>
104
105<p>
106  Note que a ativação da tela ou do dispositivo encerra o modo soneca e
107 remove essas restrições de processamento. O comportamento adicional não
108 afeta as recomendações e práticas recomendadas para a adaptação do aplicativo à versão
109 anterior do modo soneca, introduzida no Android 6.0 (nível da API 23), como discutido em
110 <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
111 Otimização para soneca e aplicativo em espera</a>. Você deve continuar
112 a seguir essas recomendações, como o uso do Google Cloud Messaging (GCM) para
113 enviar e receber mensagens, e começar a planejar atualizações para acomodar o
114 comportamento adicional do modo soneca.
115</p>
116
117
118<h3 id="bg-opt">Project Svelte: Otimizações em segundo plano</h3>
119
120<p>
121  O Android N remove três transmissões implícitas para ajudar a otimizar o
122 uso de memória e o consumo de energia. Essa alteração é necessária porque transmissões
123 implícitas iniciam frequentemente em segundo plano aplicativos
124 registrados para escutá-las. A remoção dessas transmissões pode beneficiar consideravelmente o desempenho
125do dispositivo e a experiência do usuário.
126</p>
127
128<p>
129  Dispositivos móveis passam por alterações frequentes na conectividade, como a alternância
130 entre Wi-Fi e dados móveis. No momento, os aplicativos podem monitorar alterações de
131 conectividade registrando um receptor para a transmissão implícita {@link
132 android.net.ConnectivityManager#CONNECTIVITY_ACTION} em seu
133 manifesto. Como vários aplicativos se registram para receber essa transmissão, uma única
134 mudança de rede pode fazer com que todos despertem e processem a transmissão
135 ao mesmo tempo.
136</p>
137
138<p>
139  De forma semelhante, em versões anteriores do Android, os aplicativos podiam se registrar para receber transmissões implícitas {@link
140 android.hardware.Camera#ACTION_NEW_PICTURE} e {@link
141 android.hardware.Camera#ACTION_NEW_VIDEO} de outros aplicativos, como
142 Câmera. Quando um usuário tira uma fotografia com o aplicativo Câmera, esses aplicativos são despertados
143 para processar a transmissão.
144</p>
145
146<p>
147  Para aliviar esses problemas, o Android N aplica a seguintes
148 otimizações:
149</p>
150
151<ul>
152  <li>Os aplicativos direcionados ao Android N não receberão transmissões {@link
153 android.net.ConnectivityManager#CONNECTIVITY_ACTION}, mesmo
154 se tiverem entradas no manifesto solicitando notificação desses eventos. Os aplicativos em execução
155ainda poderão escutar {@code CONNECTIVITY_CHANGE} no encadeamento principal
156 se solicitarem a notificação com {@link android.content.BroadcastReceiver}.
157  </li>
158
159  <li>Os aplicativos não podem enviar nem receber transmissões {@link
160 android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
161 android.hardware.Camera#ACTION_NEW_VIDEO}. Essa otimização
162 afeta todos os aplicativos e não apenas os direcionados ao Android N.
163  </li>
164</ul>
165
166<p>Se o seu aplicativo usar qualquer uma dessas intenções, remova as dependências
167 delas assim que possível para direcionar corretamente os dispositivos Android N.
168  A estrutura do Android oferece diversas soluções para reduzir a necessidade dessas
169 transmissões implícitas. Por exemplo, a API {@link
170 android.app.job.JobScheduler} oferece um mecanismo robusto para agendar
171 operações de rede quando ocorrem condições especificadas, como conexão a uma
172 rede ilimitada. Você pode até usar {@link
173android.app.job.JobScheduler} para reagir a mudanças em provedores de conteúdo.
174</p>
175
176<p>
177  Para obter mais informações sobre otimizações em segundo plano no N e como adaptar seu aplicativo,
178 consulte <a href="{@docRoot}preview/features/background-optimization.html">Otimizações
179em segundo plano</a>.
180</p>
181
182<h2 id="perm">Alterações nas permissões</h2>
183
184<p>
185  O Android N inclui alterações em permissões que podem afetar seu aplicativo.
186</p>
187
188<h3 id="permfilesys">Alterações nas permissões do sistema de arquivos</h3>
189
190<p>
191  Para aprimorar a segurança de arquivos privados, o diretório privado de
192 aplicativos direcionados ao Android N ou superior tem acesso restrito (<code>0700</code>).
193  Esta configuração impede o vazamento de metadados de arquivos privados, como tamanho
194 e existência. Esta alteração de permissão tem vários efeitos colaterais:
195</p>
196
197<ul>
198  <li>
199    O proprietário não deve mais relaxar as permissões para arquivos privados,
200 e qualquer tentativa de fazer isso usando
201 {@link android.content.Context#MODE_WORLD_READABLE} e/ou
202 {@link android.content.Context#MODE_WORLD_WRITEABLE} acionará uma
203 {@link java.lang.SecurityException}.
204    <p class="note">
205      <strong>Observação:</strong> Até agora, essa restrição não foi adotada em pleno vigor.
206      Aplicativos ainda podem modificar permissões para o diretório privado usando
207 APIs nativas ou a API {@link java.io.File File}. No entanto, o relaxamento
208 de permissões para o diretório privado é enfaticamente desencorajado.
209    </p>
210  </li>
211  <li>
212    A passagem de URIs <code>file://</code> para fora do domínio do pacote pode deixar o
213 receptor com um caminho inacessível. Sendo assim, tentativas de passar um URI
214 <code>file://</code> acionam uma
215 <code>FileUriExposedException</code>. A forma recomendada para compartilhamento do
216 conteúdo de um arquivo privado é o uso do {@link
217 android.support.v4.content.FileProvider}.
218  </li>
219  <li>
220    O {@link android.app.DownloadManager} não consegue mais compartilhar
221 arquivos armazenados de forma privada por nome de arquivo. Os aplicativos de legado podem acabar em um
222 caminho inacessível quando acessam {@link
223 android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Aplicativos direcionados para o
224 Android N ou superior acionam uma {@link java.lang.SecurityException} quando
225 tentam acessar
226 {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}.
227    Aplicativos de legado que definem o local de download para um local público
228 usando
229 {@link
230android.app.DownloadManager.Request#setDestinationInExternalFilesDir
231DownloadManager.Request.setDestinationInExternalFilesDir()} ou
232 {@link
233android.app.DownloadManager.Request#setDestinationInExternalPublicDir
234DownloadManager.Request.setDestinationInExternalPublicDir()}
235 ainda conseguem acessar o caminho em
236{@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}, no entanto, este
237 método é enfaticamente desencorajado. A forma preferencial para se acessar um arquivo
238 exposto pelo {@link android.app.DownloadManager} é o uso do
239{@link android.content.ContentResolver#openFileDescriptor
240ContentResolver.openFileDescriptor()}.
241  </li>
242</ul>
243
244<h2 id="sharing-files">Compartilhamento de arquivos entre aplicativos</h2>
245
246<p>
247Para aplicativos direcionados ao Android N, a estrutura do Android cumpre com
248a política de API {@link android.os.StrictMode} que proíbe a exposição de URIs {@code file://}
249fora do aplicativo. Se uma intenção que contenha o URI de um arquivo deixar o aplicativo, ele falhará
250 com uma exceção {@code FileUriExposedException}.
251</p>
252
253<p>
254Para compartilhar arquivos entre aplicativos, você deve enviar um URI {@code content://}
255e conceder uma permissão de acesso temporária ao URI. A forma mais fácil de conceder essa permissão é
256usar a classe {@link android.support.v4.content.FileProvider}. Para obter mais informações
257 sobre permissões e compartilhamento de arquivos,
258consulte <a href="{@docRoot}training/secure-file-sharing/index.html">Compartilhamento de Arquivos</a>.
259</p>
260
261<h2 id="accessibility">Melhorias na acessibilidade</h2>
262
263<p>
264  O Android N inclui mudanças criadas para aprimorar a facilidade de uso da
265 plataforma para usuários com visão reduzida ou deficiente. Normalmente, essas mudanças
266 não exigirão alterações de código no aplicativo. No entanto, analise
267 esse recurso e teste-o em seu aplicativo para avaliar possíveis impactos na experiência
268 do usuário.
269</p>
270
271
272<h3 id="screen-zoom">Zoom de tela</h3>
273
274<p>
275  O Android N permite que os usuários definam <strong>Display size</strong>, que amplia
276 ou reduz todos os elementos na tela, melhorando a acessibilidade do dispositivo
277 para usuários com visão deficiente. Os usuários não podem alterar o zoom da tela além da largura mínima de
278 tela de <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
279sw320dp</a>, que é a largura do Nexus 4, um telefone comum de tamanho médio.
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>Figura 3.</strong> A tela à direita mostra o efeito de
294 reduzir o Display size de um dispositivo executando uma imagem do sistema Android N.
295</p>
296
297
298<p>
299  Quando a densidade do dispositivo mudar, o sistema notificará os aplicativos em execução das
300 seguintes formas:
301</p>
302
303<ul>
304  <li>Se um aplicativo está direcionado ao nível da API 23 ou mais baixo, o sistema automaticamente elimina
305 todos os processos em segundo plano. Isso significa que, se um usuário sair
306 desse aplicativo para abrir a tela <em>Settings</em> e alterar a
307 configuração <strong>Display size</strong>, o sistema eliminará o aplicativo da mesma
308 forma que faria em uma situação de pouca memória. Se o aplicativo tiver processos
309 em primeiro plano, o sistema notificará esses processos sobre a mudança de configuração, como
310 descrito em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento
311 de alterações no tempo de execução</a>, como se a orientação do dispositivo tivesse mudado.
312  </li>
313
314  <li>Se um aplicativo for direcionado ao Android N, todos os seus processos
315 (em primeiro e segundo plano) serão notificados da mudança de configuração, como
316 descrito em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento
317 de alterações no tempo de execução</a>.
318  </li>
319</ul>
320
321<p>
322  A maioria dos aplicativos não precisa ser alterada para ser compatível com esse recurso, desde que
323 os aplicativos sigam as práticas recomendadas do Android. Os itens específicos a serem verificados são:
324</p>
325
326<ul>
327  <li>Teste o aplicativo em um dispositivo com largura de tela <code><a href=
328  "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
329 e verifique se ele funciona adequadamente.
330  </li>
331
332  <li>Quando a configuração do dispositivo mudar, atualize todas as informações
333 dependentes de densidade armazenadas no cache, como bitmaps no cache ou recursos carregados da
334 rede. Verifique a ocorrência de alterações de configuração quando o aplicativo sair do estado pausado e retomar
335 a execução.
336    <p class="note">
337      <strong>Observação:</strong> se você armazenar em cache dados dependentes de configuração,
338recomendamos incluir metadados relevantes, como o tamanho de tela
339 adequado ou a densidade de pixels desses dados. Salvar esses dados permitirá que você
340 decida se será necessário atualizar os dados armazenados em cache após uma mudança
341 de configuração.
342    </p>
343  </li>
344
345  <li>Evite especificar dimensões com unidades px, pois elas não são redimensionadas de
346 acordo com a densidade de tela. Em vez disso, especifique dimensões com unidades de <a href="{@docRoot}guide/practices/screens_support.html">pixel independente de
347 densidade</a> (<code>dp</code>).
348  </li>
349</ul>
350
351<h3 id="vision-settings">Configurações de visão no assistente de configuração</h3>
352
353<p>
354  Agora, o Android N inclui Configurações de visão na tela de boas-vindas, onde os usuários podem
355 definir as configurações de acessibilidade a seguir em um novo dispositivo:
356  <strong>gesto de ampliação</strong>, <strong>tamanho da fonte</strong>
357, <strong>tamanho da tela</strong> e <strong>TalkBack</strong>. Essa alteração
358 aumenta a visibilidade de erros relacionados a configurações de tela diferentes. Para
359 avaliar o impacto do recurso, teste seus aplicativos com essas
360configurações ativadas. As configurações podem ser encontradas em <strong>Settings &gt;
361 Accessibility</strong>.
362</p>
363
364<h2 id="ndk">Aplicativos NDK vinculados a bibliotecas de plataforma</h2>
365
366<p>
367  O Android N inclui mudanças no namespace para evitar o carregamento de APIs não públicas.
368  Se você usar o NDK, use apenas APIs públicas da plataforma
369 Android. O uso de APIs não públicas na próxima versão oficial do Android
370 poderá causar problemas no seu aplicativo.
371</p>
372
373<p>
374  Para alertar sobre o uso de APIs não públicas, os aplicativos executados em um dispositivo
375 Android N geram um erro na saída logcat quando um aplicativo chama uma API não pública.
376  Esse erro também é exibido na tela do dispositivo como mensagem para que o usuário
377fique ciente da situação. Revise o código do seu aplicativo para
378 remover o uso de APIs de plataformas não públicas e faça testes completos do aplicativo usando
379 um dispositivo de visualização ou um emulador.
380</p>
381
382<p>
383  Se o seu aplicativo depender de bibliotecas de plataforma, consulte a documentação do NDK
384 para obter soluções usuais de substituição de APIs privadas comuns por APIs públicas equivalentes.
385  Também é possível que você esteja vinculando bibliotecas de plataforma sem perceber,
386 particularmente se o aplicativo usar uma biblioteca que faz parte da plataforma (como
387 <code>libpng</code>), mas não faz parte do NDK. Nesse caso, verifique se
388o APK contém todos os arquivos .so que você pretende vincular.
389</p>
390
391<p class="caution">
392  <strong>Cuidado:</strong> Algumas bibliotecas de terceiros também podem conter links para APIs
393 não públicas. Se o aplicativo usar essas bibliotecas, poderá falhar quando executado
394 na próxima versão oficial do Android.
395</p>
396
397<p>
398  Os aplicativos não devem depender de nem usar bibliotecas nativas não incluídas
399 no NDK, pois elas podem ser alteradas ou removidas entre uma versão do Android
400 e outra. A mudança de OpenSSL para BoringSSL é um exemplo dessas alterações.
401  Além disso, dispositivos diferentes podem oferecer níveis distintos de compatibilidade, pois
402 não há requisitos de compatibilidade para bibliotecas de plataforma não incluídas
403no NDK. Se você precisar acessar bibliotecas que não são do NDK em dispositivos mais antigos, torne o carregamento
404dependente do nível da Android API.
405</p>
406
407<p>
408  Para ajudar a diagnosticar esses tipos de problemas, veja a seguir alguns exemplos de erros
409 de Java e NDK que podem ocorrer durante a compilação do aplicativo com o Android N:
410</p>
411
412<p>Exemplo de erro de 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>Exemplo de erro de 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  Veja a seguir algumas correções comuns para aplicativos que encontram esses tipos de erro:
426</p>
427
428<ul>
429  <li>O uso de getJavaVM e getJNIEnv do libandroid_runtime.so pode ser substituído
430 por funções JNI padrão:
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>O uso do símbolo {@code property_get} de {@code libcutils.so} pode ser
439 substituído pelo {@code alternative __system_property_get} público.
440   Para fazer isso, use {@code __system_property_get} com o include abaixo:
441<pre>
442#include &lt;sys/system_properties.h&gt;
443</pre>
444  </li>
445
446  <li>O uso do símbolo {@code SSL_ctrl} de {@code libcrypto.so} deve ser
447 substituído por uma versão local do aplicativo. Por exemplo, vincule estaticamente
448 {@code libcyrpto.a} no arquivo {@code .so} ou inclua dinamicamente o seu próprio
449 {@code libcrypto.so} do BoringSSL ou OpenSSL no aplicativo.
450  </li>
451</ul>
452
453<h2 id="afw">Android for Work</h2>
454<p>
455  O Android N contém mudanças para aplicativos direcionados ao Android for Work, incluindo
456 mudanças em instalação de certificados, redefinição de senha, gerenciamento de
457 usuários secundários e acesso a identificadores de dispositivos. Se você estiver criando aplicativos para
458 ambientes do Android for Work, examine essas mudanças e modifique
459 o aplicativo conforme necessário.
460</p>
461
462<ul>
463  <li>Você precisa instalar um instalador de certificado delegado antes que o DPC possa
464 configurá-lo. Para aplicativos de donos de perfil e dispositivo direcionados ao N SDK, você deve
465 instalar o instalador de certificado delegado antes de chamar o
466 controlador de políticas de dispositivo (DPC)
467 <code>DevicePolicyManager.setCertInstallerPackage()</code>. Se o instalador
468 não estiver instalado, o sistema gerará uma
469 <code>IllegalArgumentException</code>.
470  </li>
471
472  <li>As restrições de redefinição de senha de administradores do dispositivo agora se aplicam também a
473donos de perfil. Os administradores de dispositivo não podem mais usar
474 {@code DevicePolicyManager.resetPassword()} para limpar senhas nem para alterar
475 as já definidas. Os administradores de dispositivo ainda poderão definir uma senha, mas apenas
476 em dispositivos sem senha, PIN nem padrão.
477  </li>
478
479  <li>Donos de dispositivo e perfil poderão gerenciar contas, mesmo se restrições forem
480 definidas. Eles podem chamar as APIs de gerenciamento de contas,
481 mesmo se restrições de usuário <code>DISALLOW_MODIFY_ACCOUNTS</code> forem implementadas.
482  </li>
483
484  <li>Os donos de dispositivo podem gerenciar usuários secundários com maior facilidade. Quando um dispositivo
485 executar no modo de dono do dispositivo, a restrição <code>DISALLOW_ADD_USER</code>
486 será definida automaticamente. Isso evita que os usuários criem usuários secundários
487 não gerenciados. Além disso, os métodos <code>CreateUser()</code> e
488 <code>createAndInitializeUser()</code> ficaram obsoletos e foram substituídos
489 pelo novo método <code>DevicePolicyManager.createAndManageUser()</code>.
490  </li>
491
492  <li>Os donos de dispositivo podem acessar identificadores de dispositivo. O dono do dispositivo pode acessar o
493 endereço MAC Wi-Fi de um dispositivo usando
494 <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Se a rede Wi-Fi nunca
495 foi ativada no dispositivo, esse método retorna o valor {@code null}.
496  </li>
497
498  <li>A configuração modo de trabalho controla o acesso a aplicativos de trabalho. Quando o modo de trabalho está desativado, a
499 tela de início do sistema mostra os aplicativos de trabalho em cinza para indicar que estão indisponíveis. Quando é
500 reativado, o modo de trabalho retorna ao comportamento normal.
501</ul>
502
503<p>
504  Para obter mais informações sobre as mudanças no Android for Work no Android N, consulte
505 <a href="{@docRoot}preview/features/afw.html">Atualizações no Android for Work</a>.
506</p>
507
508<h2 id="annotations">Retenção de anotações</h2>
509
510<p>
511O Android N corrige um erro em que a visibilidade de anotações era ignorada.
512Este problema permitia que o tempo de execução acessasse anotações a que não deveria
513ter acesso. Entre essas anotações, estão:
514</p>
515
516<ul>
517   <li>{@code VISIBILITY_BUILD}: que só deveria estar visível em tempo de compilação.</li>
518   <li>{@code VISIBILITY_SYSTEM}: que deveria estar visível em tempo de execução, mas apenas para o
519sistema subjacente.</li>
520</ul>
521
522<p>
523Se o seu aplicativo se baseou neste comportamento, adicione uma política de retenção para anotações que deve
524 estar disponível em tempo de execução. É possível fazer isso usando {@code @Retention(RetentionPolicy.RUNTIME)}.
525</p>
526
527<h2 id="other">Outros pontos importantes</h2>
528
529<ul>
530<li>Quando um aplicativo for executado no Android N, mas for direcionado a um nível da API menor
531 e o usuário alterar o tamanho da tela, o processo do aplicativo será eliminado. O aplicativo
532deverá ser capaz de processar corretamente esse cenário. Caso contrário, ele falhará
533quando o usuário restaurá-lo usando Recents.
534
535<p>
536Você deve testar o aplicativo para verificar
537se esse comportamento não ocorre.
538Isso pode ser feito causando uma falha idêntica
539eliminando o aplicativo manualmente usando o DDMS.
540</p>
541
542<p>
543Aplicativos direcionados ao Android N e versões posteriores não serão eliminados automaticamente em mudanças de densidade.
544No entanto, podem continuar a responder a alterações de configurações de forma não ideal.
545</p>
546</li>
547
548<li>
549Os aplicativos no Android N devem ser capazes de processar corretamente mudanças de configuração
550e não devem falhar em inicializações subsequentes. Você pode verificar o comportamento do aplicativo
551alterando o tamanho da fonte (<strong>Setting</strong> &gt;
552<strong>Display</strong> &gt; <strong>Font size</strong>) e depois restaurando
553o aplicativo em Recents.
554</li>
555
556<li>
557Devido a um erro em versões anteriores do Android, o sistema não sinaliza gravações
558 em um soquete TCP no encadeamento principal como violações do modo estrito. O Android N corrigiu esse erro.
559Agora, os aplicativos que exibirem este comportamento gerarão uma{@code android.os.NetworkOnMainThreadException}.
560Geralmente, a realização de operações de rede no encadeamento principal é uma má ideia porque essas operações
561geralmente têm alta latência no final, causando ANRs e problemas.
562</li>
563
564<li>
565Agora, por padrão, a família de métodos {@code Debug.startMethodTracing()} armazena
566os resultados no diretório específico do pacote no armazenamento compartilhado,
567 e não no nível mais alto
568 do cartão SD.  Isso significa que os aplicativos não precisam mais solicitar a permissão {@code WRITE_EXTERNAL_STORAGE} para usar estas APIs.
569</li>
570
571<li>
572Muitas APIs de plataformas começaram a verificar grandes cargas úteis enviadas
573por meio de transações {@link android.os.Binder}, e o
574sistema agora gera novamente{@code TransactionTooLargeExceptions}
575como {@code RuntimeExceptions}, em vez de registrá-las ou suprimi-las silenciosamente.  Um
576exemplo comum é armazenar dados demais em
577{@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()},
578que faz com que {@code ActivityThread.StopInfo} gere uma
579{@code RuntimeException} quando seu aplicativo é direcionado ao Android N.
580</li>
581
582<li>
583Se um aplicativo publica tarefas {@link java.lang.Runnable} para uma {@link android.view.View} e
584 esta {@link android.view.View}
585não está anexada a uma janela, o sistema
586coloca a tarefa {@link java.lang.Runnable} em fila com a {@link android.view.View}.
587A tarefa {@link java.lang.Runnable} não é executada até que a
588{@link android.view.View} esteja anexada
589a uma janela. Este comportamento corrige os seguintes erros:
590<ul>
591   <li>Se um aplicativo publicasse em uma {@link android.view.View} de um encadeamento que não fosse o encadeamento de IU da janela pretendida
592, o {@link java.lang.Runnable} poderia acabar sendo executado no encadeamento errado.
593   </li>
594   <li>Se a tarefa {@link java.lang.Runnable} fosse publicada de um encadeamento que não fosse
595 um encadeamento de looper, o aplicativo poderia expor a tarefa {@link java.lang.Runnable}.</li>
596</ul>
597</li>
598
599<li>
600Se um aplicativo no Android N com permissão
601{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES}
602tentar excluir um pacote instalado por outro aplicativo,
603o sistema solicitará a confirmação do usuário. Nesse cenário, os aplicativos devem esperar
604{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION}
605como status de retorno ao invocar
606{@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}.
607</li>
608
609</ul>
610
611