Bom dia a todos! Este artigo é sobre como criar um perfil de jogos do Unity no Android com Android Studio. Falarei sobre como configurar o Android Studio e obter a quantidade máxima de dados. Questões de análise e conclusões baseadas no resultado estão fora do escopo deste artigo.
Exigências
Para criar um perfil completo do aplicativo, você precisa de um telefone com Android 8 ou posterior (API 27). Na experiência, criar perfis com versões mais antigas do Android é mais aventureiro do que bom. Por esse motivo, recomendo obter uma linha completa de dispositivos Nexus, pois eles têm hardware antigo e as atualizações mais recentes do Android.
Configurando um projeto do Unity
Para obter o resultado, você precisa configurar o projeto do Unity de uma certa maneira.
Configurações em Configurações de compilação

- Antes de tudo, você deve mudar o Build System para “Gradle” e marque a caixa ao lado de “Export Project” . Assim, obteremos um projeto pronto para Android Studio, que continuaremos a criar um perfil. A criação de perfil de um APK finalizado também é possível, mas mais limitada e requer mais preparação.
- É aconselhável desativar o modo "Development Build" , pois os tempos resultantes no criador de perfil serão o mais próximo possível dos reais.
Configurações nas configurações do player

- Instale o back-end de script no IL2CPP . Se você sair do Mono, com o perfil nativo, veremos muitas funções do Mono, sem informações sobre como elas se relacionam com o código C #.
- A opção 'Configuração do compilador C ++' para Android não tem efeito (no Unity 2018.3). Você pode colocá-lo em 'Release', talvez em versões futuras da cadeia de ferramentas do Unity Android, essa configuração afete as configurações do compilador.
- É aconselhável limitar a 'Arquitetura de destino' ao ARMv7 . Assim, você economiza tempo de compilação e experimenta muitas arquiteturas que às vezes colocam o Android Studio em um estupor.
- Também vale a pena definir várias configurações adicionais:
- Local da instalação - 'Preferir externo'
- Acesso à Internet - 'Exigir'
- Permissão de gravação - 'Externo (SDCard)'
O Android Studio e outros criadores de perfil usam o simpleperf para coletar estatísticas e precisará acessar um cartão de memória para gravar arquivos temporários.
Preparando o Projeto Gradle
Depois de instalar todas as configurações, crie um projeto do Unity. Você deve obter uma pasta com o projeto Gradle.

O Unity usa como padrão a construção de um projeto para que você planeje construir o APK final a partir dele. Portanto, todas as informações de depuração foram excluídas, mas felizmente podem ser retornadas. Para fazer isso, você precisa substituir libil2cpp.so e libunity.so pela versão com informações de depuração.
libil2cpp.so
Este é um arquivo que contém todo o código C ++ gerado pelo IL2CPP a partir do seu código C #. O Unity gera todas as informações necessárias para criação de perfil, mas para otimizar o tamanho do APK, ele é cortado durante o processo de criação. Para devolvê-lo:
- Vá para a pasta do seu projeto
- Localize a subpasta Temp e vá para a subpasta Temp / StagingArea / symbols / armeabi-v7a
- Procure por 'libil2cpp.so.debug' nele. Esta é a versão do 'libil2cpp.so' com informações de depuração.
- Agora vá para o projeto Gradle e encontre a pasta '\ src \ main \ jniLibs \ armeabi-v7a' nele
- Substitua 'libil2cpp.so' pelo arquivo 'libil2cpp.so.debug'
libunity.so
Este é o arquivo que contém a parte de baixo nível do Unity Player. Como estamos fazendo versões da versão, o Unity coloca um arquivo no seu projeto sem depurar informações. Você precisa substituir libunity.so por um arquivo de caractere.
- Vá para a pasta em que você tem o Unity instalado
- Vá para a pasta "\ Data \ PlaybackEngines \ AndroidPlayer \ Variations \ il2cpp \ Development \ Libs \ armeabi-v7a \"
- Tire o arquivo libunity.so de lá e substitua o arquivo em seu projeto, que está na pasta '\ src \ main \ jniLibs \ armeabi-v7a'
Criação de perfil
Agora você pode começar a criar perfis no Android Studio, basta clicar no botão Iniciar perfil.

