A experiência é rei - o trabalho em primeiro lugar na competição Umeng+ Mobile Performance Optimization 2021


Prefácio

Nesta era em que "a experiência do usuário é rei", como garantir ao máximo a estabilidade dos produtos e serviços e fornecer uma boa experiência ao usuário é uma questão que os desenvolvedores precisam pensar e resolver com urgência. Umeng+, um provedor global de serviços de dados que atende desenvolvedores há 11 anos, lançou o 2021 Mobile Application Performance Challenge. O presidente da Umeng+, o diretor técnico da Umeng+, o vice-presidente da CSDN, o CTO da Sifou, o responsável pelo terminal móvel Alibaba Fliggy, Xianyu e outros formaram conjuntamente o grupo de revisão de especialistas. Após a seleção, tive a sorte de conquistar o primeiro lugar. Agora gostaria de compartilhar com vocês o conteúdo do meu trabalho. Você também pode discutir suas idéias na área de comentários.

Otimização do desempenho do sistema de conferência de reconhecimento facial

um. Antecedentes do projeto

1. Introdução

A empresa é uma empresa de Internet das Coisas que pretende desenvolver por conta própria uma máquina de painel de login e participação em conferências faciais. Para melhorar a competitividade do produto, ela foca na relação custo-benefício + diferenças customizadas (o hardware é barato e fácil de usar , e a página do software é legal e incrível); o departamento de pesquisa e desenvolvimento de software precisa Suporta o aplicativo de tablet Android correspondente para conferência facial e presença. As principais funções de negócios incluem: função de reconhecimento facial (coleção de rostos, reconhecimento de comparação, gerenciamento de banco de dados facial), módulo de conferência, função de presença e entrada e módulo interativo personalizado.
Insira a descrição da imagem aqui

Diagrama de interação de reconhecimento facial

Após a comunicação com o gerente de produto de hardware, um conjunto de protótipos e um conjunto de listas de produtos são fornecidos para apoiar o desenvolvimento e teste de pesquisa e desenvolvimento de software.
A placa-mãe tem memória RK3288 quad-core 1.8GHZ.2g. Placa de armazenamento 8G, sistema operacional Android 5.1. A tela é uma tela de toque capacitiva de 10 pontos com resolução 1920 * 1080 de 15,6 polegadas.
Insira a descrição da imagem aqui

Diagrama da placa-mãe RK3288

Insira a descrição da imagem aqui

Parâmetros principais da placa-mãe RK3288

A seleção do framework é usar React Native + tracker.js. Considerando o controle de custos, ele não integra o SDK de reconhecimento facial Android existente no mercado. Por experiência, tracker.js foi usado para substituir a captura de reconhecimento facial no lado da implementação do opencv, e o lado do servidor foi usado para implementar a comparação facial (isso abriu caminho para erros subsequentes).Depois de trabalhar horas extras por um período de tempo, o foi desenvolvido o sistema de participação em conferências presenciais V0.1- Versão Alpha.
O processo de aquisição é relativamente lento. Após a chegada do conselho de desenvolvimento, uma rodada de testes em máquinas reais foi iniciada. Após uma rodada de testes, os membros da equipe disseram que estavam desamparados. Todas as outras máquinas estavam bem, mas esta não estava funcionando, e eles suspeitaram de um problema de hardware.
Depois de eliminar os motivos de hardware, assumi a liderança na otimização do desempenho do sistema como um todo.

2. Problemas e desafios encontrados

1. Pergunta

1. O reconhecimento facial não é suave, as pessoas e as imagens estão fora de sincronia e há um atraso óbvio. As pessoas que entram e saem do quadro da câmera com frequência serão acompanhadas por uma sensação de frustração.
2. Fonte de alimentação POE, o software ficará quente durante a execução por um longo tempo.
3. Ocorrem falhas ocasionais e registros anormais valiosos não podem ser capturados.

2. Desafio

