reis-mobile 0.3.6 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/README.md +175 -168
- package/THIRD_PARTY_NOTICES.md +224 -4
- package/agents/android-architect.md +89 -0
- package/agents/android-performance-engineer.md +92 -0
- package/agents/android-test-engineer.md +97 -0
- package/agents/flutter-test-engineer.md +2 -0
- package/agents/ios-architect.md +93 -0
- package/agents/ios-performance-engineer.md +92 -0
- package/agents/ios-test-engineer.md +95 -0
- package/agents/lead-mobile.md +10 -1
- package/agents/mobile-staff-engineer.md +1 -1
- package/agents/rn-architect.md +94 -0
- package/agents/rn-performance-engineer.md +92 -0
- package/agents/rn-test-engineer.md +98 -0
- package/bin/reis-mobile.mjs +59 -17
- package/commands/debate.md +10 -1
- package/commands/debug.md +60 -0
- package/commands/reis-mobile.md +7 -2
- package/core/config/project.mjs +59 -0
- package/core/registry/frontmatter.mjs +15 -4
- package/core/registry/registry.mjs +21 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +1 -1
- package/skills/android-adaptive/SKILL.md +304 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-agp-9-upgrade/SKILL.md +106 -0
- package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
- package/skills/android-appfunctions/SKILL.md +74 -0
- package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/android-appfunctions/references/context.md +26 -0
- package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
- package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/android-camerax/SKILL.md +135 -0
- package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
- package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
- package/skills/android-camerax/references/expert-blueprints.md +58 -0
- package/skills/android-camerax/references/foldables.md +83 -0
- package/skills/android-camerax/references/immutability.md +60 -0
- package/skills/android-camerax/references/low-light.md +124 -0
- package/skills/android-camerax/references/mlkit-spatial.md +75 -0
- package/skills/android-camerax/references/modern-apis.md +42 -0
- package/skills/android-camerax/references/testing.md +69 -0
- package/skills/android-camerax/references/thermals.md +85 -0
- package/skills/android-camerax/references/wear-os.md +76 -0
- package/skills/android-camerax/references/xr.md +54 -0
- package/skills/android-cli/SKILL.md +474 -0
- package/skills/android-cli/references/interact.md +113 -0
- package/skills/android-cli/references/journeys.md +120 -0
- package/skills/android-code-review/SKILL.md +58 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/android-edge-to-edge/SKILL.md +429 -0
- package/skills/android-engage-sdk-integration/SKILL.md +130 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
- package/skills/android-engage-sdk-integration/references/common.md +519 -0
- package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
- package/skills/android-engage-sdk-integration/references/requests.md +260 -0
- package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/android-gradle-build-debug/SKILL.md +71 -0
- package/skills/android-intent-security/SKILL.md +550 -0
- package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/android-media3-cast-integration/SKILL.md +236 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
- package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/android-navigation-3/SKILL.md +122 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/android-navigation-event/SKILL.md +312 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
- package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/android-play-policy-insights/SKILL.md +172 -0
- package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/android-play-policy-insights/resources/critic.md +86 -0
- package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/android-play-policy-insights/resources/policies.json +321 -0
- package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
- package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/android-profiler/SKILL.md +60 -0
- package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/android-profiler/references/env_setup.md +15 -0
- package/skills/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/android-r8-analyzer/SKILL.md +72 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/android-restore-credentials/SKILL.md +359 -0
- package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/android-styles/SKILL.md +229 -0
- package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/android-verified-email/SKILL.md +432 -0
- package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/android-wear-compose-m3/SKILL.md +365 -0
- package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
- package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
- package/skills/flutter-build-debug/SKILL.md +66 -0
- package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
- package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
- package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
- package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
- package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
- package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
- package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
- package/skills/{provider → flutter-provider}/SKILL.md +1 -1
- package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
- package/skills/ios-cocoapods-debug/SKILL.md +65 -0
- package/skills/ios-code-review/SKILL.md +56 -0
- package/skills/ios-xcode-build-debug/SKILL.md +66 -0
- package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
- package/skills/mobile-firebase/SKILL.md +54 -0
- package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
- package/skills/mobile-firebase/references/android/analytics.md +33 -0
- package/skills/mobile-firebase/references/android/app-check.md +36 -0
- package/skills/mobile-firebase/references/android/auth.md +44 -0
- package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
- package/skills/mobile-firebase/references/android/firestore.md +44 -0
- package/skills/mobile-firebase/references/android/functions.md +33 -0
- package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
- package/skills/mobile-firebase/references/android/messaging.md +41 -0
- package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
- package/skills/mobile-firebase/references/android/remote-config.md +43 -0
- package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
- package/skills/mobile-firebase/references/android/storage.md +39 -0
- package/skills/mobile-firebase/references/android.md +30 -0
- package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
- package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
- package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
- package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
- package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
- package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
- package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
- package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
- package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
- package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
- package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
- package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
- package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
- package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
- package/skills/mobile-firebase/references/flutter.md +36 -0
- package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
- package/skills/mobile-firebase/references/ios/analytics.md +33 -0
- package/skills/mobile-firebase/references/ios/app-check.md +36 -0
- package/skills/mobile-firebase/references/ios/auth.md +48 -0
- package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
- package/skills/mobile-firebase/references/ios/firestore.md +53 -0
- package/skills/mobile-firebase/references/ios/functions.md +35 -0
- package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
- package/skills/mobile-firebase/references/ios/messaging.md +45 -0
- package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
- package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
- package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
- package/skills/mobile-firebase/references/ios/storage.md +36 -0
- package/skills/mobile-firebase/references/ios.md +28 -0
- package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
- package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
- package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
- package/skills/mobile-firebase/references/react-native/auth.md +50 -0
- package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
- package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
- package/skills/mobile-firebase/references/react-native/functions.md +28 -0
- package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
- package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
- package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
- package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
- package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
- package/skills/mobile-firebase/references/react-native/storage.md +30 -0
- package/skills/mobile-firebase/references/react-native.md +29 -0
- package/skills/mobile-test/SKILL.md +63 -0
- package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
- package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
- package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
- package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
- package/skills/mobile-test/references/android.md +83 -0
- package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
- package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
- package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
- package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
- package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
- package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
- package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
- package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
- package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
- package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
- package/skills/mobile-test/references/flutter.md +44 -0
- package/skills/mobile-test/references/ios.md +79 -0
- package/skills/mobile-test/references/react-native.md +62 -0
- /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# CPU callstack sampling via traced_perf: periodic stack samples to find hot
|
|
2
|
+
# functions. Prefer the cpu_profile helper script for a standalone profile;
|
|
3
|
+
# use this config when combining with other data sources.
|
|
4
|
+
# Replace com.example.myapp with the app's package name, or drop the scope
|
|
5
|
+
# block to sample all processes.
|
|
6
|
+
buffers {
|
|
7
|
+
size_kb: 65536
|
|
8
|
+
fill_policy: RING_BUFFER
|
|
9
|
+
}
|
|
10
|
+
duration_ms: 10000
|
|
11
|
+
|
|
12
|
+
data_sources {
|
|
13
|
+
config {
|
|
14
|
+
name: "linux.perf"
|
|
15
|
+
perf_event_config {
|
|
16
|
+
timebase {
|
|
17
|
+
frequency: 100
|
|
18
|
+
}
|
|
19
|
+
callstack_sampling {
|
|
20
|
+
scope {
|
|
21
|
+
target_cmdline: "com.example.myapp"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
data_sources {
|
|
29
|
+
config {
|
|
30
|
+
name: "linux.process_stats"
|
|
31
|
+
process_stats_config {
|
|
32
|
+
scan_all_processes_on_start: true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Java heap dump (retention graph) of one app. Prefer the java_heap_dump
|
|
2
|
+
# helper script for a standalone dump; use this config when combining a heap
|
|
3
|
+
# dump with other data sources in one trace.
|
|
4
|
+
# Replace com.example.myapp with the app's package name.
|
|
5
|
+
buffers {
|
|
6
|
+
size_kb: 102400
|
|
7
|
+
}
|
|
8
|
+
duration_ms: 30000
|
|
9
|
+
|
|
10
|
+
data_sources {
|
|
11
|
+
config {
|
|
12
|
+
name: "android.java_hprof"
|
|
13
|
+
java_hprof_config {
|
|
14
|
+
process_cmdline: "com.example.myapp"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Heap dumps can be large; stream to the output file instead of relying on
|
|
20
|
+
# the in-memory buffer alone.
|
|
21
|
+
write_into_file: true
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Long / field trace: runs until stopped, keeps the most recent data in a
|
|
2
|
+
# ring buffer, and periodically flushes to the output file so the trace
|
|
3
|
+
# survives longer than RAM allows.
|
|
4
|
+
buffers {
|
|
5
|
+
size_kb: 65536
|
|
6
|
+
fill_policy: RING_BUFFER
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
# No duration_ms: stop manually (Ctrl-C on record_android_trace), or add one.
|
|
10
|
+
# Move data to the output file periodically instead of only at the end.
|
|
11
|
+
write_into_file: true
|
|
12
|
+
file_write_period_ms: 2500
|
|
13
|
+
# Commit app shared-memory buffers periodically so events stay ordered.
|
|
14
|
+
flush_period_ms: 30000
|
|
15
|
+
# Stop when the output file reaches this size (bytes).
|
|
16
|
+
max_file_size_bytes: 1000000000
|
|
17
|
+
|
|
18
|
+
data_sources {
|
|
19
|
+
config {
|
|
20
|
+
name: "linux.ftrace"
|
|
21
|
+
ftrace_config {
|
|
22
|
+
ftrace_events: "sched/sched_switch"
|
|
23
|
+
ftrace_events: "sched/sched_wakeup"
|
|
24
|
+
ftrace_events: "power/cpu_frequency"
|
|
25
|
+
ftrace_events: "power/cpu_idle"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
data_sources {
|
|
31
|
+
config {
|
|
32
|
+
name: "linux.process_stats"
|
|
33
|
+
process_stats_config {
|
|
34
|
+
scan_all_processes_on_start: true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# System and per-process memory over time: meminfo/vmstat counters polled
|
|
2
|
+
# periodically, per-process RSS via both polling and kernel rss_stat events,
|
|
3
|
+
# and low-memory-killer activity.
|
|
4
|
+
buffers {
|
|
5
|
+
size_kb: 32768
|
|
6
|
+
}
|
|
7
|
+
duration_ms: 30000
|
|
8
|
+
|
|
9
|
+
data_sources {
|
|
10
|
+
config {
|
|
11
|
+
name: "linux.sys_stats"
|
|
12
|
+
sys_stats_config {
|
|
13
|
+
meminfo_period_ms: 1000
|
|
14
|
+
meminfo_counters: MEMINFO_MEM_TOTAL
|
|
15
|
+
meminfo_counters: MEMINFO_MEM_FREE
|
|
16
|
+
meminfo_counters: MEMINFO_MEM_AVAILABLE
|
|
17
|
+
meminfo_counters: MEMINFO_SWAP_FREE
|
|
18
|
+
vmstat_period_ms: 1000
|
|
19
|
+
vmstat_counters: VMSTAT_NR_FREE_PAGES
|
|
20
|
+
vmstat_counters: VMSTAT_PGFAULT
|
|
21
|
+
vmstat_counters: VMSTAT_PGMAJFAULT
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
data_sources {
|
|
27
|
+
config {
|
|
28
|
+
name: "linux.process_stats"
|
|
29
|
+
process_stats_config {
|
|
30
|
+
proc_stats_poll_ms: 10000
|
|
31
|
+
scan_all_processes_on_start: true
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
data_sources {
|
|
37
|
+
config {
|
|
38
|
+
name: "linux.ftrace"
|
|
39
|
+
ftrace_config {
|
|
40
|
+
ftrace_events: "kmem/rss_stat"
|
|
41
|
+
ftrace_events: "lowmemorykiller/lowmemory_kill"
|
|
42
|
+
ftrace_events: "oom/oom_score_adj_update"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Native (C/C++) heap profiling via heapprofd: sampled malloc/free callstacks
|
|
2
|
+
# for one app. Prefer the heap_profile helper script for a standalone profile;
|
|
3
|
+
# use this config when combining with other data sources.
|
|
4
|
+
# Replace com.example.myapp with the app's package name.
|
|
5
|
+
buffers {
|
|
6
|
+
size_kb: 65536
|
|
7
|
+
}
|
|
8
|
+
duration_ms: 30000
|
|
9
|
+
|
|
10
|
+
data_sources {
|
|
11
|
+
config {
|
|
12
|
+
name: "android.heapprofd"
|
|
13
|
+
heapprofd_config {
|
|
14
|
+
sampling_interval_bytes: 4096
|
|
15
|
+
process_cmdline: "com.example.myapp"
|
|
16
|
+
# To profile ART/JNI and custom allocators too, add: all_heaps: true
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
write_into_file: true
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# CPU scheduling: who ran when, on which core, at what clock speed.
|
|
2
|
+
# The base layer for almost any performance investigation.
|
|
3
|
+
buffers {
|
|
4
|
+
size_kb: 32768
|
|
5
|
+
fill_policy: RING_BUFFER
|
|
6
|
+
}
|
|
7
|
+
duration_ms: 10000
|
|
8
|
+
|
|
9
|
+
data_sources {
|
|
10
|
+
config {
|
|
11
|
+
name: "linux.ftrace"
|
|
12
|
+
ftrace_config {
|
|
13
|
+
ftrace_events: "sched/sched_switch"
|
|
14
|
+
ftrace_events: "sched/sched_wakeup"
|
|
15
|
+
ftrace_events: "sched/sched_waking"
|
|
16
|
+
ftrace_events: "sched/sched_process_exit"
|
|
17
|
+
ftrace_events: "sched/sched_process_free"
|
|
18
|
+
ftrace_events: "power/cpu_frequency"
|
|
19
|
+
ftrace_events: "power/cpu_idle"
|
|
20
|
+
ftrace_events: "power/suspend_resume"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Resolves thread/process ids in sched events to readable names.
|
|
26
|
+
data_sources {
|
|
27
|
+
config {
|
|
28
|
+
name: "linux.process_stats"
|
|
29
|
+
process_stats_config {
|
|
30
|
+
scan_all_processes_on_start: true
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Synthesizing Perfetto Trace Configs (Mix & Match)
|
|
2
|
+
|
|
3
|
+
Read this when you need a custom trace config - a mixture of data sources the
|
|
4
|
+
specialized helper scripts do not cover. Start from the exemplar configs in
|
|
5
|
+
`$SKILL_ROOT/recording/workflows/perfetto-trace-recording/references/example-configs/`,
|
|
6
|
+
then add, remove, or merge the pieces described below.
|
|
7
|
+
|
|
8
|
+
## Shape of a config
|
|
9
|
+
|
|
10
|
+
A config is a `TraceConfig` protobuf - authoritative schema:
|
|
11
|
+
<https://raw.githubusercontent.com/google/perfetto/main/protos/perfetto/config/trace_config.proto>
|
|
12
|
+
(per-source option messages live under `protos/perfetto/config/` in the same
|
|
13
|
+
repo, e.g. `.../ftrace/ftrace_config.proto`) - written in protobuf **text
|
|
14
|
+
format** (conventionally saved as `config.pftxt`):
|
|
15
|
+
|
|
16
|
+
```protobuf
|
|
17
|
+
buffers {
|
|
18
|
+
size_kb: 32768 # sizes are in KB, not bytes
|
|
19
|
+
fill_policy: RING_BUFFER # keep newest data; DISCARD keeps oldest
|
|
20
|
+
}
|
|
21
|
+
duration_ms: 10000 # omit to trace until stopped manually
|
|
22
|
+
|
|
23
|
+
data_sources {
|
|
24
|
+
config {
|
|
25
|
+
name: "linux.ftrace" # which producer to enable
|
|
26
|
+
ftrace_config { ... } # that producer's own options
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
# ...more data_sources blocks, one per source...
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Merging two configs = keep one `buffers` section and concatenate their
|
|
33
|
+
`data_sources` blocks. Each data source may appear at most once (the
|
|
34
|
+
`linux.ftrace` config especially: merge all `ftrace_events`,
|
|
35
|
+
`atrace_categories`, and `atrace_apps` entries into a single block).
|
|
36
|
+
|
|
37
|
+
## Exemplar configs
|
|
38
|
+
|
|
39
|
+
Location:
|
|
40
|
+
`$SKILL_ROOT/recording/workflows/perfetto-trace-recording/references/example-configs/`
|
|
41
|
+
|
|
42
|
+
| File | Use case |
|
|
43
|
+
| :--- | :--- |
|
|
44
|
+
| `sched_cpu.pftxt` | CPU scheduling + frequency/idle (base layer). |
|
|
45
|
+
| `app_jank.pftxt` | Slow UI / dropped frames: atrace + frame timeline. |
|
|
46
|
+
| `memory_counters.pftxt` | System + per-process memory, LMK activity. |
|
|
47
|
+
| `java_heap_dump.pftxt` | Java heap retention graph for one app. |
|
|
48
|
+
| `native_heap.pftxt` | Sampled native malloc/free callstacks (heapprofd). |
|
|
49
|
+
| `cpu_profile.pftxt` | Periodic CPU callstack samples (traced_perf). |
|
|
50
|
+
| `long_background.pftxt` | Long/field traces: ring buffer + periodic writes. |
|
|
51
|
+
|
|
52
|
+
For a standalone heap dump, native heap profile, or CPU profile, prefer the
|
|
53
|
+
dedicated helper scripts in:
|
|
54
|
+
`$SKILL_ROOT/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md`.
|
|
55
|
+
Use exemplars when one trace must combine several sources.
|
|
56
|
+
|
|
57
|
+
## Data sources at a glance
|
|
58
|
+
|
|
59
|
+
| `name` | What it records | Key options |
|
|
60
|
+
| :--- | :--- | :--- |
|
|
61
|
+
| `linux.ftrace` | Kernel events and atrace | `ftrace_events`, `atrace_categories`, `atrace_apps` |
|
|
62
|
+
| `linux.process_stats` | Process/thread names & stats | `scan_all_processes_on_start`, `proc_stats_poll_ms` |
|
|
63
|
+
| `linux.sys_stats` | Periodic `/proc` counters | `meminfo_period_ms`, `vmstat_period_ms`, `stat_period_ms` |
|
|
64
|
+
| `android.log` | Logcat | `android_log_config { log_ids: ... }` |
|
|
65
|
+
| `android.surfaceflinger.frametimeline` | Frame timelines (jank) | None needed |
|
|
66
|
+
| `android.java_hprof` | Java heap dump | `java_hprof_config { process_cmdline: ... }` |
|
|
67
|
+
| `android.heapprofd` | Native heap profiling | `heapprofd_config { sampling_interval_bytes, ... }` |
|
|
68
|
+
| `linux.perf` | CPU callstack sampling | `perf_event_config { timebase, callstack_sampling }` |
|
|
69
|
+
| `android.packages_list` | Package mapping | None needed |
|
|
70
|
+
| `android.power` | Battery counters | `android_power_config { battery_poll_ms, ... }` |
|
|
71
|
+
| `track_event` | Custom app trace events | `track_event_config { enabled_categories }` |
|
|
72
|
+
|
|
73
|
+
The full, authoritative field list for every data source is the generated
|
|
74
|
+
[TraceConfig reference](https://perfetto.dev/docs/reference/trace-config-proto);
|
|
75
|
+
per-source guides live under
|
|
76
|
+
[perfetto.dev/docs/data-sources](https://perfetto.dev/docs/data-sources/).
|
|
77
|
+
|
|
78
|
+
## Top-level knobs
|
|
79
|
+
|
|
80
|
+
- `duration_ms` - trace length. Omit it to trace until the recording command
|
|
81
|
+
is stopped (Ctrl-C on `record_android_trace`).
|
|
82
|
+
- `buffers.fill_policy` - `RING_BUFFER` keeps newest data (right choice when
|
|
83
|
+
the interesting moment is at the end); `DISCARD` keeps the oldest.
|
|
84
|
+
- Long traces: `write_into_file: true` + `file_write_period_ms` stream buffer
|
|
85
|
+
to disk periodically so the trace can exceed RAM; `flush_period_ms: 30000`
|
|
86
|
+
keeps app-emitted events ordered; `max_file_size_bytes` bounds output.
|
|
87
|
+
- Buffer sizing rule of thumb: 32–64 MB (`size_kb: 32768`–`65536`) is plenty
|
|
88
|
+
for most 10–30s traces; heap dumps need ~100 MB or `write_into_file`.
|
|
89
|
+
|
|
90
|
+
## Pitfalls
|
|
91
|
+
|
|
92
|
+
- All buffer sizes are **KB** (`size_kb: 32768` = 32 MB); durations are
|
|
93
|
+
**ms**.
|
|
94
|
+
- atrace data (categories and app events) only flows through the
|
|
95
|
+
`linux.ftrace` data source - there is no separate "atrace" source, and an
|
|
96
|
+
app's custom trace events appear only if its package is listed in
|
|
97
|
+
`atrace_apps` (or `atrace_apps: "*"`).
|
|
98
|
+
- Field-name typos are only caught when the config is parsed at record time:
|
|
99
|
+
`record_android_trace -c config.pftxt` fails fast with a parse error naming
|
|
100
|
+
the bad field, so treat that as your validator, fix, and retry.
|
|
101
|
+
- Text-format enum values are bare identifiers (`fill_policy: RING_BUFFER`),
|
|
102
|
+
and strings are quoted.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Environment setup
|
|
2
|
+
|
|
3
|
+
## Set `$SKILL_ROOT`
|
|
4
|
+
|
|
5
|
+
Set up `$SKILL_ROOT` once per session.
|
|
6
|
+
|
|
7
|
+
Every file this skill references - workflow markdown, reference docs, helper
|
|
8
|
+
scripts, and downloaded dependencies - is written in the form `$SKILL_ROOT/...`,
|
|
9
|
+
relative to the **skill root** (the directory holding this skill's `SKILL.md`).
|
|
10
|
+
Set it once to the absolute path of the directory you loaded `SKILL.md` from:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
# Substitute with the directory the SKILL.md lives in.
|
|
14
|
+
export SKILL_ROOT="/absolute/path/to/skills/profilers/android-profiler"
|
|
15
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Getting `trace_processor` working
|
|
2
|
+
|
|
3
|
+
> **Prerequisite:** Ensure `$SKILL_ROOT` is initialized per
|
|
4
|
+
> `$SKILL_ROOT/references/env_setup.md`.
|
|
5
|
+
|
|
6
|
+
## Put `trace_processor` on the `PATH`
|
|
7
|
+
|
|
8
|
+
If the workspace does not already have a pre-downloaded `trace_processor`
|
|
9
|
+
wrapper, download it from <https://get.perfetto.dev/trace_processor> to
|
|
10
|
+
`$SKILL_ROOT/bin/trace_processor` and make it invocable for this session:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
chmod +x "$SKILL_ROOT/bin/trace_processor" # ensure exec bit is set
|
|
14
|
+
export PATH="$SKILL_ROOT/bin:$PATH"
|
|
15
|
+
trace_processor --version # smoke test (ensure > v57.0, e.g. v57.1+)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
After this, every bare `trace_processor ...` command in this skill works
|
|
19
|
+
verbatim. On Windows, skip the `PATH` setup and invoke it as
|
|
20
|
+
`python "$SKILL_ROOT/bin/trace_processor" ...` instead.
|
|
21
|
+
|
|
22
|
+
Notes:
|
|
23
|
+
|
|
24
|
+
- The first invocation downloads the prebuilt native binary (picking the
|
|
25
|
+
right one for the host platform) into `~/.local/share/perfetto/prebuilts/`
|
|
26
|
+
and caches it; only the first call pays the download cost.
|
|
27
|
+
- If the user's environment has its own mandatory `trace_processor`
|
|
28
|
+
(Google-internal, OEM build environments, CI images), prefer that
|
|
29
|
+
team-specific setup instead.
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# Querying Perfetto traces
|
|
2
|
+
|
|
3
|
+
This reference explains how to extract data from a Perfetto trace file
|
|
4
|
+
(`.pftrace`, `.perfetto-trace`, `.pb`) using `trace_processor` and
|
|
5
|
+
PerfettoSQL. Read it for ad-hoc querying outside a guided workflow; the
|
|
6
|
+
workflows under `$SKILL_ROOT/analysis/workflows` and
|
|
7
|
+
`$SKILL_ROOT/recording/workflows` carry their own queries.
|
|
8
|
+
|
|
9
|
+
The `trace_processor` binary is what every other Perfetto analysis tool
|
|
10
|
+
runs on top of, including the Perfetto UI. Reference docs:
|
|
11
|
+
<https://perfetto.dev/docs/analysis/trace-processor>.
|
|
12
|
+
|
|
13
|
+
> **Prerequisite - `trace_processor` must be invokable.** Before
|
|
14
|
+
> running any of the shell commands below, read
|
|
15
|
+
> `$SKILL_ROOT/references/perfetto/setup.md`. It defines how to make
|
|
16
|
+
> the bare `trace_processor` commands below work in this environment.
|
|
17
|
+
|
|
18
|
+
## Querying a trace: sessions
|
|
19
|
+
|
|
20
|
+
Querying goes through a **session**: load the trace once into a named
|
|
21
|
+
background session, then run every query against it with `--remote`.
|
|
22
|
+
Parsing a trace is the expensive part (tens of seconds for a multi-GB
|
|
23
|
+
trace); the session pays it once, and every real analysis runs more than
|
|
24
|
+
one query.
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
# 1. Load the trace into a background session - once per trace.
|
|
28
|
+
# Pick a descriptive session name (e.g. derived from the trace file).
|
|
29
|
+
trace_processor server unix --name mysession --daemonize TRACE_FILE
|
|
30
|
+
|
|
31
|
+
# 2. Run queries against the warm session: instant, no reparse.
|
|
32
|
+
trace_processor query --remote mysession \
|
|
33
|
+
"SELECT ts, dur, name FROM slice WHERE dur > 5e8 LIMIT 5"
|
|
34
|
+
|
|
35
|
+
# 3. When you are completely done with the trace:
|
|
36
|
+
trace_processor server kill mysession
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Multiple statements separated by `;` are supported in one invocation.
|
|
40
|
+
|
|
41
|
+
Session rules:
|
|
42
|
+
|
|
43
|
+
- Session names are managed by trace_processor in a per-user session
|
|
44
|
+
directory - there are no ports to choose and no collisions with other
|
|
45
|
+
agents or the Perfetto UI.
|
|
46
|
+
- **Session state persists across `query --remote` calls.** A
|
|
47
|
+
`CREATE PERFETTO TABLE` or `INCLUDE PERFETTO MODULE` run in one call is
|
|
48
|
+
visible in the next, so materializing intermediate results pays off
|
|
49
|
+
across invocations.
|
|
50
|
+
- Flags that configure trace loading (`--full-sort`, `--add-sql-package`, ...)
|
|
51
|
+
belong on the `server unix` invocation, not on `query --remote` - the client
|
|
52
|
+
rejects them with an explanatory error.
|
|
53
|
+
- `--remote` also accepts an absolute `*.sock` path or `host:port`;
|
|
54
|
+
names are the common case.
|
|
55
|
+
- Forgotten sessions are reaped automatically after 30 minutes idle
|
|
56
|
+
(`--idle-timeout`), but kill your session when the analysis is done.
|
|
57
|
+
|
|
58
|
+
`TRACE_FILE` can be a local path, an `http(s)://` URL, or a Perfetto UI
|
|
59
|
+
share link (`https://ui.perfetto.dev/#!/?s=<hash>`) - in the last two
|
|
60
|
+
cases trace_processor downloads the trace for you (cached under
|
|
61
|
+
`~/.cache/perfetto/` or the platform equivalent), resolving the share
|
|
62
|
+
link to its underlying trace first.
|
|
63
|
+
|
|
64
|
+
For a single throwaway query on a small trace you _can_ skip the session
|
|
65
|
+
(`trace_processor query TRACE_FILE "..."` parses, queries, and exits),
|
|
66
|
+
but treat that as the exception: it re-parses the trace on every
|
|
67
|
+
invocation and forgets created tables and included modules between
|
|
68
|
+
calls. Default to a session.
|
|
69
|
+
|
|
70
|
+
## Discovering what's in the trace
|
|
71
|
+
|
|
72
|
+
PerfettoSQL ships with **intrinsic table-functions** for browsing the
|
|
73
|
+
loaded standard library - modules, tables/views, functions, macros. Use
|
|
74
|
+
these to find what's available and to verify if a Standard Library module
|
|
75
|
+
already provides the needed abstraction before drafting custom logic.
|
|
76
|
+
|
|
77
|
+
**Mandatory Schema Check:** Do not guess column names or join keys. Always
|
|
78
|
+
use a plain `LIMIT 0` query to read the exact column schema of any specific
|
|
79
|
+
table, view, or query result before drafting your query.
|
|
80
|
+
|
|
81
|
+
> **Intrinsic surface - not stable API.** The `__intrinsic_*` names below
|
|
82
|
+
> are an implementation detail of trace processor. They're fair game for
|
|
83
|
+
> an agent to use during a session because this reference is loaded, but
|
|
84
|
+
> **don't bake `__intrinsic_*` names into committed scripts, dashboards,
|
|
85
|
+
> or stdlib modules** - they can change without notice.
|
|
86
|
+
|
|
87
|
+
```sql
|
|
88
|
+
-- 1. List every stdlib module currently available.
|
|
89
|
+
SELECT package, module FROM __intrinsic_stdlib_modules ORDER BY 1, 2;
|
|
90
|
+
|
|
91
|
+
-- 2. List the tables/views a specific module exposes
|
|
92
|
+
-- (after INCLUDE PERFETTO MODULE).
|
|
93
|
+
INCLUDE PERFETTO MODULE slices.with_context;
|
|
94
|
+
SELECT name, type, exposed, description
|
|
95
|
+
FROM __intrinsic_stdlib_tables('slices.with_context');
|
|
96
|
+
|
|
97
|
+
-- 3. List functions / macros a module exposes.
|
|
98
|
+
SELECT name, return_type, args
|
|
99
|
+
FROM __intrinsic_stdlib_functions('slices.with_context');
|
|
100
|
+
SELECT name, return_type, args
|
|
101
|
+
FROM __intrinsic_stdlib_macros('android.memory.heap_graph.helpers');
|
|
102
|
+
|
|
103
|
+
-- 4. Read the column schema of any table, view, or query.
|
|
104
|
+
-- LIMIT 0 returns the result header with no row scan; trace_processor
|
|
105
|
+
-- prints "column N = <name>" lines for each column.
|
|
106
|
+
SELECT * FROM slice LIMIT 0;
|
|
107
|
+
SELECT * FROM thread_or_process_slice LIMIT 0;
|
|
108
|
+
SELECT * FROM (SELECT ts, dur, name FROM slice WHERE dur > 0) LIMIT 0;
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Useful starting points for any trace:
|
|
112
|
+
|
|
113
|
+
| View | What's in it |
|
|
114
|
+
| :------------- | :--------------------------------------------------------------- |
|
|
115
|
+
| `slice` | Atrace slices, async slices, anything with a duration on a track |
|
|
116
|
+
| `thread` | One row per thread |
|
|
117
|
+
| `process` | One row per process |
|
|
118
|
+
| `thread_state` | State transitions (Running, Runnable, Sleeping, ...) |
|
|
119
|
+
| `sched_slice` | When threads were on-CPU |
|
|
120
|
+
| `counter` | Time-series counter samples |
|
|
121
|
+
| `track` | Every track in the trace; join on `track_id` to other tables |
|
|
122
|
+
|
|
123
|
+
Static reference for the public surface (does not require a running
|
|
124
|
+
trace_processor): <https://perfetto.dev/docs/analysis/sql-tables>.
|
|
125
|
+
|
|
126
|
+
## Using the standard library
|
|
127
|
+
|
|
128
|
+
Most useful queries are _much_ shorter when you build on stdlib modules
|
|
129
|
+
instead of joining raw tables yourself. Generated stdlib reference:
|
|
130
|
+
<https://perfetto.dev/docs/analysis/stdlib-docs>.
|
|
131
|
+
|
|
132
|
+
Include a module before referencing the views, tables or macros it
|
|
133
|
+
defines:
|
|
134
|
+
|
|
135
|
+
```sql
|
|
136
|
+
INCLUDE PERFETTO MODULE slices.with_context;
|
|
137
|
+
|
|
138
|
+
SELECT name, dur, thread_name, process_name
|
|
139
|
+
FROM thread_or_process_slice
|
|
140
|
+
WHERE dur > 1e9 -- slices longer than 1s
|
|
141
|
+
ORDER BY dur DESC
|
|
142
|
+
LIMIT 20;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
A few commonly used modules to know:
|
|
146
|
+
|
|
147
|
+
- `slices.with_context` - slice rows joined with their thread / process.
|
|
148
|
+
- `sched.with_context` - `sched_slice` joined with thread / process.
|
|
149
|
+
- `android.startup.startups` - one row per app startup.
|
|
150
|
+
- `stacks.cpu_profiling` - flat samples and call-graph helpers.
|
|
151
|
+
- `android.memory.heap_graph.dominator_tree` - retained-size analysis for
|
|
152
|
+
Java heap dumps.
|
|
153
|
+
|
|
154
|
+
The module name maps directly to the file path under the stdlib root:
|
|
155
|
+
`foo.bar` lives at `foo/bar.sql`. Browse the full list at the stdlib
|
|
156
|
+
reference linked above.
|
|
157
|
+
|
|
158
|
+
## Tips for writing good PerfettoSQL
|
|
159
|
+
|
|
160
|
+
- **Reach for stdlib first.** If you find yourself joining `slice` to
|
|
161
|
+
`thread_track` to `thread` to `process`, there is almost certainly a
|
|
162
|
+
stdlib module that already does it. Check the stdlib reference before
|
|
163
|
+
writing the join.
|
|
164
|
+
- **Filter on `dur > 0` and Trace Boundaries carefully.** Some slices have
|
|
165
|
+
`dur = -1` (still open at trace end) and some have `dur = 0` (instant
|
|
166
|
+
events). Be explicit about which you mean. When calculating a bounding box
|
|
167
|
+
(for example, `ts + dur`) or summing durations (`SUM(dur)`), handle
|
|
168
|
+
incomplete durations using: `IIF(dur = -1, trace_end() - ts, dur)`.
|
|
169
|
+
- **Robust State Transitions.** Avoid manual timestamp arithmetic (for
|
|
170
|
+
example, `ts + dur = next.ts`) to join adjacent events. Rely on standard
|
|
171
|
+
library modules (for example, `sched.runnable`, `linux.perf.counters`,
|
|
172
|
+
`intervals.overlap`) which safely handle trace gaps and preemptions.
|
|
173
|
+
- **Working with Identifiers:**
|
|
174
|
+
- **Use Unique Identifiers for Joins:** When writing SQL queries in
|
|
175
|
+
Perfetto, you must join tables using `utid` (unique thread ID) or `upid`
|
|
176
|
+
(unique process ID) instead of regular `tid` or `pid`. **Why it's
|
|
177
|
+
useful**: The operating system recycles `TIDs` and `PIDs`, while `UTIDs`
|
|
178
|
+
and `UPIDs` remain unique for the lifetime of the trace, which prevents
|
|
179
|
+
incorrect joins.
|
|
180
|
+
- Columns like `id`, `utid`, `upid`, `track_id` are not stable across traces
|
|
181
|
+
or even runs of trace_processor on the same trace. You can use them
|
|
182
|
+
**inside** a query as join keys, but alongside IDs, always join out to
|
|
183
|
+
a stable name (`thread.name`, `process.name`, `slice.name`) when reporting
|
|
184
|
+
results to the user.
|
|
185
|
+
- **Materialize expensive intermediate results.** `CREATE PERFETTO TABLE foo
|
|
186
|
+
AS SELECT ...` caches the result so subsequent queries don't redo the work.
|
|
187
|
+
- _Note for `SPAN_JOIN`:_ Intermediate tables fed into a `SPAN_JOIN` must
|
|
188
|
+
be materialized using `CREATE PERFETTO TABLE`, not `CREATE VIEW`.
|
|
189
|
+
- **Idempotency.** Ensure queries are idempotent to prevent "already exists"
|
|
190
|
+
errors during multiple executions.
|
|
191
|
+
- For Perfetto objects, always use `CREATE OR REPLACE`:
|
|
192
|
+
`CREATE OR REPLACE PERFETTO {TABLE|VIEW|MACRO|FUNCTION}`.
|
|
193
|
+
- For SQLite Virtual Tables (such as `SPAN_JOIN`), `CREATE OR REPLACE` is
|
|
194
|
+
not supported. Explicitly drop them first:
|
|
195
|
+
`DROP TABLE IF EXISTS my_table;`
|
|
196
|
+
`CREATE VIRTUAL TABLE my_table USING SPAN_JOIN(...);`
|
|
197
|
+
- For standard SQLite indexes, prepend `DROP INDEX IF EXISTS index_name;`.
|
|
198
|
+
- **`SPAN_JOIN` safety.** `SPAN_JOIN` will crash if intervals **within the
|
|
199
|
+
same input table** overlap. Always use the `PARTITIONED {column}` (for
|
|
200
|
+
example, `PARTITIONED track_id`) clause to isolate intervals.
|
|
201
|
+
- **Avoid `SELECT *` in saved queries.** Trace processor table schemas can
|
|
202
|
+
gain columns; pin the columns you actually use.
|
|
203
|
+
- **Use `EXPLAIN QUERY PLAN` if a query is slow.** It shows whether SQLite is
|
|
204
|
+
using indexes. Counter and slice tables have built-in indexes on `ts` and
|
|
205
|
+
`track_id`; queries that don't filter on either will scan the whole table.
|
|
206
|
+
- **Argument Extraction:** Use `EXTRACT_ARG(arg_set_id, 'key')` to fetch event
|
|
207
|
+
properties instead of manually joining the `args` table.
|
|
208
|
+
- **JSON Parsing:** When dealing with JSON text, use standard SQLite JSON
|
|
209
|
+
functions (for example, `json_extract()`) to extract values.
|
|
210
|
+
- **String Matching (Always use GLOB).** Use `GLOB` instead of `LIKE`. `LIKE`
|
|
211
|
+
causes performance bottlenecks and treats underscores (`_`) as wildcards,
|
|
212
|
+
leading to bugs.
|
|
213
|
+
- **Exact matches:** Use `=`.
|
|
214
|
+
- **Substring matches:** Use `GLOB` with `*` (for example,
|
|
215
|
+
`name GLOB '*RenderThread*'`).
|
|
216
|
+
- **Case-insensitive matches:** Use `LOWER(name) GLOB` and make sure the
|
|
217
|
+
search string is fully lowercase (for example,
|
|
218
|
+
`LOWER(name) GLOB '*renderthread*'`). Use this when dealing with
|
|
219
|
+
inconsistent trace capitalization (for example, `WakeLock` vs `wakelock`).
|
|
220
|
+
- **Alias Precision.** Always prefix column names with table or view alias,
|
|
221
|
+
that is: `{alias}.{column_name}`.
|
|
222
|
+
|
|
223
|
+
## Common Analysis Patterns
|
|
224
|
+
|
|
225
|
+
- **Calculating Time Overlaps & CPU Time:**
|
|
226
|
+
1. **Primary Method (MANDATORY):** Always search the standard library first
|
|
227
|
+
before writing custom interval logic. For example, to find the exact CPU
|
|
228
|
+
execution time of a slice, do not calculate it manually; instead, search
|
|
229
|
+
the docs and use the `slices.cpu_time` module.
|
|
230
|
+
2. **Fallback Method (Use ONLY if you have verified no stdlib module or
|
|
231
|
+
`SPAN_JOIN` applies):** If you must calculate custom overlap durations
|
|
232
|
+
between two different sets of time intervals `[start1, end1]` and
|
|
233
|
+
`[start2, end2]`:
|
|
234
|
+
- **Condition:** The intervals overlap if `start1 < end2` and
|
|
235
|
+
`start2 < end1`.
|
|
236
|
+
- **Duration:** The overlap duration is calculated as
|
|
237
|
+
`MIN(end1, end2) - MAX(start1, start2)`.
|
|
238
|
+
- **Important:** Incomplete Perfetto slices have a duration of -1
|
|
239
|
+
(`dur = -1`). Always calculate the effective end time using
|
|
240
|
+
`ts + IIF(dur = -1, trace_end() - ts, dur)` before applying this logic.
|
|
241
|
+
- Include the `android.startup.startups` module and query
|
|
242
|
+
`android_thread_slices_for_all_startups` (or `android_startups`) for
|
|
243
|
+
app startup requests.
|
|
244
|
+
- Join `counter_track` with `counter` to get values of counter with a
|
|
245
|
+
specific name.
|
|
246
|
+
- When querying for a CPU frequency counter, include the `linux.cpu.frequency`
|
|
247
|
+
module and use the `cpu_frequency_counters` table.
|
|
248
|
+
- **Window Size:** When looking for events around a specific timestamp, start
|
|
249
|
+
with 100ms as the window size.
|
|
250
|
+
- **Total Duration:** To calculate the total time spent in slices matching a
|
|
251
|
+
specific name pattern (for example, `*{name_pattern}*`), you must sum their
|
|
252
|
+
durations. **Why it's useful**: This helps quantify the total impact of a
|
|
253
|
+
specific function or feature on performance across multiple calls. Here is
|
|
254
|
+
an example query (note the safe handling of incomplete slices):
|
|
255
|
+
```sql
|
|
256
|
+
SELECT
|
|
257
|
+
count(*) as total_count,
|
|
258
|
+
sum(IIF(slice.dur = -1, trace_end() - slice.ts, slice.dur)) / 1e6
|
|
259
|
+
as total_dur_ms
|
|
260
|
+
FROM slice
|
|
261
|
+
WHERE slice.name GLOB '*{name_pattern}*';
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Analytical Workflow (Standard Operating Procedure)
|
|
265
|
+
|
|
266
|
+
To ensure accuracy and efficiency, follow these steps:
|
|
267
|
+
|
|
268
|
+
1. **Research & Dissection:** Identify the core question and required data
|
|
269
|
+
points.
|
|
270
|
+
2. **Mandatory Schema Validation:** Locate relevant modules via
|
|
271
|
+
`__intrinsic_stdlib_modules` and their tables via
|
|
272
|
+
`__intrinsic_stdlib_tables('module_name')`. Verify column names and types.
|
|
273
|
+
- **Intent Check:** You must verify if a stdlib module already provides
|
|
274
|
+
the needed abstraction before drafting manual arithmetic or custom joins.
|
|
275
|
+
|
|
276
|
+
- **IMPORTANT:** If your query requires calculating overlaps, intersections,
|
|
277
|
+
or boundaries between intervals, you MUST search `__intrinsic_stdlib_modules`
|
|
278
|
+
globally (for example, `WHERE module GLOB '*overlap*'`) before writing
|
|
279
|
+
`MIN()/MAX()` or `IIF(dur = -1...)` logic.
|
|
280
|
+
|
|
281
|
+
3. **Draft & Validate Loop (Max 3 Iterations):**
|
|
282
|
+
|
|
283
|
+
- [ ] **Draft:** Use only verified schemas. Ensure `INCLUDE PERFETTO MODULE`
|
|
284
|
+
is present for non-prelude modules.
|
|
285
|
+
- [ ] **Verify Idempotency:** Use `CREATE OR REPLACE` or `DROP TABLE IF EXISTS`
|
|
286
|
+
for virtual tables.
|
|
287
|
+
- [ ] **Check Precision:** Are ALL columns prefixed with aliases (e.g.,
|
|
288
|
+
`s.name`)? Are you joining on `utid`/`upid`?
|
|
289
|
+
- [ ] **String Matching:** Did you use `GLOB` or `=` instead of `LIKE`?
|
|
290
|
+
- [ ] **Span Join Check:** If using `SPAN_JOIN`, are tables `PARTITIONED`
|
|
291
|
+
and materialized?
|
|
292
|
+
- [ ] **Execute:** Run against the session:
|
|
293
|
+
`trace_processor query --remote SESSION "QUERY"`.
|
|
294
|
+
|
|
295
|
+
**Execution Rules:**
|
|
296
|
+
|
|
297
|
+
- **File Usage:** If you must create a SQL file to execute queries (for
|
|
298
|
+
example, due to query length or escaping issues), you must create them
|
|
299
|
+
in the `/tmp/` directory.
|
|
300
|
+
- **Failure Resilience:** Debug and fix SQL syntax and logic errors when
|
|
301
|
+
query fails. Don't simplify the analytical intent to pass validation.
|
|
302
|
+
For example, if requested to calculate an overlap or intersection, you
|
|
303
|
+
must fix the intersection math. Don't substitute with disjoint queries
|
|
304
|
+
(for example, returning independent total durations) as a workaround.
|
|
305
|
+
|
|
306
|
+
4. **Cleanup & Finalize:**
|
|
307
|
+
|
|
308
|
+
- Explicitly return and state the final validated SQL and explain the
|
|
309
|
+
results to the user.
|
|
310
|
+
- **Save an analysis report.** Write a markdown file in the working
|
|
311
|
+
directory (default `perfetto_analysis_report.md`) containing: the
|
|
312
|
+
question investigated, the trace file(s) analyzed, the findings with
|
|
313
|
+
concrete numbers, the final validated queries (so the analysis can be
|
|
314
|
+
re-run), and open questions / next steps. Point the user at it in
|
|
315
|
+
your final message.
|
|
316
|
+
- Before finishing, delete any temporary SQL files created in `/tmp/`.
|
|
317
|
+
|
|
318
|
+
## Where to look for more
|
|
319
|
+
|
|
320
|
+
- Language tour:
|
|
321
|
+
<https://perfetto.dev/docs/analysis/perfetto-sql-getting-started>
|
|
322
|
+
- Trace processor reference:
|
|
323
|
+
<https://perfetto.dev/docs/analysis/trace-processor>
|
|
324
|
+
- Generated table reference:
|
|
325
|
+
<https://perfetto.dev/docs/analysis/sql-tables>
|
|
326
|
+
- Generated stdlib reference:
|
|
327
|
+
<https://perfetto.dev/docs/analysis/stdlib-docs>
|