Executar o Winscope

O rastreamento do Winscope faz parte do framework do Android. Esta página descreve as etapas necessárias para fazer o download, criar e executar o visualizador de rastreamento do Winscope localmente.

Criar o Winscope localmente

Siga estas etapas para configurar seu PC para executar o rastreador do Winscope:

  1. Faça o download do código-fonte do Android.
  2. Navegue até a pasta do Winscope:

    cd development/tools/winscope
    
  3. Instale as dependências usando:

    npm install
    

    Para conferir uma lista de comandos disponíveis, execute: npm run

  4. Crie todos os destinos de produção e teste usando:

    npm run build:prod
    
  5. Execute o Winscope usando:

    npm run start
    

Criar partes separadas

É possível criar partes individuais do Winscope separadamente usando os seguintes comandos:

Comando Descrição
build:trace_processor Faz o check-out e recria a versão mais recente do
Perfetto's trace_processor.
build:protos Recompila as definições de proto.

Executar testes

O Winscope contém testes de unidade e completos. Para executá-los, use npm run <command>:

Comando Descrição
test:unit:ci Executa os testes de unidade em um formato menos detalhado para CI
ou hook de pré-envio.
test:unit:dev Executa os testes de unidade em um formato mais detalhado para
desenvolvimento local. Esse modo monitora as mudanças e
executa novamente os testes corretos automaticamente.
test:e2e Executa os testes completos, como os do
protocolo de ferramentas cruzadas.
test:presubmit:quiet Cria todos os testes de unidade de pré-envio, linters e análise de gráficos em um formato menos detalhado para CI ou hook de pré-envio.

test:presubmit Cria todos os testes de unidade de pré-envio, linters e análise de gráficos em um formato mais detalhado para desenvolvimento local.

test:all Executa todos os testes (de unidade e completos), linters e
análise de gráficos em um formato mais detalhado para
desenvolvimento local.

Testes de ponta a ponta

Antes de executar testes completos, é necessário iniciar a ferramenta remota e instalar a versão correta do driver do Chrome. No snippet de código a seguir, o comando run test:e2e instala o driver do Chrome automaticamente.

$ npm run start
$ npm run start:remote_tool_mock
$ npm run test:e2e

A tabela a seguir lista os comandos necessários e as descrições deles. Para executar los, use npm run command:

Comando Descrição
start:remote_tool_mock Inicia a simulação da ferramenta remota para testar o protocolo de ferramentas cruzadas.
install:chromedriver Instala o driver do Chrome necessário para executar testes completos.

Atualizar o mapeamento @IntDef

@IntDef é uma anotação usada no Android para restringir os valores possíveis de um número inteiro. O Winscope usa um mapeamento dessas anotações para mostrar o nome do valor em vez do número inteiro.

Se novos valores @IntDef forem adicionados ao framework do Android, mas não forem atualizados no Winscope, eles serão mostrados como valores inteiros brutos em vez de strings descritivas. Para corrigir esse problema, atualize o arquivo de mapeamento IntDef (development/tools/winscope/src/common/intDefMapping.json).

Para atualizar o mapeamento @IntDef automaticamente, faça o seguinte:

  1. Execute o script update_intdef_mappings.sh no diretório development/tools/winscope/scripts/ na árvore do Android local. Esse script aciona o processo de anotação que extrai os valores @IntDef mais recentes do código e atualiza intDefMapping.json:

    cd development/tools/winscope
    ./scripts/update_intdef_mappings.sh
    
  2. Confirme as mudanças em src/common/intDefMapping.json usando o comando git commit e faça o upload delas usando o comando repo upload.

Se o script não estiver disponível, siga estas etapas para atualizar o mapeamento @IntDef manualmente no diretório raiz do Android ($ANDROID_BUILD_TOP):

  1. Crie framework-minus-apex-intdefs para que o pré-processador de anotação seja executado:

    m framework-minus-apex-intdefs
    
  2. Copie o arquivo intDefMapping.json gerado para o repositório de pré-compilações:

    $ python3 -c 'import sys,json,collections; print(json.dumps(collections.OrderedDict(sorted(collections.ChainMap(*map(lambda x:json.load(open(x)), sys.argv[1:])).items())), indent=2))' $(find out/soong/.intermediates/frameworks/base -iname intDefMapping.json) > ./development/tools/winscope/src/common/intDefMapping.json
    
  3. Faça o upload das mudanças no Winscope usando repo upload.

Outros comandos

Além da criação e dos testes, os scripts do Winscope contêm outros recursos, conforme mostrado na tabela. Para executá-los, use npm run command:

Comando Descrição
format:check Verifica problemas de formatação de código usando prettier.
format:fix Verifica e corrige automaticamente problemas de formatação de código usando prettier.
eslint:check Verifica problemas de formatação de código usando eslint.
eslint:fix Verifica e corrige automaticamente problemas de formatação de código usando eslint.
tslint:check Verifica problemas de formatação de código usando tslint.
tslint:fix Verifica e corrige automaticamente problemas de formatação de código usando tslint.
deps_graph:check_cycles Analisa o código em busca de dependências cíclicas.

Resolver problemas

Use as dicas a seguir para resolver problemas:

  • Erro ProtocolError: missing required '<FIELD>' ou TypeError: Cannot read property '<PROP>' of null

    • Isso ocorre quando o arquivo de rastreamento foi criado com uma nova definição de proto, contendo novos campos obrigatórios.

      1. Verifique se você está abrindo o rastreamento na versão correta do Winscope (principal, S ou R).
      2. Se você criar o novo campo no proto, recompilá-lo no Winscope usando npm run build:protos.

  • Algumas versões de dependência instaladas estão incorretas (a criação falha)

    • Reverta as mudanças em package.json e package-lock.json. Remova node_modules. Execute npm install novamente.
  • Adicionei um novo campo a um dos arquivos proto. Como faço para mostrá-lo?

    • O Winscope usa as definições de proto de quando foi compilado. Portanto, novos campos não aparecem por padrão. Para mostrar novos campos, recrie os protos usando npm run build:protos.