Starting March 27, 2025, we recommend using android-latest-release instead of aosp-main to build and contribute to AOSP. For more information, see Changes to AOSP.
Stay organized with collections
Save and categorize content based on your preferences.
Winscope tracing is part of the Android framework. This page outlines the
steps required to download, build, and run the Winscope trace viewer locally.
Build Winscope locally
Follow these steps to set up your PC to run the Winscope tracer:
You can build individual parts of Winscope separately using the following
commands:
Command
Description
build:trace_processor
Checks out and rebuilds the latest version of
Perfetto's trace_processor.
build:protos
Recompiles the proto definitions.
Run tests
Winscope contains unit and end-to-end tests. To run them use npm run
<command>:
Command
Description
test:unit:ci
Runs the unit tests in a less verbose format for CI
or presubmit hook.
test:unit:dev
Runs the unit tests in a more verbose format for
local development. This mode watches for changes and
automatically reruns the correct tests.
test:e2e
Runs the end-to-end tests, such as those for the
cross-tool protocol.
test:presubmit:quiet
Builds all presubmit unit tests, linters, and graph
analysis in a less verbose format for CI or presubmit
hook.
test:presubmit
Builds all presubmit unit tests, linters, and graph
analysis in a more verbose format for local
development.
test:all
Runs all tests (unit and end-to-end), linters, and
graph analysis in a more verbose format for local
development.
Update @IntDef mapping
@IntDef is an annotation used in Android to restrict the possible values of an
integer. Winscope uses a mapping of these annotations to display the name of the
value instead of the integer.
To update the @IntDef mapping, do the following:
Build :framework-minus-apex-intdefs for the annotation preprocessor to run:
mp:framework-minus-apex-intdefs
Copy the generated intDefMapping.json file to the prebuilts repository:
In addition to build and tests, Winscope scripts contain other capabilities, as
shown in the table. To run them use npm run command:
Command
Description
format:check
Checks for code formatting issues using prettier.
format:fix
Checks and auto fixes code formatting issues using prettier.
eslint:check
Checks for code formatting issues using eslint.
eslint:fix
Checks and auto fixes code formatting issues using eslint.
tslint:check
Checks for code formatting issues using tslint.
tslint:fix
Checks and auto fixes code formatting issues using tslint.
deps_graph:check_cycles
Analyzes the code for cyclical dependencies.
Troubleshoot
Use the following tips for troubleshooting:
Error ProtocolError: missing required '<FIELD>' or TypeError: Cannot
read property '<PROP>' of null
This occurs when the trace file was created with a new proto definition,
containing new required fields.
Make sure you're opening the trace on the correct Winscope version
(master, S, or R).
If you create the new field on the proto, recompile the protos in
Winscope using npm run build:protos.
Some installed dependency versions are wrong (build fails)
Revert changes to package.json and package-lock.json. Remove
node_modules. Run npm install again.
I added a new field to one of the proto files. How do I display it?
Winscope uses the proto definitions from when it was compiled, so new
fields won't appear by default. To show new fields, rebuild the protos
using npm run build:protos.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-08-29 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 UTC."],[],[],null,["# Run Winscope\n\nWinscope tracing is part of the Android framework. This page outlines the\nsteps required to download, build, and run the Winscope trace viewer locally.\n\nBuild Winscope locally\n----------------------\n\nFollow these steps to set up your PC to run the Winscope tracer:\n\n1. [Download the Android source](/docs/setup/build/building).\n2. Navigate to the Winscope folder:\n\n cd development/tools/winscope\n\n3. Install dependencies using:\n\n npm install\n\n To see a list of available commands, run: `npm run`\n4. Build all prod and test targets using:\n\n npm run build:prod\n\n5. Run Winscope using:\n\n npm run start\n\n| **Note:** You can also download and build Winscope to host on a standard web server to get a shareable link to the tool.\n\nBuild separate parts\n--------------------\n\nYou can build individual parts of Winscope separately using the following\ncommands:\n\n| Command | Description |\n|-------------------------|-----------------------------------------------------------------------------|\n| `build:trace_processor` | Checks out and rebuilds the latest version of Perfetto's `trace_processor`. |\n| `build:protos` | Recompiles the proto definitions. |\n\nRun tests\n---------\n\n| **Tip:** Winscope doesn't build on Soong and can't be built by Tradefed, so it's recommended to have a local Git hook to the tests in your local environment.\n\nWinscope contains unit and end-to-end tests. To run them use `npm run\n\u003ccommand\u003e`:\n\n| Command | Description |\n|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|\n| `test:unit:ci` | Runs the unit tests in a less verbose format for CI or presubmit hook. |\n| `test:unit:dev` | Runs the unit tests in a more verbose format for local development. This mode watches for changes and automatically reruns the correct tests. |\n| `test:e2e` | Runs the end-to-end tests, such as those for the cross-tool protocol. |\n| `test:presubmit:quiet` | Builds all presubmit unit tests, linters, and graph analysis in a less verbose format for CI or presubmit hook. |\n| `test:presubmit` | Builds all presubmit unit tests, linters, and graph analysis in a more verbose format for local development. |\n| `test:all` | Runs all tests (unit and end-to-end), linters, and graph analysis in a more verbose format for local development. |\n\n### Update @IntDef mapping\n\n`@IntDef` is an annotation used in Android to restrict the possible values of an\ninteger. Winscope uses a mapping of these annotations to display the name of the\nvalue instead of the integer.\n\nTo update the `@IntDef` mapping, do the following:\n\n1. Build `:framework-minus-apex-intdefs` for the annotation preprocessor to run:\n\n mp :framework-minus-apex-intdefs\n\n2. Copy the generated `intDefMapping.json` file to the prebuilts repository:\n\n $ 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) \u003e ./development/tools/winscope/src/common/intDefMapping.json\n\n3. Upload the changes in Winscope using `repo upload`.\n\nOther commands\n--------------\n\nIn addition to build and tests, Winscope scripts contain other capabilities, as\nshown in the table. To run them use `npm run `\u003cvar translate=\"no\"\u003ecommand\u003c/var\u003e:\n\n| Command | Description |\n|---------------------------|----------------------------------------------------------------|\n| `format:check` | Checks for code formatting issues using `prettier`. |\n| `format:fix` | Checks and auto fixes code formatting issues using `prettier`. |\n| `eslint:check` | Checks for code formatting issues using `eslint`. |\n| `eslint:fix` | Checks and auto fixes code formatting issues using `eslint`. |\n| `tslint:check` | Checks for code formatting issues using `tslint`. |\n| `tslint:fix` | Checks and auto fixes code formatting issues using `tslint`. |\n| `deps_graph:check_cycles` | Analyzes the code for cyclical dependencies. |\n\nTroubleshoot\n------------\n\nUse the following tips for troubleshooting:\n\n- **Error `ProtocolError: missing required '\u003cFIELD\u003e'` or `TypeError: Cannot\n read property '\u003cPROP\u003e' of null`**\n\n - This occurs when the trace file was created with a new proto definition,\n containing new *required* fields.\n\n 1. Make sure you're opening the trace on the correct Winscope version (master, S, or R).\n 2. If you create the new field on the proto, recompile the protos in\n Winscope using `npm run build:protos`.\n\n | **Note:** You shouldn't need a new required field, because the protos should be backward compatible.\n- **Some installed dependency versions are wrong (build fails)**\n\n - Revert changes to `package.json` and `package-lock.json`. Remove `node_modules`. Run `npm install` again.\n- **I added a new field to one of the proto files. How do I display it?**\n\n - Winscope uses the proto definitions from when it was compiled, so new fields won't appear by default. To show new fields, rebuild the protos using `npm run build:protos`."]]