O Android Studio inicia o aplicativo e a sessão de criação de perfil começa

Por padrão, o Android Studio exibe gráficos, mas não mostra dados. Para iniciar o processo, você precisa clicar na trilha da CPU para que o criador de perfil alterne para a visualização da CPU. Nesse caso, uma lista suspensa e o botão 'Gravar' aparecerão na parte superior da janela.

Selecione 'Nativo' amostrado (no Android Studio 3.3 - C / C ++ Native) e clique no botão 'Gravar'.
Como a gravação é feita no disco do dispositivo, é melhor não gravar mais do que 5 a 8 segundos da experiência, muitos dispositivos também falharão em uma quantidade menor de dados (consulte a lista de dispositivos testados no final do artigo).
Para obter o resultado, clique em 'Parar' e depois em um quadrado vermelho para interromper a sessão. É difícil entender a idéia dos autores, mas se você não interromper completamente a gravação, o criador de perfil nem sempre começará a analisar os dados recebidos e seu segmento com os dados irá longe.

Depois disso, resta apenas esperar um pouco; depois de 30 a 50 segundos, o criador de perfis fornecerá o resultado. Se tudo estiver configurado corretamente, você será capturado com todos os nomes de funções

Recursos conhecidos
- Os resultados mais estáveis podem ser obtidos em dispositivos raiz
- Não use Samsung, e eles têm muitos sinos e assobios de proteção que interferem na depuração
- Em muitos lugares, sua pilha coletiva entrará em funções no formato 'kernel.kptr + address'. São chamadas dentro do Kernel do Android que são protegidas devido a políticas de segurança. Em um dispositivo raiz, a proteção pode ser desativada:
- Execute o `adb shell`
- Execute `su` para obter privilégios de root
- Execute 'sysctl -w kernel.kptr_restrict = 0' - isso removerá a proteção do kernel
- [!] Após a depuração, execute 'sysctl -w kernel.kptr_restrict = 1'. Alguns dispositivos não poderão inicializar o sistema operacional após a reinicialização. Em muitos casos, ele é tratado apenas com um núcleo limpo.
- Se o Android Studio travar com frequência, você pode tentar aumentar a pilha da Java VM:
- 2Gb - para projetos de tamanho médio ('-Xmx2g')
- 4Gb - para grandes projetos ('-Xmx4g')
- Em dispositivos não-rooteados, algumas vezes, alternar o kernel para o 'modo permissivo' melhora a situação.
- Execute o comando 'adb shell setenforce 0'
Dados específicos da unidade
- O segmento principal do Unity é chamado UnityMain, mas você pode ver muitos UnityMain ao criar um perfil. Esses são os threads de usuário que você cria dentro do código C #. Por padrão, eles recebem o mesmo nome. O segmento principal do Unity geralmente é fácil de distinguir, pois será o mais carregado.
- O fluxo gráfico é chamado UnityGfxWorkerW
- Os encadeamentos do sistema do Unity Job são chamados de Thread do trabalhador.
- Infelizmente, algumas funções de espera que o Unity usa (futex-s), o Android Studio mostra e considera não como tempo de espera, mas como atividade.
- Quando você olha para o gráfico de chamadas na visualização Top Down, precisa passar por vários níveis com uma chamada Java; infelizmente, não é possível filtrá-lo no Android Studio.

Dispositivos recomendados
Usamos os seguintes dispositivos para experimentos:
- Samsung Galaxy S8
- Google Pixel 2XL
- Pixel do Google
- Sony Xperia XA1
- Huawei Honor 7
- Huawei Nexus 6P
- Moto G5P
- Asus Nexus 7 (2013)
Todos os dispositivos foram instalados. Para o Huawei Nexus 6P, montamos o núcleo e o
AOSP . Como resultado, o Google e a Sony acabaram sendo os mais fáceis e fáceis de trabalhar. A Sony tem um ótimo site para desenvolvedores -
dispositivos abertos . A Huawei não permite mais desbloquear dispositivos de maneira fácil, a Samsung causa dificuldades constantes com níveis adicionais de proteção. O Moto G5P frequentemente travava o processo de coleta de dados do criador de perfil (simpleperf).