1. O desenvolvimento Android puro não é usado (os membros da equipe basicamente não conhecem o desenvolvimento nativo do Android) + SDK Android de reconhecimento facial (a demanda por controle de custos). Limita o limite superior de desempenho.
2. O desempenho do hardware é baixo. O processador RK3288, equipado com a GPU Mali-T764, foi considerado um milagre em 2014 e era conhecido como o processador ARM mais poderoso da China, mas já se passaram 6 ou 7 anos e ainda usamos a versão básica. A máquina com tablet Android também precisa ter algum outro software relacionado integrado, e os requisitos de desempenho e estabilidade ainda são relativamente altos.
3. Existe uma probabilidade de ANR/travamento, o relatório de erro é vago e o problema não pode ser localizado.
4. Os membros da equipe são todos desenvolvedores front-end e não têm experiência suficiente em otimização e depuração de aplicativos.

2. Passos para resolver o problema

1. Revise o projeto

Conselho, não se concentre primeiro no problema em si. Especialmente para problemas de desempenho, isso é uma grande proibição. Este é um erro que muitos desenvolvedores estão propensos a cometer e até usam técnicas sutis para encobrir falhas no design do sistema. (Design de produto, design de arquitetura, design de protótipo, design de interação, design de UI, etc.)
Se ocorrerem problemas muito acima do limite durante a operação ou teste do sistema, o primeiro passo deve ser revisar o design do sistema. (Definitivamente)
Programadores inexperientes mergulharão nos bugs, enquanto programadores experientes usarão sua própria maneira de pensar para entender o problema, localizar o problema, analisar o problema, resolver o problema e verificar o problema. Como arquiteto qualificado ou líder de equipe técnica. Você deve aprender a pensar “puxando o cabelo”.
Muitos sistemas que precisam ser otimizados muitas vezes não são apenas problemas técnicos. A causa raiz pode ser um design de produto irracional, arquitetura redundante, interação anti-humana e uma interface de usuário excessivamente profunda. Devido à complexidade do sistema, ao custo de comunicação da equipe, bem como às alterações posteriores de demanda e refinamento de cenário, alguns problemas muitas vezes são difíceis de expor nas fases iniciais do projeto. Portanto, para otimizar o desempenho de sistemas de software, o primeiro passo é revisar se o design e o comportamento anteriores são razoáveis.
Na verdade, o chamado design diferenciado, depois de simplificado e eliminado fatores irracionais, sua animação e interação ainda são muito complicadas para um aplicativo industrial para tablet.

2.Análise de dados

Critérios de aceitação de detecção de rosto para este projeto:
Tamanho do pacote: ~ 100M
Tamanho mínimo de detecção de rosto: 50px * 50px
Ângulo de rosto reconhecível: guinada ≤ ±30°, inclinação ≤ ±30°
Velocidade de detecção: 100ms 720p*
Velocidade de rastreamento: 50ms 720p *
Detecção de rosto demorado: <200ms
Velocidade de recuperação do banco de dados facial: <100ms
Todo o processo de detecção + reconhecimento leva <500ms (outros indicadores de desempenho do aplicativo não serão descritos muito)
Um elemento de engenharia é usar padrões definidos para medir dados discretos. Se não houver critérios quantificáveis ​​de desempenho de renderização para otimização, isso será decidido pelo chefe do desenvolvedor/líder. Portanto, não apenas os testadores precisam entender esses indicadores, mas os desenvolvedores também devem aprender a usar ferramentas de teste para localizar problemas e verificar dados.
ok, comece a agir, teste de placa-mãe Android de conexão de rede Android adb, instale o apk.

1. Análise do modo de renderização

Ative o modo de desenvolvedor Android, verifique a velocidade de renderização e overdrawing da GPU e filtre páginas com pressão excessiva de renderização.

Insira a descrição da imagem aqui

Diagrama de análise do modo de renderização GPU

Insira a descrição da imagem aqui

Descrição da cor de renderização

