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:
- Faça o download do código-fonte do Android.
Navegue até a pasta do Winscope:
cd development/tools/winscopeInstale as dependências usando:
npm installPara conferir uma lista de comandos disponíveis, execute:
npm runCrie todos os destinos de produção e teste usando:
npm run build:prodExecute 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:
Execute o script
update_intdef_mappings.shno diretóriodevelopment/tools/winscope/scripts/na árvore do Android local. Esse script aciona o processo de anotação que extrai os valores@IntDefmais recentes do código e atualizaintDefMapping.json:cd development/tools/winscope ./scripts/update_intdef_mappings.shConfirme as mudanças em
src/common/intDefMapping.jsonusando o comandogit commite faça o upload delas usando o comandorepo 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):
Crie
framework-minus-apex-intdefspara que o pré-processador de anotação seja executado:m framework-minus-apex-intdefsCopie o arquivo
intDefMapping.jsongerado 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.jsonFaç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>'ouTypeError: Cannot read property '<PROP>' of nullIsso ocorre quando o arquivo de rastreamento foi criado com uma nova definição de proto, contendo novos campos obrigatórios.
- Verifique se você está abrindo o rastreamento na versão correta do Winscope (principal, S ou R).
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.jsonepackage-lock.json. Removanode_modules. Executenpm installnovamente.
- Reverta as mudanças em
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.
- 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