Historicamente, o Android só oferece suporte a tamanhos de página de memória de 4 KB, o que desempenho de memória do sistema otimizado para a quantidade média de memória total que dispositivos Android normalmente tiveram. A partir do Android 15, o AOSP oferece suporte dispositivos configurados para usar um tamanho de página de 16 KB (16 KB) dispositivos). Se o app usa alguma biblioteca NDK diretamente ou indiretamente por meio de um SDK, você precisará recriar seu aplicativo para que ele funcionam nesses dispositivos de 16 KB.
À medida que os fabricantes continuam a construir dispositivos com quantidades na memória física (RAM), a maioria desses dispositivos adotará 16 KB tamanhos de página maiores) para otimizar o desempenho do dispositivo. Adicionando o suporte a dispositivos com tamanho de página de 16 KB permite que seu app seja executado nesses dispositivos. e ajuda seu app a se beneficiar do desempenho associado melhorias. Sem a recompilação, os apps podem não funcionar em dispositivos de 16 KB quando forem colocados em produção em versões futuras do Android.
Para ajudar você a adicionar a compatibilidade com seu app, oferecemos orientações sobre como verificar caso seu app seja afetado, como recriar o app (se aplicável) e como testá-lo na em um ambiente de 16 KB usando emuladores (incluindo o Android 15); imagens do sistema para o Android Emulator).
Benefícios e ganhos de desempenho
Dispositivos configurados com tamanhos de página de 16 KB usam um pouco mais de memória em média, mas também recebem várias melhorias de desempenho para o sistema e os apps:
- Menor tempo de inicialização do app enquanto o sistema está sob pressão de memória: 3,16% menor, em média, com melhorias mais significativas (até 30%) para alguns apps testados.
- Consumo de energia reduzido durante a inicialização do app: em média, 4,56% de redução
- Lançamento mais rápido da câmera: inicializações a quente 4,48% mais rápidas, em média, e inicializações a frio 6,60% mais rápidas, em média.
- Melhoria no tempo de inicialização do sistema: melhoria de 1,5% (aproximadamente 0,8 segundo) em média.
Essas melhorias são baseadas em nossos testes iniciais, e os resultados em dispositivos reais provavelmente serão diferentes. Forneceremos análises adicionais de ganhos potenciais para apps à medida que continuarmos nossos testes.
Verificar se o app vai ser afetado
Se o app usar código nativo, recrie-o com suporte a dispositivos de 16 KB. Se você não tem certeza se o app usa código nativo, use o APK Analyzer para identificar se há algum código nativo.
Se o app usa apenas código escrito na linguagem de programação Java ou Kotlin, incluindo bibliotecas ou SDKs, ele já oferece suporte a dispositivos de 16 KB. No entanto, recomendamos que você teste seu app em um ambiente de 16 KB para verificar se não há regressões inesperadas no comportamento dele.
O app usa código nativo?
O app usa código nativo se alguma das seguintes condições se aplicar:
- O app usa qualquer código C/C++ (nativo). Caso seu app use a plataforma NDK, o app usará código nativo.
- O app é vinculado a quaisquer bibliotecas ou dependências nativas de terceiros que usá-los.
- Seu app foi feito por um criador de apps de terceiros que usa bibliotecas nativas em dispositivo.
Identificar bibliotecas nativas usando o APK Analyzer
O APK Analyzer é uma ferramenta que permite avaliar vários aspectos de um aplicativo APK. Para identificar se o app usa bibliotecas ou código nativo, siga estas etapas:
- Abra o Android Studio e clique em File > Abra e escolha um projeto.
Na barra de menus, clique em Build > Analisar APK...
Escolha o APK que você quer analisar.
Procure na pasta
lib
, que hospeda arquivos de objetos compartilhados (.so
), se houver estão presentes. Se houver arquivos de objeto compartilhado, o app vai usar arquivos o código-fonte é alterado. Se nenhum arquivo de objeto compartilhado estiver presente ou não houver uma pastalib
: o app não vai usar código nativo.
Criar o app com suporte a dispositivos de 16 KB
Para oferecer suporte a dispositivos de 16 KB, os apps que usam código nativo precisam concluir a etapas descritas nas seções a seguir.
Atualizar o empacotamento das suas bibliotecas compartilhadas
Recomendamos que você faça upgrade para a versão 8.3 ou mais recente do AGP e use o comando bibliotecas compartilhadas.
AGP versão 8.3 ou mais recente.
Em dispositivos de 16 KB, os apps vêm com bibliotecas compartilhadas não compactadas. alinhe-as em um limite alinhado em zip de 16 KB. Para isso, você precisa fazer upgrade ao Plug-in do Android para Gradle (AGP, na sigla em inglês) versão 8.3 ou mais recente. Consulte a documentação Seção "Assistente de upgrade do plug-in do Gradle" para mais detalhes sobre o processo de upgrade.
AGP versão 8.2 ou anterior.
Se não for possível fazer upgrade do AGP para a versão 8.3 ou mais recente, a alternativa é mudar para bibliotecas compartilhadas compactadas. Atualizar a configuração do Gradle para faça com que o Gradle compacte as bibliotecas compartilhadas ao empacotar seu aplicativo para evitar que ele problemas de instalação com bibliotecas compartilhadas desalinhadas.
Groovy
No seu arquivo build.gradle
, adicione esta opção:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
No seu arquivo build.gradle.kts
, adicione esta opção:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
Compile seu app usando o alinhamento de ELF de 16 KB.
Os dispositivos de 16 KB exigem a versão da biblioteca compartilhada Segmentos do ELF a serem alinhados corretamente usando o alinhamento ELF de 16 KB para que seu app seja executado.
Para compilar seu app usando o alinhamento de ELF de 16 KB, conclua as etapas de uma das as seções a seguir, dependendo da versão do Android NDK que você usando.
Android NDK r26 e versões anteriores
Para oferecer compatibilidade com a compilação de bibliotecas compartilhadas alinhadas de 16 KB com o Android NDK
versão r26 ou anterior, é necessário atualizar seu ndk-build
ou cmake
da seguinte maneira:
ndk-build
Atualize o Android.mk
para ativar o alinhamento do ELF de 16 KB:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
Atualize o CMakeLists.txt
para ativar o alinhamento do ELF de 16 KB:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Android NDK r27 e versões mais recentes
Para oferecer compatibilidade com a compilação de bibliotecas compartilhadas alinhadas de 16 KB com o Android NDK
versão r27 e superior, é necessário atualizar o ndk-build
, build.gradle
,
build.gradle.kts
ou sinalizações do vinculador da seguinte maneira:
ndk-build
No seu Application.mk
:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy
No arquivo build.gradle
, defina o argumento
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin
No arquivo build.gradle.kts
, defina o argumento
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
Outros sistemas de build
Especifique as seguintes sinalizações do vinculador:
-Wl,-z,max-page-size=16384
Verificar se há instâncias de código que fazem referência a tamanhos de página específicos
Mesmo que seu aplicativo esteja alinhado a 16 KB, ele pode encontrar erros se os lugares no seu código presumem que um dispositivo está usando um tamanho de página específico. Para evitar isso, siga estas etapas:
Remova todas as dependências codificadas que fazem referência ao
PAGE_SIZE
. ou instâncias na lógica do código que pressupõem que a página de um dispositivo é 4 KB (4096
).Use
getpagesize()
ousysconf(_SC_PAGESIZE)
.Procure usos de
mmap()
e outras APIs que exigem alinhamento à página e substitua por alternativas quando necessário.
Em alguns casos, se o app usa PAGE_SIZE
como um valor conveniente que não é
vinculado ao tamanho da página subjacente, isso não causará falhas no aplicativo
quando usada no modo de 16 KB. No entanto, se esse valor for passado para o kernel,
com mmap
sem MAP_FIXED
, o kernel ainda usa uma página inteira, que
desperdiça um pouco de memória. Por esses motivos, PAGE_SIZE
é indefinido quando 16 KB
está ativado no NDK r27 e versões mais recentes.
Se o app usar PAGE_SIZE
dessa maneira e nunca transmitir esse valor diretamente para o
kernel e, em vez de usar PAGE_SIZE
, crie uma nova variável com um novo
para indicar que ele é usado para outros fins e não reflete uma identidade real
na página "Memória".
Testar o app em um ambiente de 16 KB
Depois de criar seu app com suporte a dispositivos de 16 KB, você vai querer testar o app em um ambiente de 16 KB para saber se ele é compatível regressões. Para isso, siga estas etapas:
Configure um dos seguintes ambientes de teste:
Inicie o dispositivo de teste e execute o seguinte comando para verificar se ele usa um ambiente de 16 KB:
adb shell getconf PAGE_SIZE
O comando precisa retornar um valor
16384
.Para as bibliotecas compartilhadas, verifique se o arquivo Os segmentos de ELF são corretamente alinhados com o alinhamento ELF de 16 KB. É possível usar esse script para ajudar com esse processo:
#!/bin/bash # usage: alignment.sh path to search for *.so files dir="$1" RED="\e[31m" GREEN="\e[32m" ENDCOLOR="\e[0m" matches="$(find $dir -name "*.so" -type f)" IFS=$'\n' for match in $matches; do res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)" if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)" else echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)" fi done
Salve o script em um arquivo, como
alignment.sh
.Extraia o arquivo APK do seu app:
unzip APK_NAME.apk -d /tmp/my_apk_out
Execute o script nos arquivos extraídos no
/tmp/my_apk_out
diretório:alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
O script gera
ALIGNED
ouUNALIGNED
para todos osarm64-v8a
bibliotecas compartilhadas.Se alguma biblioteca compartilhada
arm64-v8a
forUNALIGNED
, você precisará atualize o empacotamento dessas bibliotecas e recompile seu e teste novamente seguindo as etapas desta seção.
Execute o comando
zipalign
a seguir para verificar se o app está 16 KB alinhado, em que APK_NAME é o nome do arquivo APK do seu app:zipalign -c -P 16 -v 4 APK_NAME.apk
Testar minuciosamente seu app, concentrando-se em todas as áreas que podem ser afetadas alterar instâncias de código que fazem referência a tamanhos de página específicos.
Configurar o Android Emulator com uma imagem do sistema Android 15 baseada em 16 KB
Para configurar um ambiente de 16 KB usando o Android Emulator, siga estas etapas: etapas:
Imagens do sistema do emulador do Android 15 de 16 KB são compatíveis com Android Studio Jellyfish | 2023.3.1 ou mais recente. No entanto, para que as melhores ao trabalhar com o Android 15 Beta, baixe a versão mais recente versão de pré-lançamento do Android Studio.
Vale lembrar que você pode manter a versão atual do Android Studio instalada, já que é possível instalar diversas versões lado a lado.
No Android Studio, clique em Tools > SDK Manager.
Na guia SDK Platforms, marque Show Package Details e expanda na seção Android VanillaIceCream Preview e selecione uma as seguintes imagens do sistema do emulador, dependendo dos dispositivos virtuais que você que queremos criar:
- Imagem do sistema experimental de 16 mil das APIs do Google ARM 64 v8a
- Imagem do sistema Atom experimental 16k das APIs do Google
Clique em Aplicar > OK para fazer o download das imagens do sistema selecionadas.
Siga as etapas para configurar um dispositivo virtual para o Android 15 e quando for solicitado que você escolha uma imagem do sistema, escolha a imagem de 16 KB que você fez o download. Se ele não for recomendado automaticamente, Imagem do sistema de 16 KB na guia Outras imagens.
- No Gerenciador de dispositivos, clique nos três pontos ao lado da imagem de 16 KB e clique em Mostrar no disco.
- Nela, localize o arquivo
config.ini
. Adicione a linha abaixo ao arquivo
config.ini
e salve as mudanças:kernel.parameters = androidboot.page_shift=14
Para verificar as alterações, execute o comando a seguir, que deve retornar
16384
:adb shell getconf PAGE_SIZE