Overdrawing: Na verdade, para otimização relacionada ao overdrawing, a relação de entrada-saída deve ser considerada. O resultado geral da otimização excessivamente detalhada não é alto. Neste projeto, apenas as áreas vermelhas overdrawn (áreas overdrawing 4 vezes ou mais) são executadas . otimização.

2. Analise o consumo de energia

Como o software pode aquecer durante a operação, o consumo de energia deve ser analisado.
As estatísticas de consumo de energia são componentes do sistema, o que significa que estão sempre sendo contadas quando o sistema está em execução. Portanto, as estatísticas precisam ser redefinidas ao obter relatórios estatísticos.
1. Desconecte o serviço adb primeiro e, em seguida, ative o serviço adb.
Mate o serviço adb: execute adb kill-server para evitar conflitos e dados sujos.
Reinicie o adb: execute dispositivos adb ou adb start-server
2. Redefinir a coleta de dados da bateria

adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats --reset

Em circunstâncias normais, devemos desconectar o carregador e desconectar o USB (carregar enquanto estiver conectado), o que afetará muito a validade estatística. Porém, como somos alimentados por PoE, analisamos situações específicas e utilizamos dados para auxiliar na localização de pontos anormais. Por sermos um sistema 5.1, usamos o comando adb:
Insira a descrição da imagem aqui

Como o relatório txt é bastante grande e mais de 10 m não é realista a olho nu, ele geralmente é usado com a ferramenta Battery Historian.
(Observação: o Battery Historian é para Android 5.0 (api 21) e superior. Se você tiver a sorte de ainda usar o painel industrial Android 4.4, pode pular este artigo.)
Insira a descrição da imagem aqui

Diagrama de exemplo do historiador de bateria

3. Atividade de thread e análise de CPU

Existem muitas atividades de thread e ferramentas de análise de CPU, mas aquela que vem com o Android Studio não é ótima? (O pacote Rn Android ainda usa o Android Studio, há muitas armadilhas ao usar o pacote vscode.)
Analise pontos anormais.
Insira a descrição da imagem aqui

