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,243 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# Copyright 2026 The Android Open Source Project
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
"""Small logic-less template engine for Markdown generation."""
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
|
|
21
|
+
# Precompiled regex patterns at module scope for linear-time optimizations
|
|
22
|
+
TAG_PATTERN = re.compile(r"\{\{(#|/)?(IF_ANY|IF_ALL|IF|EACH)?\s*(.*?)\}\}")
|
|
23
|
+
NEWLINE_COLLAPSE_PATTERN = re.compile(r"\n{3,}")
|
|
24
|
+
VAR_VALID_PATTERN = re.compile(r"^[A-Za-z0-9_.]+$")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_nested_val(ctx, key):
|
|
28
|
+
"""Resolves nested dot-notation keys from context (e.g., app.info.package)."""
|
|
29
|
+
parts = key.split(".")
|
|
30
|
+
val = ctx
|
|
31
|
+
for p in parts:
|
|
32
|
+
if isinstance(val, dict):
|
|
33
|
+
val = val.get(p)
|
|
34
|
+
else:
|
|
35
|
+
return None
|
|
36
|
+
return val
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Node:
|
|
40
|
+
"""Base class for all Abstract Syntax Tree (AST) node elements."""
|
|
41
|
+
|
|
42
|
+
def render(self, ctx, buffer):
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class TextNode(Node):
|
|
47
|
+
"""Represents raw static text blocks."""
|
|
48
|
+
|
|
49
|
+
def __init__(self, text):
|
|
50
|
+
self.text = text
|
|
51
|
+
|
|
52
|
+
def render(self, ctx, buffer):
|
|
53
|
+
buffer.append(self.text)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class VarNode(Node):
|
|
57
|
+
"""Represents dynamic variable interpolation with literal fallbacks."""
|
|
58
|
+
|
|
59
|
+
def __init__(self, key, raw_text):
|
|
60
|
+
self.key = key
|
|
61
|
+
self.raw_text = raw_text
|
|
62
|
+
|
|
63
|
+
def render(self, ctx, buffer):
|
|
64
|
+
val = get_nested_val(ctx, self.key)
|
|
65
|
+
if val is not None:
|
|
66
|
+
buffer.append(str(val))
|
|
67
|
+
else:
|
|
68
|
+
# Preserve the unresolved tag exactly like the original engine
|
|
69
|
+
buffer.append(self.raw_text)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class IfNode(Node):
|
|
73
|
+
"""Represents conditional block logic (IF, IF_ALL, IF_ANY)."""
|
|
74
|
+
|
|
75
|
+
def __init__(self, keys_str, mode, children):
|
|
76
|
+
self.keys = [k.strip() for k in keys_str.split(",")]
|
|
77
|
+
self.mode = mode
|
|
78
|
+
self.children = children
|
|
79
|
+
|
|
80
|
+
def render(self, ctx, buffer):
|
|
81
|
+
condition_met = False
|
|
82
|
+
if self.mode == "IF":
|
|
83
|
+
condition_met = bool(get_nested_val(ctx, self.keys[0]))
|
|
84
|
+
elif self.mode == "IF_ANY":
|
|
85
|
+
condition_met = any(get_nested_val(ctx, k) for k in self.keys)
|
|
86
|
+
elif self.mode == "IF_ALL":
|
|
87
|
+
condition_met = all(get_nested_val(ctx, k) for k in self.keys)
|
|
88
|
+
|
|
89
|
+
if condition_met:
|
|
90
|
+
for child in self.children:
|
|
91
|
+
child.render(ctx, buffer)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def strip_nodes(nodes):
|
|
95
|
+
"""Helper to strip leading/trailing whitespace from first/last TextNodes."""
|
|
96
|
+
if not nodes:
|
|
97
|
+
return nodes
|
|
98
|
+
|
|
99
|
+
# Strip leading whitespace from first TextNode
|
|
100
|
+
if isinstance(nodes[0], TextNode):
|
|
101
|
+
nodes[0].text = nodes[0].text.lstrip()
|
|
102
|
+
if not nodes[0].text:
|
|
103
|
+
nodes.pop(0)
|
|
104
|
+
|
|
105
|
+
# Strip trailing whitespace from last TextNode
|
|
106
|
+
if nodes and isinstance(nodes[-1], TextNode):
|
|
107
|
+
nodes[-1].text = nodes[-1].text.rstrip()
|
|
108
|
+
if not nodes[-1].text:
|
|
109
|
+
nodes.pop()
|
|
110
|
+
|
|
111
|
+
return nodes
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class EachNode(Node):
|
|
115
|
+
"""Represents standard iteration logic {{#EACH}} over lists/dicts."""
|
|
116
|
+
|
|
117
|
+
def __init__(self, key, children):
|
|
118
|
+
self.key = key
|
|
119
|
+
self.children = strip_nodes(children)
|
|
120
|
+
|
|
121
|
+
def _render_children(self, local_ctx):
|
|
122
|
+
"""Helper to render nested children under a specific loop context."""
|
|
123
|
+
sub_buffer = []
|
|
124
|
+
for child in self.children:
|
|
125
|
+
child.render(local_ctx, sub_buffer)
|
|
126
|
+
return "".join(sub_buffer)
|
|
127
|
+
|
|
128
|
+
def render(self, ctx, buffer):
|
|
129
|
+
val = get_nested_val(ctx, self.key)
|
|
130
|
+
if not val:
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
rendered_items = []
|
|
134
|
+
if isinstance(val, dict):
|
|
135
|
+
for k, v in val.items():
|
|
136
|
+
if k == "-":
|
|
137
|
+
continue
|
|
138
|
+
new_ctx = ctx.copy()
|
|
139
|
+
new_ctx["KEY"] = str(k)
|
|
140
|
+
new_ctx["VALUE"] = v
|
|
141
|
+
rendered_items.append(self._render_children(new_ctx))
|
|
142
|
+
|
|
143
|
+
elif isinstance(val, list):
|
|
144
|
+
for item in val:
|
|
145
|
+
new_ctx = ctx.copy()
|
|
146
|
+
new_ctx["ITEM"] = item
|
|
147
|
+
rendered_items.append(self._render_children(new_ctx))
|
|
148
|
+
|
|
149
|
+
# Join iterations together with single newline
|
|
150
|
+
buffer.append("\n".join(rendered_items))
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class _ParserFrame:
|
|
154
|
+
"""Helper class representing an active stack frame in the compiler."""
|
|
155
|
+
|
|
156
|
+
def __init__(self, tag_type, children, match):
|
|
157
|
+
self.tag_type = tag_type
|
|
158
|
+
self.children = children
|
|
159
|
+
self.match = match
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def compile_template(template_str):
|
|
163
|
+
"""Parses template_str forward-only, building the AST Node tree."""
|
|
164
|
+
root_children = []
|
|
165
|
+
stack = [_ParserFrame(None, root_children, None)]
|
|
166
|
+
|
|
167
|
+
pos = 0
|
|
168
|
+
for match in TAG_PATTERN.finditer(template_str):
|
|
169
|
+
start, end = match.span()
|
|
170
|
+
|
|
171
|
+
# 1. Capture static text prior to the tag
|
|
172
|
+
if start > pos:
|
|
173
|
+
stack[-1].children.append(TextNode(template_str[pos:start]))
|
|
174
|
+
|
|
175
|
+
prefix = match.group(1)
|
|
176
|
+
tag_type = match.group(2)
|
|
177
|
+
arg = match.group(3).strip() if match.group(3) else ""
|
|
178
|
+
raw_tag = match.group(0)
|
|
179
|
+
|
|
180
|
+
if prefix == "#":
|
|
181
|
+
if tag_type:
|
|
182
|
+
# Pushing a new nested frame block onto the stack
|
|
183
|
+
new_children = []
|
|
184
|
+
stack.append(_ParserFrame(tag_type, new_children, match))
|
|
185
|
+
else:
|
|
186
|
+
# Invalid tag starting with #, treat as normal text block
|
|
187
|
+
stack[-1].children.append(TextNode(raw_tag))
|
|
188
|
+
|
|
189
|
+
elif prefix == "/":
|
|
190
|
+
if tag_type:
|
|
191
|
+
# Block closer tag
|
|
192
|
+
if len(stack) > 1 and stack[-1].tag_type == tag_type:
|
|
193
|
+
frame = stack.pop()
|
|
194
|
+
open_arg = frame.match.group(3).strip()
|
|
195
|
+
|
|
196
|
+
if frame.tag_type == "EACH":
|
|
197
|
+
node = EachNode(open_arg, frame.children)
|
|
198
|
+
else:
|
|
199
|
+
node = IfNode(open_arg, frame.tag_type, frame.children)
|
|
200
|
+
|
|
201
|
+
stack[-1].children.append(node)
|
|
202
|
+
else:
|
|
203
|
+
# Mismatched closer, treat as static text
|
|
204
|
+
stack[-1].children.append(TextNode(raw_tag))
|
|
205
|
+
else:
|
|
206
|
+
# Invalid closer, treat as static text
|
|
207
|
+
stack[-1].children.append(TextNode(raw_tag))
|
|
208
|
+
|
|
209
|
+
else:
|
|
210
|
+
# Variable tag or unknown braces
|
|
211
|
+
if VAR_VALID_PATTERN.match(arg):
|
|
212
|
+
stack[-1].children.append(VarNode(arg, raw_tag))
|
|
213
|
+
else:
|
|
214
|
+
stack[-1].children.append(TextNode(raw_tag))
|
|
215
|
+
|
|
216
|
+
pos = end
|
|
217
|
+
|
|
218
|
+
# Capture any trailing text blocks
|
|
219
|
+
if pos < len(template_str):
|
|
220
|
+
stack[-1].children.append(TextNode(template_str[pos:]))
|
|
221
|
+
|
|
222
|
+
# Graceful recovery for unclosed tags to prevent runtime crashes
|
|
223
|
+
while len(stack) > 1:
|
|
224
|
+
frame = stack.pop()
|
|
225
|
+
# Re-inject the unclosed opening tag as plain text, followed by its children
|
|
226
|
+
stack[-1].children.append(TextNode(frame.match.group(0)))
|
|
227
|
+
stack[-1].children.extend(frame.children)
|
|
228
|
+
|
|
229
|
+
return root_children
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def render_template(template_str, context_dict):
|
|
233
|
+
"""Renders a markdown template with high performance and zero dependencies."""
|
|
234
|
+
nodes = compile_template(template_str)
|
|
235
|
+
|
|
236
|
+
buffer = []
|
|
237
|
+
for node in nodes:
|
|
238
|
+
node.render(context_dict, buffer)
|
|
239
|
+
|
|
240
|
+
final_string = "".join(buffer)
|
|
241
|
+
|
|
242
|
+
# Collapse 3 or more consecutive newlines into exactly 2 (preserves layout)
|
|
243
|
+
return NEWLINE_COLLAPSE_PATTERN.sub("\n\n", final_string)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: android-profiler
|
|
3
|
+
description: >
|
|
4
|
+
Manages Android performance profiling and debugging. Triggers when the user
|
|
5
|
+
asks to record or analyze Android performance data, such as system traces,
|
|
6
|
+
heap dumps, method recordings, callstack samples, memory allocations, or
|
|
7
|
+
investigate bottlenecks, jank, memory leaks, and app startup issues on
|
|
8
|
+
Android, or when the user asks to write, debug, or execute ad-hoc SQL
|
|
9
|
+
queries. Applies to both user and system apps or services.
|
|
10
|
+
license: Apache-2.0
|
|
11
|
+
source: https://github.com/android/skills
|
|
12
|
+
intents: [performance]
|
|
13
|
+
stacks: [android]
|
|
14
|
+
metadata:
|
|
15
|
+
author: Google LLC
|
|
16
|
+
last-updated: '2026-08-06'
|
|
17
|
+
keywords:
|
|
18
|
+
- Android performance
|
|
19
|
+
- debugging
|
|
20
|
+
- profiling
|
|
21
|
+
- recording
|
|
22
|
+
- trace analysis
|
|
23
|
+
- memory leaks
|
|
24
|
+
- bottleneck
|
|
25
|
+
- jank
|
|
26
|
+
- SQL
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Android Profiler Orchestrator
|
|
30
|
+
|
|
31
|
+
Your primary role is **Intent Disambiguation and Routing**; route the user to
|
|
32
|
+
the correct workflow or prepare an execution plan for the user. Work with the
|
|
33
|
+
user to finalize the plan and then proceed with the plan execution, addressing
|
|
34
|
+
singular as well as composite needs.
|
|
35
|
+
|
|
36
|
+
## Prerequisites and Setup
|
|
37
|
+
|
|
38
|
+
Before executing any workflows, read
|
|
39
|
+
[`references/env_setup.md`](references/env_setup.md) (it sits next to this file
|
|
40
|
+
in the skill root). It defines what to set `$SKILL_ROOT` to - the anchor every
|
|
41
|
+
other path in this skill is written against.
|
|
42
|
+
|
|
43
|
+
## Intent Disambiguation
|
|
44
|
+
|
|
45
|
+
Do not guess the user's intent. If the user request is not clear, **ask the
|
|
46
|
+
user** what they want to do before proceeding.
|
|
47
|
+
|
|
48
|
+
## Recording
|
|
49
|
+
|
|
50
|
+
Route all recording requests through
|
|
51
|
+
`$SKILL_ROOT/recording/recording_orchestrator.md`. This defines guidelines and
|
|
52
|
+
pre-flight checks or dependency checks that apply to all recording workflows,
|
|
53
|
+
and ensures you have the necessary setup to proceed. Read the orchestrator and
|
|
54
|
+
execute the plan it describes based on what the user wants to record (for
|
|
55
|
+
example, a system trace or a heap dump).
|
|
56
|
+
|
|
57
|
+
## Analysis
|
|
58
|
+
|
|
59
|
+
Route all analysis requests through
|
|
60
|
+
`$SKILL_ROOT/analysis/analysis_orchestrator.md`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Analysis Orchestrator
|
|
2
|
+
|
|
3
|
+
Use the guidelines below to find the right analysis workflow to execute based
|
|
4
|
+
on the user intent (for example, analyzing a system trace or a heap dump).
|
|
5
|
+
|
|
6
|
+
Ensure you can answer the following: "User intends to
|
|
7
|
+
[analyze/query/investigate] ______". For example,
|
|
8
|
+
"User intends to analyze a heap dump to investigate a memory leak".
|
|
9
|
+
|
|
10
|
+
## Handling Composite Requests
|
|
11
|
+
|
|
12
|
+
If the user's request involves multiple distinct analysis goals (for example,
|
|
13
|
+
analyzing a trace for jank AND checking for memory leaks or GPU issues),
|
|
14
|
+
do not execute them simultaneously.
|
|
15
|
+
|
|
16
|
+
1. Break down the request and propose a sequential execution plan to the user.
|
|
17
|
+
2. Ask the user for confirmation to start the first step.
|
|
18
|
+
3. Do not proceed to the next workflow until the current one is completed.
|
|
19
|
+
|
|
20
|
+
## Workflow Discovery and Routing
|
|
21
|
+
|
|
22
|
+
This skill supports multiple specialized analysis workflows. To determine the
|
|
23
|
+
right workflows to use:
|
|
24
|
+
|
|
25
|
+
1. Use your file search tools (for example, `grep_search`) to recursively scan
|
|
26
|
+
the `$SKILL_ROOT/analysis/workflows/` directory for workflow entrypoints
|
|
27
|
+
(markdown files defining a top-level `name:` key in their frontmatter,
|
|
28
|
+
ignoring internal `references/` subdirectories).
|
|
29
|
+
2. Compare the user's request and intent against the `name:`, `description:`,
|
|
30
|
+
and `keywords:` fields to identify matching workflows. If multiple are
|
|
31
|
+
found, present them as options to the user and proceed with the
|
|
32
|
+
user's selection.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: perfetto-sql
|
|
3
|
+
description: >
|
|
4
|
+
Translates natural language data intents into syntactically valid PerfettoSQL
|
|
5
|
+
queries and/or executes them against a trace file, if provided. Use this
|
|
6
|
+
workflow to draft, debug, or execute queries extracting slice, thread, or
|
|
7
|
+
memory data from Android Perfetto traces using trace_processor.
|
|
8
|
+
keywords:
|
|
9
|
+
- Perfetto SQL
|
|
10
|
+
- SQL Guidelines
|
|
11
|
+
- SQL Best Practices
|
|
12
|
+
- Ad-hoc Query
|
|
13
|
+
- Trace Processor
|
|
14
|
+
- SPAN_JOIN
|
|
15
|
+
- Idempotency
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Ad-Hoc PerfettoSQL Querying
|
|
19
|
+
|
|
20
|
+
Use this workflow to write, debug, or execute PerfettoSQL queries:
|
|
21
|
+
|
|
22
|
+
- **Executing against a trace:** If a trace file path or URL is provided, verify
|
|
23
|
+
environment prerequisites in `$SKILL_ROOT/references/perfetto/setup.md` and
|
|
24
|
+
follow the session execution workflow in
|
|
25
|
+
`$SKILL_ROOT/references/perfetto/sql.md`.
|
|
26
|
+
- **Static query authoring or debugging:** If no trace is attached, draft,
|
|
27
|
+
optimize, or debug the queries using the syntax, schema guidelines, and
|
|
28
|
+
standard library best practices in `$SKILL_ROOT/references/perfetto/sql.md`.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: perfetto-trace-analysis
|
|
3
|
+
description: >
|
|
4
|
+
Analyzes Perfetto traces to find the root cause of performance issues in
|
|
5
|
+
user or system Android apps (for example, janks, app startup, memory, or
|
|
6
|
+
latency stalls).
|
|
7
|
+
keywords:
|
|
8
|
+
- perfetto
|
|
9
|
+
- trace
|
|
10
|
+
- jank
|
|
11
|
+
- startup
|
|
12
|
+
- latency
|
|
13
|
+
- stall
|
|
14
|
+
- thread
|
|
15
|
+
- bottleneck
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Perfetto Trace Analysis
|
|
19
|
+
|
|
20
|
+
Use this workflow to diagnose general Android performance issues: jank, app
|
|
21
|
+
startup, latency, stall, or a thread-blocking problem.
|
|
22
|
+
|
|
23
|
+
Follow these steps in order:
|
|
24
|
+
|
|
25
|
+
## Step 1: Identify what to investigate first
|
|
26
|
+
|
|
27
|
+
Work with the user (for example, ask questions, present options) to
|
|
28
|
+
understand the following:
|
|
29
|
+
|
|
30
|
+
- _What is the symptom_: Do they want to investigate frame drops, jank,
|
|
31
|
+
startup issues, app crash, system crash, ANR?
|
|
32
|
+
- _Who is the victim:_ Where did they observe the symptom? For example, "a
|
|
33
|
+
frame drop in `com.example.sample`".
|
|
34
|
+
|
|
35
|
+
> **Input Trace Required:** Confirm that the user has provided a trace file
|
|
36
|
+
> path or URL (for example, `.pftrace`, `.perfetto-trace`, or a Perfetto UI
|
|
37
|
+
> link). If none is provided, pause and ask the user to provide one before
|
|
38
|
+
> proceeding.
|
|
39
|
+
|
|
40
|
+
> If you do not know the symptom, pause and ask the user for clarification.
|
|
41
|
+
|
|
42
|
+
> If you know the symptom but not the victim, proceed to Step 2 (Triage) to
|
|
43
|
+
> discover candidates. Present the 3-5 most severe instances to the user and
|
|
44
|
+
> proceed with the user selection.
|
|
45
|
+
|
|
46
|
+
> **A/B Trace Comparison:** If the user provides multiple traces (for
|
|
47
|
+
> example, a baseline and an issue trace), explicitly clarify which is the
|
|
48
|
+
> baseline. You will pass both paths to the subagents in Step 3 so they can
|
|
49
|
+
> use the baseline trace to establish expected behavior.
|
|
50
|
+
|
|
51
|
+
## Step 2: Run a system-wide triage
|
|
52
|
+
|
|
53
|
+
Spin off a subagent/task and instruct it to follow instructions from
|
|
54
|
+
`$SKILL_ROOT/analysis/workflows/perfetto-trace-analysis/references/triage.md`
|
|
55
|
+
to run a system-wide triage. (Do not read this file yourself. Pass this path
|
|
56
|
+
in the sub-agent prompt so it loads the file and performs the triage steps).
|
|
57
|
+
|
|
58
|
+
Note the output produced by the subagent to identify the filtered list of
|
|
59
|
+
**candidates** that we need to investigate.
|
|
60
|
+
|
|
61
|
+
> **Note:**
|
|
62
|
+
> - If no candidates are found, ask the user for symptom clarification and
|
|
63
|
+
> specific timestamps.
|
|
64
|
+
> - If the triage reveals multiple candidates, select the top 2 or 3 most
|
|
65
|
+
> severe, representative candidates and ask the user before proceeding
|
|
66
|
+
> which ones to investigate. The user may choose one or more.
|
|
67
|
+
|
|
68
|
+
**Expected outcome:** Confirmation on which candidate(s) to investigate
|
|
69
|
+
before proceeding.
|
|
70
|
+
|
|
71
|
+
## Step 3: Investigate each branch in parallel
|
|
72
|
+
|
|
73
|
+
For **every** candidate (one or more) identified in the previous step, spin
|
|
74
|
+
off a task/subagent to investigate these tracks _in parallel_.
|
|
75
|
+
|
|
76
|
+
Construct a prompt for each candidate containing:
|
|
77
|
+
```markdown
|
|
78
|
+
Trace path: [path]
|
|
79
|
+
Baseline Trace Path: [path, if provided]
|
|
80
|
+
Candidate Info: [`utid`, `upid`, thread_name, process_name, `render_thread_utid` (if applicable)]
|
|
81
|
+
Symptom Window: [start_ts, end_ts, duration]
|
|
82
|
+
System Vitals: [payload from Step 2]
|
|
83
|
+
Budget: [expected duration, if applicable]
|
|
84
|
+
Execution Protocol: Read
|
|
85
|
+
`$SKILL_ROOT/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md`
|
|
86
|
+
and follow its instructions end-to-end.
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
SPAWN the subagent(s) in parallel and await completion of all subagents before
|
|
90
|
+
proceeding to Step 4.
|
|
91
|
+
|
|
92
|
+
## Step 4: Final report and consolidation
|
|
93
|
+
|
|
94
|
+
Read the output from every spawned subagent and generate a consolidated "Trace
|
|
95
|
+
Analysis Report" adhering to these instructions:
|
|
96
|
+
|
|
97
|
+
1. **Summary and Root Cause:** State the findings in simple, clear language
|
|
98
|
+
and classify root causes (hardware, software/code, scheduling policy,
|
|
99
|
+
system exhaustion, or external dependency).
|
|
100
|
+
2. **Dependency Chain:** Map the full path from symptom to root cause.
|
|
101
|
+
Include thread names, `UTID`s, blocking states, and exact timestamps at
|
|
102
|
+
every hop.
|
|
103
|
+
3. **Evidence Tags:** Tag every single claim with `[SQL]` (backed by data),
|
|
104
|
+
`[INFERRED]` (logical deduction), or `[GAP]` (partial or missing data),
|
|
105
|
+
and briefly define these tags at the start.
|
|
106
|
+
4. **Platform Context:** Explain Android system behaviors _only_ by citing
|
|
107
|
+
specific retrieved slice names, values, and timestamps.
|
|
108
|
+
**What's bad:** "SurfaceFlinger does X around vsync"
|
|
109
|
+
**What's a good explanation:** "SurfaceFlinger's composition slice at
|
|
110
|
+
`ts=142.3ms` ran `4ms` after the vsync signal at `ts=138.1ms`, consistent
|
|
111
|
+
with X".
|
|
112
|
+
5. **Partial Suspects:** List all branches that were investigated but did not
|
|
113
|
+
reach a terminal root cause, ranked by evidence strength. Include what
|
|
114
|
+
was found and where verification fell short. A partial suspect can be the
|
|
115
|
+
real contributor - report it even if a terminal root cause was found
|
|
116
|
+
elsewhere.
|
|
117
|
+
|
|
118
|
+
> If evidence is evenly split between multiple potential causes, report each
|
|
119
|
+
> suspicion with its supporting data and evidence so that engineers can
|
|
120
|
+
> evaluate probabilities without false certainty. Do not arbitrarily pick
|
|
121
|
+
> a winner.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Guiding Principles for Trace Analysis
|
|
2
|
+
|
|
3
|
+
Whether you are augmented with domain-specific knowledge or doing a standard
|
|
4
|
+
workflow analysis, follow these rules.
|
|
5
|
+
|
|
6
|
+
**Why:** Performance analysis is complex. It is entirely possible to end up
|
|
7
|
+
identifying a root cause while the reality is different (for example, a hardware
|
|
8
|
+
bottleneck causing a cascade of failures). The principles below keep your
|
|
9
|
+
analysis grounded in truth and ensure that you investigate the entire causal
|
|
10
|
+
chain to discover the true bottleneck.
|
|
11
|
+
|
|
12
|
+
1. **Schema Validation via Intrinsic Discovery:**
|
|
13
|
+
Read `$SKILL_ROOT/references/perfetto/sql.md` and query table schemas
|
|
14
|
+
using `LIMIT 0` before drafting queries.
|
|
15
|
+
- **Why:** Trace processor schemas evolve across versions; discovering
|
|
16
|
+
schema directly prevents invalid assumptions and syntax failures.
|
|
17
|
+
2. **Empirical Data Grounding:** Support every claim with tool output or
|
|
18
|
+
queried timestamps, slice durations or counter values (`[SQL]`).
|
|
19
|
+
- **Why:** General Android heuristics cannot substitute for ground-truth
|
|
20
|
+
trace metrics. When queries return empty results, broaden search
|
|
21
|
+
constraints using fuzzy matching or wider time windows.
|
|
22
|
+
3. **Causation vs. Correlation:** Verify that the blocker's active execution
|
|
23
|
+
overlaps with the victim's wait interval.
|
|
24
|
+
- **Why:** Concurrent anomalies are only causally linked if their
|
|
25
|
+
execution lifetimes intersect. For example, just because thread A was busy
|
|
26
|
+
while thread B was waiting does not necessarily mean thread A caused the
|
|
27
|
+
wait.
|
|
28
|
+
4. **Follow Evidence:** Follow dependency chains across thread, process and
|
|
29
|
+
kernel boundaries to the terminal root cause. Keep going as long as
|
|
30
|
+
**each hop meaningfully explains the symptom**.
|
|
31
|
+
- **Why:** Halting blocker traversal prematurely reports intermediate
|
|
32
|
+
symptoms rather than the true origin.
|
|
33
|
+
5. **Explicit Uncertainty Reporting:** Categorize unverified execution paths
|
|
34
|
+
as `[GAP]` or partial suspects.
|
|
35
|
+
- **Why:** Transparent reporting of missing data enables engineers to evaluate
|
|
36
|
+
probabilities without false certainty.
|
|
37
|
+
6. **Evidence-First Explanation:** Cite concrete retrieved metrics and slice
|
|
38
|
+
timestamps before asserting platform behavioral context.
|
|
39
|
+
- **Why:** Contextual explanations are only reliable when anchored in
|
|
40
|
+
empirical trace observations.
|
|
41
|
+
7. **Systemic Confound Sweeps:** Before attributing a bottleneck to
|
|
42
|
+
application software, verify that thermal throttling, CPU capping
|
|
43
|
+
(`cpufreq`), scheduling (`sched_slice`), or LMKD pressure isn't uniformly
|
|
44
|
+
degrading the system. Report such confounds as root cause modifiers.
|
|
45
|
+
> To uncover short-lived anomalies that get mathematically missed by simple
|
|
46
|
+
> averages or aggregate queries, isolate and look around the symptom window
|
|
47
|
+
> and query for individual event spikes or percentiles.
|
|
48
|
+
8. **Systematic Step Adherence:** At every step of your investigation, strictly
|
|
49
|
+
follow the defined investigation steps.
|
|
50
|
+
- **Why:** Structured verification prevents analytical blind spots and
|
|
51
|
+
premature conclusions on obvious but non-critical anomalies.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
subsystem: cpu
|
|
3
|
+
description: >
|
|
4
|
+
Expert hints for CPU scheduling, thread states, CPU contention, and
|
|
5
|
+
frequency scaling.
|
|
6
|
+
keywords:
|
|
7
|
+
- cpu
|
|
8
|
+
- scheduling
|
|
9
|
+
- latency
|
|
10
|
+
- runnable
|
|
11
|
+
- running
|
|
12
|
+
- thread state
|
|
13
|
+
- governor
|
|
14
|
+
- core
|
|
15
|
+
- frequency
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# CPU & Scheduling Expert Hints
|
|
19
|
+
|
|
20
|
+
- When debugging a long slice: Examine its thread states to understand what the
|
|
21
|
+
thread was doing (running, sleeping, blocked on I/O).
|
|
22
|
+
- When debugging a long slice for latency issues: Check if its duration is
|
|
23
|
+
caused by one or more long-running child slices. Apply recursively.
|
|
24
|
+
- When a thread is woken up but there is a delay before it runs, check the
|
|
25
|
+
"IRQ" track for the corresponding CPU to see if an interrupt is the cause.
|
|
26
|
+
- Check if kernel threads associated with hardware are running with real-time
|
|
27
|
+
priority; if not, they can be preempted.
|
|
28
|
+
- When analysis of the primary application package does not reveal root cause,
|
|
29
|
+
expand to all threads and processes. Search for other runnable threads on the
|
|
30
|
+
same CPU or high-priority kernel threads.
|
|
31
|
+
- When investigating app startup, use an SQL query to aggregate reasons for
|
|
32
|
+
uninterruptible sleep on the main thread.
|
|
33
|
+
- Check the "cpu_frequency" counter for CPU cores that ran the main process.
|
|
34
|
+
Missing frequency data or stuck frequencies indicate a kernel-level bug in
|
|
35
|
+
the governor.
|
|
36
|
+
- Query raw "ftrace" events for logs related to the governor thread (for
|
|
37
|
+
example, "su_gov").
|
|
38
|
+
- To find concurrency issues, search for critical threads (for example,
|
|
39
|
+
'RenderThread') in a blocked state (`thread_state.state = 'D'`) and join with
|
|
40
|
+
scheduling data to find the waker.
|
|
41
|
+
- Compare time spent in userspace functions vs kernel (slices with [k] prefix).
|
|
42
|
+
- To detect a 'catch-up storm', look for threads with long gaps in
|
|
43
|
+
thread_state/cpu_slice activity immediately followed by a high-density burst.
|
|
44
|
+
- Quantify scheduler contention by calculating scheduling latency (measure
|
|
45
|
+
duration of preceding 'Runnable' state using
|
|
46
|
+
`preceding_sched_slice_for_thread`). Search for maximums and high percentiles
|
|
47
|
+
(p95/p99).
|
|
48
|
+
- If a task exhibits high scheduling latency, check if other CPUs were idle
|
|
49
|
+
(running swapper or idle thread).
|
|
50
|
+
- Check the `cpu_id` for key threads; if consistently scheduled on slower
|
|
51
|
+
cores, it signals a potential performance gain by allowing them on big cores.
|
|
52
|
+
- For a struggling thread, analyze 'Runnable' vs 'Running' state time. A large
|
|
53
|
+
'Runnable' time indicates CPU contention.
|
|
54
|
+
- If a slice's wall duration increases but the percentage of 'Running' time is
|
|
55
|
+
unchanged, it strongly suggests a lower CPU frequency. Check `sched_switch`
|
|
56
|
+
to focus on the correct cores.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
subsystem: graphics
|
|
3
|
+
description: >
|
|
4
|
+
Expert hints for graphics performance, UI jank, GPU memory, and frame
|
|
5
|
+
rendering.
|
|
6
|
+
keywords:
|
|
7
|
+
- graphics
|
|
8
|
+
- ui jank
|
|
9
|
+
- gpu
|
|
10
|
+
- frame
|
|
11
|
+
- vsync
|
|
12
|
+
- render
|
|
13
|
+
- surfaceflinger
|
|
14
|
+
- texture
|
|
15
|
+
- bitmap
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Graphics & UI Jank Expert Hints
|
|
19
|
+
|
|
20
|
+
- When investigating UI jank, check for long-running slices on the main
|
|
21
|
+
thread; if a slice like "ConstraintLayout.onMeasure" is taking a long time
|
|
22
|
+
(for example, >8ms), it is a likely cause of the jank.
|
|
23
|
+
- When a `bitmap_write_to_parcel` slice takes milliseconds instead of
|
|
24
|
+
microseconds, investigate its children slices to see how time is spent. Long
|
|
25
|
+
durations often point to suboptimal kernel operations like memory mapping
|
|
26
|
+
(`mmap`) or unnecessary data zeroing.
|
|
27
|
+
- For a high-level overview of graphics memory usage, track `gpu_mem_total`
|
|
28
|
+
counter for a specific process (`upid`).
|
|
29
|
+
- To find the largest graphics allocations, query the `android_graphics_allocs`
|
|
30
|
+
table and sort by `size_bytes` in descending order. Compare width and height
|
|
31
|
+
against the device's display resolution.
|
|
32
|
+
- To detect the "double memory cost" of an image existing on both CPU and GPU,
|
|
33
|
+
look for a large buffer in `android_graphics_allocs` and a simultaneous CPU
|
|
34
|
+
memory allocation of a similar size (`rss_anon_bytes` or `heap_graph`).
|
|
35
|
+
- To find potentially costly intermediate render targets, look for large
|
|
36
|
+
buffers in `android_graphics_allocs` where `usage_bits` lack a
|
|
37
|
+
`COMPOSER_OVERLAY` flag.
|
|
38
|
+
- To check if an allocation is actually presented on screen, correlate
|
|
39
|
+
`buffer_id` with SurfaceFlinger events.
|
|
40
|
+
- To see if high graphics memory is causing performance issues, check the frame
|
|
41
|
+
duration in `actual_frame_timeline_slice`. Durations over vsync (for
|
|
42
|
+
example, 16.6ms) correlating with `gpu_mem_total` spikes suggest memory
|
|
43
|
+
pressure jank.
|
|
44
|
+
- Within the main thread of a janky graphics application, look for frequent or
|
|
45
|
+
long-running `texture_upload` slices.
|
|
46
|
+
- Analyze the duration of `eglSwapBuffersWithDamageKHR` or similar buffer-swap
|
|
47
|
+
slices in the graphics rendering thread. Consistently long durations suggest
|
|
48
|
+
a large "damage area" being redrawn every frame.
|
|
49
|
+
- To identify UI jank, compare `actual_frame_timeline` against the
|
|
50
|
+
`expected_frame_timeline` on the main process; a significant deviation
|
|
51
|
+
indicates missed frames.
|