Pequim vez em 14 março de 2019 o Google lançou oficialmente Android Q Beta 1 e SDK de visualização, o que significa que os desenvolvedores Android estava prestes a inaugurar uma nova versão do trabalho anual adaptação. Q Android para desenvolvedores que trazem muitas características novas, tais como dobramento de tela sobreposição de itens avançados, uma nova conexão de rede API, decodificador de mídia nova, câmera, novas funcionalidades, expansão NNAPI, Vulkan 1.1 gráficos apoiar e assim por diante.
1. Rights
<usos-permissão Android: name = "android.permission.ACCESS_BACKGROUND_LOCATION" />
<usos-permissão Android: name = "android.permission.READ_PRIVILEGED_PHONE_STATE" />
<usos-permissão Android: name = "android.permission.CAMERA" / >
<usos-permissão android: name = "android.permission.ACCESS_FINE_LOCATION" />
2. Modificar a versão compilada e a versão de destino
compileSdkVersion 29 (28+)
targetSdkVersion 29 (28+)
foto álbum 3. Selecione problemas de permissão
Adicionar a próxima aplicação de etiquetas
android: requestLegacyExternalStorage = “true”
caminho de pasta 4. Get
Corda savepath = Environment.getExternalStorageDirectory () + “/ DownFile /”;
O método acima, para ser substituído após a aquisição, de outro modo falhar
Cadeia savepath = getExternalCacheDir () + " / DownFile /";
5. Android Q mudança de comportamento: todas as aplicações
A parte oficial destes documentos independentes de mudanças de comportamento Q: todas as aplicações para introduzir, porque isso é parte de uma grande e importante, a maior das quais é a mudança de direitos de privacidade dos usuários de atualização. permissão específica para a mudança é a seguinte:
competência | aplicativos afetados | Como habilitar (esfera de influência) |
---|---|---|
direitos de armazenamento | acesso a aplicativos e arquivos de dispositivo de armazenamento externo compartilhados | adb concha sm conjunto-isolado de armazenamento-de (descrito abaixo) |
direitos de posicionamento | Acesso aplicação de pedido de informação da localização do usuário em segundo plano | Esta política de permissão no Android Q está sempre ativada |
Atividade iniciado a partir do fundo | Ele não requer interação do usuário para iniciar a aplicação de Atividade | Fechar permite que o sistema para executar opções de atividades fundo para permitir aos desenvolvedores limite |
identificador de dispositivo (deviceId) | número de série do equipamento de acesso ou aplicações IMEI | Aplicação do dispositivo montado na montagem Android Q |
Privilégios de digitalização sem fio | aplicação API WLAN usando a API Bluetooth eo | Com Q Android para a plataforma de destino |
mudanças menos afetar as permissões de início da atividade e permissão de digitalização sem fio de fundo duas permissões, este artigo descreve não, você pode ver os detalhes, consulte o documento oficial: https: //developer.android.com/preview/privacy/background-activity- começa
começar a permissão Atividade de fundo alterações somente para nenhuma interação com o usuário sobre a situação para iniciar uma Actividade, (tais como autorização de pouso micro-channel).
Este artigo incidirá sobre os direitos de armazenamento, permissões e mudança e posicionamento adaptação dispositivo identificador de três permissão.
1. Mudança de direitos de armazenamento do usuário
Q Android no dispositivo de armazenamento externo fornece uma "caixa de areia isolado de armazenamento" (por exemplo, / sdcard) para cada pedido. Qualquer outra aplicação não pode acessar diretamente o arquivo sandbox sua aplicação. Uma vez que o arquivo é um arquivo privado a sua aplicação, para que você não precisa de nenhuma permissão para acessar e salvar seus arquivos em um dispositivo de armazenamento externo. Esta mudança vai tornar mais fácil para garantir a privacidade dos arquivos do usuário, e ajuda a reduzir o número de permissões exigidas pelo aplicativo.
Google arquivo do aplicativo oficialmente recomendado é armazenada na caixa de areia endereço para os Context.getExternalFilesDir()
arquivos na pasta. Por exemplo, para guardar uma imagem deve ser colocado Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
em.
Endereço do arquivo de destino a seguir irá descrever como a adaptação de acesso:
-
Acesse seus arquivos: Q com permissão de mídia específico mais granular substituídas e canceladas
READ_EXTERNAL_STORAGE
eWRITE_EXTERNAL_STORAGE
autoridade, e não precisa de permissão específica, os aplicativos podem acessar seus próprios arquivos na caixa de areia. -
O acesso aos arquivos de mídia do sistema: Q introduz uma nova definição de um conjunto compartilhado de arquivos de mídia, se você quiser acessar o compartilhamento de mídia arquivos fora do sandbox, como fotos, música, vídeos, etc., necessidade de solicitar um novo direitos de mídia:
READ_MEDIA_IMAGES
,READ_MEDIA_VIDEO
,READ_MEDIA_AUDIO
, para aplicar o mesmo os originais permissões de loja. -
Baixe o acesso ao sistema de arquivos: o acesso ao sistema pasta de download, restrições temporárias não, no entanto, o acesso a quais arquivos em outras aplicações, o sistema deve permitir aos usuários utilizar o seletor de arquivos para selecionar o arquivo do aplicativo.
-
Acesso outras aplicações arquivo em modo seguro: Se seu aplicativo precisa usar um arquivo criado em outros aplicativos no sandbox, clique sobre o arquivo usando outras aplicações, este artigo não descrever.
Então, por favor juiz quando o aplicativo é executado na plataforma Q, cancelar a aplicação das duas permissões READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE. E substituído por um novo permissões específicas-media.
Quando cada uma das seguintes condições são satisfeitas, o modo compatível aberto, isto é, não abrir o dispositivo de armazenamento altera as permissões Q:
- Aplicação targetSDK <= P.
- Aplicativo instalado no Android P para atualizar a partir de dispositivos Android Q.
Quando aplicado para reinstalar (atualização), não vai voltar a abrir o modo de compatibilidade, armazenar permissões alterações terão efeito.
Portanto, de acordo com o documento oficial disse, independentemente de targetSDK Q, deve solicitar permissão para alterar o adaptador de armazenamento.
No teste, quando targetSDK <= P, duas aplicações na velha direita Q Beat1 Edição alterado automaticamente para aplicar três novos direitos, a aplicação não afeta o uso normal, mas quando targetSDK == Q, a aplicação irá falhar velha direita e afetar o uso normal de aplicações.
2. A autoridade de mudar o posicionamento de usuários
Para dar aos usuários mais controle sobre acesso ao aplicativo para informações de localização, Android Q introduz as novas permissões localização ACCESS_BACKGROUND_LOCATION
.
Existente ACCESS_FINE_LOCATION
e ACCESS_COARSE_LOCATION
as permissões, as novas permissões só irá afectar o acesso à informação sobre a localização dos aplicativos em execução em segundo plano. aplicação atividade a menos que um visível ou aplicativo está sendo executado recepção, caso contrário, o pedido será considerado no fundo.
Como com sistema iOS, Q também acrescentou autoridade local em segundo plano ACCESS_BACKGROUND_LOCATION
, se também é necessária a aplicação para obter a localização do usuário (como gotas) no fundo, você precisa aplicar dinamicamente ACCESS_BACKGROUND_LOCATION
acesso.
É claro que, se não for necessário, a aplicação sem quaisquer alterações, eo Google vai fazer um tratamento diferente de acordo com a aplicação de targetSDK:
aplicação targetSDK <= P se o pedido ACCESS_FINE_LOCATION
ou ACCESS_COARSE_LOCATION
permissão, dispositivo Q vai ajudar automaticamente você aplicar para ACCESS_BACKGROUND_LOCATION
a permissão.
3. Altere o identificador único do dispositivo
Começando Android Q, a aplicação deve ter um READ_PRIVILEGED_PHONE_STATE
identificador não-reajustável (IMEI e número de série incluído) permissão assinado para acessar o dispositivo.
Se a sua aplicação sem essa permissão, mas você ainda tentar consultar identificador de informações, ele irá retornar um valor nulo ou um erro.
O dispositivo precisa de identificadores exclusivos de atenção especial, o original READ_PHONE_STATE
autoridade tem sido incapaz de obter IMEI e de série.
Para obter o dispositivo usando o seguinte código no dispositivo ID Q
((TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
- 1
O código acima é executado para devolver um valor nulo (targetSDK <= P) ou erro (targetSDK == Q). E disse o funcionário READ_PRIVILEGED_PHONE_STATE
permissão está disponível apenas para aplicativo do sistema, de modo que este método não trabalho.
Google oficial deu um dispositivo único melhores práticas de identificação, mas este método determinada variável ID, pode ser resolvido de acordo com as necessidades específicas de específico. Este artigo fornece um método UUID substancialmente constante e repetível:
public static String getUUID() {
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
serial = android.os.Build.getSerial();
} else {
serial = Build.SERIAL;
}
//API>=9 使用serial号
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
//serial需要一个初始化
serial = "serial"; // 随便一个初始化
}
//使用硬件信息拼凑出来的15位号码
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
Embora a mudança vai levar a uma autoridade identificador único android.os.Build.getSerial () retorna desconhecida, mas porque a luta é a informação hardware m_szDevIDShort fora, por isso ainda garantir a unicidade ea durabilidade UUID.
Resultados da saída de teste são como se segue
O método acima foi testado em exatamente o mesmo quando ele pode ser repetido, online, bem como outros programas, como androidID, mas androidID pode retornar modelos nulos devido razões, tanto para escolher entre duas maneiras de pensar. Obter uma versão do ID do dispositivo é mais resistente do que uma versão, se não é um bom método de boas-vindas que.
Em Android Q, quando um usuário primeiras corridas com Android 6.0 (nível API 23) as seguintes versões para qualquer plataforma de destino aplicativo, a plataforma Android irá emitir um aviso para o usuário.
Se o aplicativo requer que o usuário conceder a permissão, o sistema irá primeiro fornecer aos usuários a oportunidade de ajustar a permissão aplicativo antes de permitir que esta aplicação é executado pela primeira vez.
6. Android Q mudança de comportamento: A Q Android para os aplicativos da plataforma alvo
Não limitativos de interface SDK
Não limitativos de interface SDK foi proposto no Android P, Q, no entanto, a interface é restrita a classificação grandes alterações.
Introdução de espécies não-Interface SDK
A fim de garantir a compatibilidade estabilidade e aplicação, a plataforma Android começou a limitar seu aplicativo pode usar a interface em que não SDK em Android 9 (nível API 28). Não restrita lista de interfaces SDK inclui a actualização do Android Q (com base em testes internos e da mais recente colaboração entre desenvolvedores e Android).
Não limitante de interface SDK é um método privado no SDK, tais como métodos privados, obtém chamada pela reflexão Java e afins, então a chamada será alvo> = P ou destino> = Q está limitada ao uso no dispositivo, quando você usar esses métodos, vamos reclamar
método de aquisição | Mensagens de erro |
---|---|
instruções Dalvik referência a um campo | NoSuchFieldError jogado |
instruções Dalvik referência a um método | NoSuchMethodError jogado |
Reflexão através Class.getDeclaredField () ou Class.getField () | NoSuchFieldException jogado |
Reflexão através Class.getDeclaredMethod (), Class.getMethod () | NoSuchMethodException jogado |
Reflexão através Class.getDeclaredFields (), Class.getFields () | Não SDK não membros nos resultados |
Reflexão através Class.getDeclaredMethods (), Class.getMethods () | Não SDK não membros nos resultados |
JNI via env-> GetFieldID () | NULL retornado, NoSuchFieldError jogado |
JNI via env-> GetMethodID () | NULL retornado, NoSuchMethodError jogado |
Encontrar um não-Interface SDK
Se você não tem certeza se seu aplicativo usa uma interface não-SDK, você pode testar o aplicativo para confirmar. Quando você chamar uma interface não-SDK estarão acessando semelhante log XXX oculto:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
- 1
Mas no final um grande projeto onde o uso destes métodos dependem do código e analisar o log para ver certamente não é realista, Google oficial também forneceu inspector oficial Veridex usado para detectar um apk onde o uso de interface não-SDK. Veridex Download: https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat
incluindo Windows, Linux e Mac versão, o download correspondente. Deve extrair a linha CD Veridex diretório usando ./appcompat.sh --dex-file = Q.apk automaticamente varredura. Q.apk caminho absoluto para o pacote, se o pacote eo pacote Veridex nome do arquivo de entrada diretamente no mesmo diretório. Os resultados da verificação dividido em duas partes, uma parte das interfaces sem chamada SDK posição, uma outra parte do número de estatísticas de interface não-SDK.
adaptador de interface não-SDK
Se o seu aplicativo depende de interface não-SDK, você deve começar o planejamento para migrar para o SDK alternativa. Se você não consegue encontrar uma alternativa ao uso de interface não-SDK é uma função da aplicação, você deve solicitar uma nova API pública.
requisitos oficiais targetSDK> = aplicação de P não usar esses métodos, e procurar outras alternativas para essas interfaces API SDK não pública, se não, você pode aplicar para o Google, solicitar uma nova API pública: https: // developer. android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#feature-request
Existem dois projetos que utilizam interface não-SDK para uma alta probabilidade:
- Ver personalizado no processo utilizado para a conveniência de modificar um parâmetro que reflete.
- No uso de sem partido interfaces de SDK SDK (tais casos mais).
A primeira é uma boa solução, afinal, é escrever nosso próprio código. A segunda dor de cabeça, apenas para atualização para a versão mais recente do SDK tripartite, ou mencionar a ordem de trabalho, através do banco (também a maior parte de todo o processo de trabalho de adaptação).
7. Problemas de projeto de atualização Android encontradas
Simulator X 86, SO projetar v7 biblioteca
- Encontrar o código-fonte de modo biblioteca, compilados em x86
- Se assim for a biblioteca apenas para usar um ponto de recurso, nenhuma grande APP impacto global sobre, para que possa bloquear as funções da biblioteca específicas ou saltar teste
- Se assim for a biblioteca é o projeto de biblioteca de núcleo deve ser carregado, também pode ser medida usando Tencent nuvem, não há Google própria versão filho Q do acima. medições nuvem Tencent tem adb recursos de depuração remota de conexão (que não tiveram sucesso). adb Rom não importa, é instalado diretamente sobre a linha, a nuvem pode ser medido diretamente olhar para o log.
- Como eu tentei entre Houdini estudado, por isso, teoricamente pode ser instalado na biblioteca compilada emulador v7 x86, mas devido à relativamente pequena introdução ao Houdini também mais velhos, propusemos o tempo não é suficiente, então não estudam.
Requer plataforma de desenvolvimento Q mas esta é uma plataforma de lançamento.
Q é devido para a versão atual de visualização, para que a aplicação targetSDK == Q só pode ser executado no dispositivo Q.
INSTALL_FAILED_INVALID_APK: Falha para extrair bibliotecas nativas, res = -2
Este erro é devido à compressão de modo a biblioteca embalado causada por razões específicas visto: https: //issuetracker.google.com/issues/37045367
juntar-se a aplicação de nó AndroidManifest.xml android:extractNativeLibs="true"
podem ter sido adicionados acima do código ou não, em app / DefaultConfig nó é adicionada sob build.gradle
packagingOptions{
doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" }
- 1
- 2
Não encontrou classe “org.apache.http.client.methods.HttpPost"
Foi adicionado ao nó de aplicativo AndroidManifest.xml
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
- 1
Se o seu projeto não se encaixa através do O android ou P, então você precisa prestar atenção
android O Ler um instalados permissões de aplicativos (atualizados automaticamente influente dentro do aplicativo)
o padrão android P proibir o acesso à API http
Documentos neste artigo:
Android Q Beta ligação desenvolvedor Documentação :: https://developer.android.com/preview
Android Q Beta espelho Download Link: https://developer.android.com/preview/download
Android Q Beta发布blog: https://android-developers.googleblog.com/2019/03/introducing-android-q-beta.html
Não SDK Interface: https://juejin.im/post/5afe50eef265da0b70262463