Diagrama de exemplo do analisador de CPU do Android Studio (https://developer.android.com/)

4. Resumo dos dados

Os dados mostram que a CPU está sobrecarregada e o rastreamento faz com que o processo seja bloqueado.
Na verdade, todos sempre acreditaram que o atraso da página é causado inteiramente pela alta pressão de renderização (a renderização é o gargalo de toda a estrutura RN). Os dados do relatório mostram o oposto. Para o reconhecimento facial, a GPU não está totalmente carregada e a renderização O trabalho da interface gráfica é apenas parte dele executado pela GPU. Quando o rastreamento é bloqueado, ele aguardará temporariamente a ocorrência do atraso e, em seguida, concluirá a renderização e o posicionamento do ponto-chave da tela um por um, chamará a interface e obterá os dados retornados, renderizam o cartão de informações e executam a animação, resultando em um segundo ligeiro atraso (RN rendering Stuttering), então a resposta de desempenho flutua com a função sinusoidal, e a gagueira e a instabilidade desaparecem.
O problema do posicionamento "bater na cabeça" ocorre porque os colegas front-end geralmente não usam ferramentas de log e análise de dados suficientes.

3. Problema de posicionamento

Existem muitas maneiras de localizar problemas, como o método de pesquisa binária comumente usado (anotação binária, reversão binária). Ou depuração de pontos de interrupção e análise de log. Todos podem efetivamente nos ajudar a localizar problemas rapidamente.
Então, por meio da análise de dados e das principais categorias fornecidas pela ferramenta, encontramos o problema de forma relativamente clara: animação de cartão de informações + efeitos especiais de tela + funções relacionadas ao reconhecimento facial.

4. Analise o problema

Método de implementação original: introduza todos os js relevantes, novo rastreamento múltiplo.objectTracker para detectar as áreas de rostos, olhos e bocas. Ao perceber o efeito de exibição de pontos-chave do rosto através da tela,
Insira a descrição da imagem aqui

E colete rostos. Tracking.js usa a CPU para cálculos e é mais lento que a GPU em termos de eficiência de operação da matriz de imagem.
Neste momento, com o apoio de dados, decidi substituir a camada da estrutura de reconhecimento facial e cooperar com o RN para tentativa de otimização, usando face-api.js

face-api.js
é baseado no kernel TensorFlow.js e implementa três arquiteturas de redes neurais convolucionais para completar tarefas de detecção de rosto, reconhecimento e detecção de pontos de recursos; ele implementa um detector de sinalização facial de 68 pontos muito leve, rápido e preciso internamente. Suporta vários modelos tf, o modelo minúsculo tem apenas 80kb. Além disso, ele também suporta aceleração de GPU e operações relacionadas podem ser executadas usando WebGL.
O princípio básico é implementar um algoritmo SSD (Single Shot Multibox Detector) para detecção de rosto, que é essencialmente uma rede neural convolucional (CNN) baseada em MobileNetV1, com algumas camadas de previsão de quadro facial adicionadas à camada superior da rede.
Insira a descrição da imagem aqui

detector de marco facial face-api

Após confirmar a substituição, faça alguns ajustes no agendamento do thread React Native. Para facilitar o entendimento, simplesmente desenhei um diagrama esquemático para explicar o processo:
JS Thread: React e outros códigos JavaScript são executados neste thread.
Bridge: Ponte de conexão, com características de assíncrono, serialização e processamento em lote.
Shadow Thread: Thread para cálculo de layout e construção de interface UI.
Módulos nativos fornecem funções nativas (como álbum de fotos, Bluetooth)
UI Thread: o thread principal em aplicativos Android/iOS (ou outras plataformas).
Insira a descrição da imagem aqui
Diagrama de thread ReactNative

Por exemplo, se desenharmos uma UI, o thread JS primeiro a serializará para formar uma mensagem UIManager.createView e, em seguida, a enviará para o Shadow Thread por meio do Bridge. Depois que o Shadow Tread recebe essas informações, ele primeiro as desserializa para formar uma árvore Shadow, depois converte as informações do layout nativo e as passa para o thread da UI.
Depois que o thread da UI recebe a mensagem, ele também a desserializa primeiro e depois a desenha com base nas informações de layout fornecidas.
Esta série depende muito da ponte. Cada operação, como cálculo de altura e atualização da IU, é passada pela ponte. Quando há muitas tarefas, uma fila de tarefas será gerada e as operações assíncronas serão processadas em lotes. É difícil para alguns atualizações de front-end devem ser refletidas na interface do usuário em tempo hábil. Especialmente as operações de animação com alta frequência de atualização têm muitas tarefas e é difícil garantir que cada quadro seja renderizado a tempo.
Portanto, a direção da otimização:
1. Reduza a comunicação assíncrona entre JS Thread e UI Thread ou reduza o tamanho do JSON
2. Minimize os cálculos no lado JS Thread

5. Resolva problemas

A solução geral é substituir o tracker pelo face-api; o React Native deve ser ajustado. O texto a seguir fala principalmente sobre o ajuste do React Native em três etapas.

1. Ative o driver nativo de animação

useNativeDrive: true
As mensagens são passadas entre JS Thread e UI Thread por meio de strings JSON. Para algumas propriedades não relacionadas ao layout e eventos diretos, (useNativeDriver)esta propriedade só pode ser usada em propriedades de animação não relacionadas ao layout, como transformação e opacidade. Propriedades relacionadas ao layout, como propriedades relacionadas à altura e à posição, serão relatadas um erro após ser ativado.) Por exemplo, se o reconhecimento facial for bem-sucedido e o cartão de informações pessoais estiver animado, podemos usar useNativeDrive: true para ativar o driver de animação nativo.

