Как запустить Winscope

Трассировка Winscope – часть фреймворка Android. На этой странице описано, как скачать, собрать и запустить локально средство просмотра трассировки Winscope.

Как собрать Winscope локально

Чтобы настроить ПК для запуска трассировщика Winscope, выполните следующие действия:

  1. Скачайте исходный код Android.
  2. Перейдите в папку Winscope:

    cd development/tools/winscope
    
  3. Установите зависимости, используя:

    npm install
    

    Чтобы посмотреть список доступных команд, выполните следующую команду: npm run.

  4. Создайте все целевые объекты для рабочей и тестовой сред, используя:

    npm run build:prod
    
  5. Запустите Winscope, используя:

    npm run start
    

Создание отдельных частей

Отдельные части Winscope можно собрать с помощью следующих команд:

Команда Описание
build:trace_processor Проверяет и пересобирает последнюю версию
Perfetto trace_processor.
build:protos Перекомпилирует определения proto.

Запустить тесты

Winscope содержит модульные и сквозные тесты. Чтобы запустить их, используйте npm run <command>:

Команда Описание
test:unit:ci Запускает модульное тестирование в менее подробном формате для CI
или предварительной проверки.
test:unit:dev Запускает модульное тестирование в более подробном формате для
локальной разработки. В этом режиме отслеживаются изменения и
автоматически запускаются нужные тесты.
test:e2e Запускает сквозные тесты, например для протокола
межплатформенного взаимодействия.
test:presubmit:quiet Создает все модульные тесты, линтеры и анализ графов
в менее подробном формате для непрерывной интеграции или хука
предварительной отправки.
test:presubmit Создает все модульные тесты, линтеры и анализ графов
в более подробном формате для локальной
разработки.
test:all Запускает все тесты (модульные и сквозные), линтеры и
анализ графа в более подробном формате для локальной
разработки.

Сквозные тесты

Перед проведением сквозных тестов необходимо запустить удаленный инструмент и установить правильную версию драйвера Chrome. В приведенном ниже фрагменте кода команда run test:e2e автоматически устанавливает драйвер Chrome.

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

В таблице ниже перечислены необходимые команды и их описания. Чтобы запустить их, используйте npm run command:

Команда Описание
start:remote_tool_mock Запускает имитацию удаленного инструмента для тестирования протокола взаимодействия между инструментами.
install:chromedriver Устанавливает драйвер Chrome, необходимый для сквозного тестирования.

Как обновить сопоставление @IntDef

@IntDef – это аннотация, используемая в Android для ограничения возможных значений целого числа. Winscope использует сопоставление этих аннотаций, чтобы показывать название значения вместо целого числа.

Если в фреймворк Android добавляются новые значения @IntDef, но они не обновляются в Winscope, то они отображаются как необработанные целочисленные значения, а не как описательные строки. Чтобы устранить проблему, обновите файл сопоставления IntDef (development/tools/winscope/src/common/intDefMapping.json).

Чтобы автоматически обновить сопоставление @IntDef, выполните следующие действия:

  1. Запустите скрипт update_intdef_mappings.sh из каталога development/tools/winscope/scripts/ в локальном дереве Android. Этот скрипт запускает процесс аннотирования, который извлекает последние значения @IntDef из кода и обновляет intDefMapping.json:

    cd development/tools/winscope
    ./scripts/update_intdef_mappings.sh
    
  2. Зафиксируйте изменения в src/common/intDefMapping.json с помощью команды git commit и загрузите их с помощью команды repo upload.

Если скрипт недоступен, выполните следующие действия, чтобы вручную обновить сопоставление @IntDef из корневого каталога Android ($ANDROID_BUILD_TOP):

  1. Создайте framework-minus-apex-intdefs для запуска препроцессора аннотаций:

    m framework-minus-apex-intdefs
    
  2. Скопируйте сгенерированный файл intDefMapping.json в репозиторий prebuilts:

    $ 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. Загрузите изменения в Winscope, используя repo upload.

Другие команды

Помимо сборки и тестирования, скрипты Winscope содержат другие возможности, как показано в таблице. Чтобы запустить их, используйте npm run command:

Команда Описание
format:check Проверяет наличие проблем с форматированием кода с помощью prettier.
format:fix Проверяет и автоматически исправляет проблемы с форматированием кода с помощью prettier.
eslint:check Проверяет код на наличие проблем с форматированием с помощью eslint.
eslint:fix Проверяет и автоматически исправляет проблемы с форматированием кода с помощью eslint.
tslint:check Проверяет наличие проблем с форматированием кода с помощью tslint.
tslint:fix Проверяет и автоматически исправляет проблемы с форматированием кода с помощью tslint.
deps_graph:check_cycles Анализирует код на наличие циклических зависимостей.

Устранение неполадок

Чтобы устранить неполадки, воспользуйтесь следующими советами:

  • Ошибка ProtocolError: missing required '<FIELD>' или TypeError: Cannot read property '<PROP>' of null

    • Это происходит, когда файл трассировки был создан с новым определением proto, содержащим новые обязательные поля.

      1. Убедитесь, что вы открываете трассировку в правильной версии Winscope (master, S или R).
      2. Если вы создаете новое поле в прототипе, перекомпилируйте прототипы в Winscope с помощью npm run build:protos.

  • Некоторые установленные версии зависимостей неверны (сборка не удалась)

    • Отменить изменения в файлах "package.json" и "package-lock.json". Удалить node_modules. Повторите команду npm install.
  • Я добавил новое поле в один из файлов proto. Как его посмотреть?

    • Winscope использует определения прототипов, которые были доступны на момент компиляции, поэтому новые поля по умолчанию не отображаются. Чтобы новые поля появились, пересоберите прототипы с помощью npm run build:protos.