Animated.timing(this.state.animatedValue, { toValue: 1, duration: 500, useNativeDriver: true, // <-- Add this }).start();  

Ao habilitar o driver nativo, enviamos todas as suas informações de configuração para a extremidade nativa antes de iniciar a animação e usamos o código nativo para executar a animação no thread da UI sem ter que se comunicar entre as duas extremidades a cada quadro. Dessa forma, a animação fica completamente separada do thread JS no início, portanto, mesmo que o thread JS fique travado neste momento, isso não afetará a animação.

2. Use o gerenciador de interação InteractionManager

Use o InteractionManager para executar algumas tarefas que precisam ser otimizadas após a conclusão das operações e animações interativas, como a animação de salto da distribuição do local. O objetivo é equilibrar o tempo de execução entre tarefas complexas e animações interativas.

const handle = InteractionManager.createInteractionHandle();// 执行动画... (`runAfterInteractions`中的任务现在开始排队等候)// 在动画完成之后开始清除句柄:InteractionManager.clearInteractionHandle(handle);// 在所有句柄都清除之后,现在开始依序执行队列中的任务  

De acordo com a explicação oficial: runAfterInteractions aceita uma função de retorno de chamada ou um objeto PromiseTask, que retorna uma Promise. Se o parâmetro fornecido for PromiseTask, mesmo que seja assíncrono, ele bloqueará a fila de tarefas até que a execução seja concluída e a próxima tarefa não será executada. Isso permite otimizar a suavidade da animação conforme necessário.

3. Rerenderizar

Em primeiro lugar, no RN e no React, quando setState é acionado no componente pai, valores não modificados em qualquer estado também farão com que todos os componentes filhos sejam renderizados novamente ou quando os adereços forem passados ​​pelo componente pai para o componente filho mudam,independentemente de os adereços serem utilizados pelo componente filho.Quando utilizados,os subcomponentes também serão re-renderizados.
Então, para o problema de re-renderização, use PureComponent e shouldComponentUpdate para otimizar funções comuns; use otimização de memorando para componentes de gancho;
após a verificação, a melhoria geral é alcançada, a interação é mais suave e os indicadores básicos de desempenho são alcançados. Agora o foco principal é saber se os problemas probabilísticos se repetem. Conte com a ajuda de outros testadores.

6. Problemas de verificação (aplicação de plataforma de monitoramento de desempenho)

Em primeiro lugar, por que deveríamos usar uma plataforma de monitoramento de desempenho: 1. Processar informações duplicadas para evitar o processamento repetido de alguns problemas em vários APPs, ou processamento repetido em um APP; 2. Capturar continuamente informações importantes e suspeitas, melhorar a eficiência e reduzir custos trabalhistas.
Em segundo lugar, quando e em quais cenários a plataforma de monitoramento de desempenho deve ser usada: Além da necessidade de usar a plataforma de monitoramento de desempenho para testes, operação e manutenção, os desenvolvedores também devem aprender a usar a plataforma de monitoramento de desempenho para auxiliar na localização e solução de problemas . Aqui estão duas soluções recomendadas:

1.Google Android Vitals + Firebase

Android vitals é um programa lançado pelo Google para melhorar a estabilidade e o desempenho dos dispositivos Android. O console Android vitals do Google Play pode destacar indicadores como taxa de falhas, taxa de incidência de ANR, muitos despertares e bloqueio de bloqueio. Ele contém funções comumente usadas por desenvolvedores, o segredo é que ele não invade o código e é mais conveniente de aplicar.
Além disso, o Firebase também pode obter dados detalhados de relatórios de falhas personalizados para entender as falhas que ocorrem no aplicativo. Os grupos de ferramentas colidem com rastreamentos de pilha semelhantes e os classificam com base na gravidade de seu impacto nos usuários. Além de receber relatórios gerados automaticamente, você também pode aprender sobre ações que causam falhas no aplicativo registrando eventos personalizados.
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Gráfico de comparação de funções Vitals + Firebase (site oficial da fonte da imagem)

Portanto, em circunstâncias normais, o Android Vitals pode ser usado para lidar com a maioria dos problemas simples e pode ser usado com o Firebase para lidar com eventos personalizados de maneira flexível.
O que é menos conveniente são as restrições domésticas do Google, que exigem que as empresas solicitem linhas dedicadas para redes transfronteiriças, e quando a rede flutua, muitas vezes é necessária a verificação de identidade (o que é bastante irritante).
Custo: o uso do Android Vitals é gratuito, mas você precisa de 25$ para registrar uma conta de desenvolvedor; o Firebase tem uma versão gratuita e uma versão paga. É adequado para pesquisa e desenvolvimento por empresas estrangeiras, empresas multinacionais ou empresas com qualificações relevantes.

2. Umeng + U-APM

2.1 Visão Geral do Produto:

Devido às restrições domésticas do Google, muitas empresas não podem se conectar à rede externa sem registro na rede, portanto o U-APM do Umeng+ também pode
atender perfeitamente às necessidades acima. Para o meu projeto, optei por me conectar ao Umeng+SDK para auxiliar na detecção de problemas.
O impulso e as estatísticas de Umeng são relativamente bons na indústria, e amigos que estão mais familiarizados com Umeng devem conhecer a função de estabilidade do U-APP, então U-APM é Umeng + baseado na função de estabilidade do U-APP. Um produto de dados de estabilidade atualizado para os desenvolvedores monitorarem os aplicativos.

Insira a descrição da imagem aqui

Por que escolher Umeng+ U-APM Plataforma
de monitoramento de desempenho de aplicativos:
Este produto não apenas cria uma plataforma sistemática de monitoramento de qualidade on-line, descobrindo problemas on-line, localizando rapidamente problemas e resolvendo-os com eficiência. Ele também suporta monitoramento em tempo real de tendências de falhas de aplicativos on-line, monitoramento 7x24 horas de alarmes e verificação de reparos, reprodução de locais de falhas de usuários, monitoramento focado de links importantes e testes de reparo.

O ponto principal também é que, com o apoio da tecnologia Alibaba, ela pode fornecer iterações de produtos estáveis ​​e de longo prazo, serviços de projeto e recursos de consultoria especializada. Muito atencioso, o que a engenharia empresarial precisa é de estabilidade a longo prazo! Produtos de pequenas fábricas podem não ser encontrados por ninguém, mesmo depois de usados.

Insira a descrição da imagem aqui

2.2 Preparação para o desenvolvimento

Se você já usou o U-APP antes, pode verificar diretamente as instruções de atualização no site oficial e clicar para experimentar o U-APM; então, se você não usou os produtos Umeng, você precisa ir ao site oficial [ Umeng+] para
registre-se e adicione novos aplicativos para obter o AppKey.
Nota: Leia atentamente o Guia de Conformidade U-APM para atender aos requisitos de conformidade relevantes do Ministério da Indústria e Tecnologia da Informação. Evite a exclusão do APP devido a riscos de política de privacidade.

2.3 SDK integrado

Integração automática do Maven:
A integração automática do Maven é relativamente simples e rápida.
Primeiro, adicione o [Umeng+] sdk novo endereço do armazém maven nas seções buildscript e allprojects do script de configuração build.gradle do projeto. Como mostrado abaixo.

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Em seguida, adicione a dependência da biblioteca SDK na seção de dependências do script de configuração build.gradle correspondente ao projeto App. Não é muito simples?

dependencies {
    
      
    implementation fileTree(include:['*.jar'], dir:'libs')  
  
// 下面各SDK根据宿主App是否使用相关业务按需引入。  
    implementation  'com.umeng.umsdk:common:9.4.4'// 必选  
    implementation  'com.umeng.umsdk:asms:1.4.1'// 必选  
    implementation 'com.umeng.umsdk:apm:1.4.2' // 必选  
}  

Integração manual do Android Studio:
então eu uso a integração manual aqui
1. Primeiro selecione o componente U-APM SDK e faça o download, descompacte o arquivo .zip para obter o pacote de componentes correspondente
Insira a descrição da imagem aqui

Obtenha os seguintes arquivos:
Insira a descrição da imagem aqui

umeng-common-9.4.4.jar // SDK de estatísticas deve ser selecionado
umeng-asms-armeabi-v1.4.1.aar // Deve ser selecionado e umeng-apm-armeabi-v1.4.2.aar//U-
no diretório apm
SDK do APM necessário
Se você tiver requisitos UTDID, integre
o pacote suplementar utdid4all-1.5.2.1-proguard.jar do serviço UTDID em terceiros
. Se precisar do módulo ABTest, você pode integrar
o umeng-abtest-v1.0.0.aar Módulo ABTest em comum
2. Em Copie o pacote jar acima para o diretório libs do projeto do Android Studio.
Clique com o botão direito no projeto do Android Studio -> Selecione Abrir Configurações do Módulo -> Na caixa pop-up Estrutura do Projeto -> Selecione a guia Dependências -> Clique em "+" no canto inferior esquerdo -> Selecione o tipo de pacote de componente - > Apresente o pacote de componentes correspondente.

3Introduza o pacote de componentes correspondente no arquivo build.gradle do aplicativo. Exemplos de referência são os seguintes:

repositories{  
    flatDir{  
        dirs 'libs'  
}  
}  
dependencies {  
    implementation fileTree(include:['*.jar'], dir:'libs')  
    implementation (name:'umeng-asms-armeabi-v1.4.1', ext:'aar')   
    implementation (name:'umeng-apm-armeabi-v1.4.2', ext:'aar')  
}  

Nota: Se você precisar se adaptar a plataformas diferentes de armeabi, ou encontrar a arquitetura multi-CPU, portanto, problema de falha no carregamento da biblioteca [SA10070], além de apresentar o pacote correspondente, você também deve baixar e importar o arquivo .so correspondente separadamente.

2.4 Concessão de Permissão

Siga o tutorial do site oficial para conceder as seguintes permissões:
Insira a descrição da imagem aqui

<manifest ……>  
<uses-sdkandroid:minSdkVersion="8"></uses-sdk>  
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>  
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>  
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>  
<uses-permissionandroid:name="android.permission.INTERNET"/>  
<application ……>  
2.5 Configurações de ofuscação

Se a ofuscação de código for usada no APP, a seguinte configuração precisará ser adicionada

-keep class com.umeng.** { *; }  
  
-keep class com.uc.** { *; }  
  
-keep class com.efs.** { *; }  
  
-keepclassmembers class *{  
     public<init>(org.json.JSONObject);  
}  
-keepclassmembers enum *{  
      publicstatic**[] values();  
      publicstatic** valueOf(java.lang.String);  
}  
2.6 Inicializar SDK

Chame a função de inicialização fornecida pelo pacote de componentes básicos na função application.onCreate nativa do Android do rn:

/** 
* 注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,也需要在App代码中调 
* 用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值, 
* UMConfigure.init调用中appkey和channel参数请置为null)。 
*/  
UMConfigure.init(Context context,String appkey,String channel,int deviceType,String pushSecret);  

Ou chame esta função de pré-inicialização

public static void preInit(Context context,String appkey,String channel)  
然后打开日志开关
** 
*设置组件化的Log开关 
*参数: boolean 默认为false,如需查看LOG设置为true 
*/  
UMConfigure.setLogEnabled(true);  

Neste ponto, você pode usar a função de análise de atraso, Java, análise de falhas nativa, função de análise ANR e outras funções básicas. Porque seu princípio é usar o tempo de resposta do thread principal para relatar informações do dispositivo e logs travados que apresentam atrasos. Depois de aguardar o relatório do dispositivo, podemos ver o erro carregado (imprimir integração do SDK ou informações de erro de tempo de execução), Avisar (imprimir informações de aviso do SDK), Informações (imprimir informações de prompt do SDK), Depurar (imprimir informações de depuração do SDK) no console web. e relatórios.
Insira a descrição da imagem aqui

No entanto, é muito problemático visualizar diretamente a pilha de erros da mensagem. O U-APM usa o algoritmo de agregação para fornecer a função de módulos travados. Ele seleciona 200 pilhas que afetam um grande número de usuários e as agrega bidirecionalmente de cima para baixo. a parte inferior da pilha para exibir os 10 principais módulos com a maior frequência de ocorrência. , a profundidade da subárvore suporta até 50 camadas e você pode extrair informações detalhadas do módulo preso com a ajuda.
Insira a descrição da imagem aqui
Além disso, o U-APM também oferece funções avançadas, como análise de inicialização, análise de memória, análise de rede e módulos de inspeção detalhada do usuário. Além da análise de memória, outras funções precisam ser configuradas antes de serem utilizadas. Todos podem ir e experimentar.
No final, o problema foi verificado e resolvido com sucesso através do U-APM. Concluiu todo o ciclo fechado de P&D. Se estiver interessado, você pode experimentar o U-APM gratuitamente .

três. Resumo do projeto

1. Não olhe para o problema . Quer se trate de otimização de desempenho de aplicativos ou otimização de sistema. O aparecimento de um problema pode ser causado por efeitos secundários subjacentes. Por exemplo, se o fenômeno local neste projeto estiver estagnado e instável, se nos concentrarmos apenas no fenômeno, provavelmente cairemos em um dilema de otimização, otimizando a renderização, reduzindo o desenho da tela ou até mesmo agilizando os negócios. A descoberta final do nosso gargalo de desempenho foi alcançada através da modificação do método de implementação, que é mais adequado para cenários de negócios e pode utilizar melhor o desempenho da máquina. E tudo isso requer suporte de dados .
2. Deixe os dados falarem. Não confie em seus sentimentos para detectar problemas de desempenho e avaliar os efeitos da otimização de desempenho. Você deve ter critérios de avaliação de desempenho de renderização quantificáveis, bem como ferramentas de otimização visuais e quantificáveis . Usar a experiência para sentir e adivinhar não é permanente para a equipe, mas dados e ferramentas podem ser repassados. Por exemplo: Se não existirem padrões para otimizar o desempenho, não haverá dados que reflitam os resultados. Então, o trabalho geral perde o sentido e o sucesso ou fracasso é inteiramente determinado pelo tapa na testa do líder.
3. Use equipamentos de baixo custo : O mesmo programa exporá os mesmos problemas de forma mais óbvia em equipamentos de baixo custo. Por exemplo: No estágio inicial de desenvolvimento do Android, não havia atraso na máquina real, mas foi apenas na máquina industrial real que problemas como o atraso foram expostos. Sempre foi uma questão muito importante trazer uma boa experiência de usuário para dispositivos de última geração e de baixo custo.
4. Pese os prós e os contras : Otimize com base na premissa de que o produto pode ser estável e a demanda pode ser concluída no prazo. Se a relação insumo-produto for muito alta, outras soluções devem ser adotadas e não otimizar demais. Nunca se esqueça de que o objetivo da otimização do desempenho é melhorar a experiência do usuário e não exibir habilidades .
5. Abandonar custos irrecuperáveis : Para os custos que foram pagos em pesquisa e desenvolvimento e não são recuperáveis, não afetam decisões futuras. Por exemplo, para o módulo de reconhecimento facial que foi desenvolvido usando rastreamento, os dados comprovam que a seleção afeta o desempenho. A relação insumo-produto está dentro de uma faixa aceitável e, quanto mais cedo for substituída, maiores serão os retornos esperados.

Acho que você gosta

Origin blog.csdn.net/weixin_50077637/article/details/120965597
Recomendado
Clasificación