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.
Files changed (463) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -0
  4. package/README.md +175 -168
  5. package/THIRD_PARTY_NOTICES.md +224 -4
  6. package/agents/android-architect.md +89 -0
  7. package/agents/android-performance-engineer.md +92 -0
  8. package/agents/android-test-engineer.md +97 -0
  9. package/agents/flutter-test-engineer.md +2 -0
  10. package/agents/ios-architect.md +93 -0
  11. package/agents/ios-performance-engineer.md +92 -0
  12. package/agents/ios-test-engineer.md +95 -0
  13. package/agents/lead-mobile.md +10 -1
  14. package/agents/mobile-staff-engineer.md +1 -1
  15. package/agents/rn-architect.md +94 -0
  16. package/agents/rn-performance-engineer.md +92 -0
  17. package/agents/rn-test-engineer.md +98 -0
  18. package/bin/reis-mobile.mjs +59 -17
  19. package/commands/debate.md +10 -1
  20. package/commands/debug.md +60 -0
  21. package/commands/reis-mobile.md +7 -2
  22. package/core/config/project.mjs +59 -0
  23. package/core/registry/frontmatter.mjs +15 -4
  24. package/core/registry/registry.mjs +21 -1
  25. package/core/router/intents.mjs +2 -0
  26. package/core/router/router.mjs +10 -5
  27. package/package.json +1 -1
  28. package/skills/android-adaptive/SKILL.md +304 -0
  29. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
  30. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
  31. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
  32. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
  33. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
  34. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
  35. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
  36. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
  37. package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
  38. package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
  39. package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  40. package/skills/android-agp-9-upgrade/SKILL.md +106 -0
  41. package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
  42. package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
  43. package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
  44. package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
  45. package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
  46. package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
  47. package/skills/android-appfunctions/SKILL.md +74 -0
  48. package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
  49. package/skills/android-appfunctions/references/context.md +26 -0
  50. package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
  51. package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
  52. package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
  53. package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
  54. package/skills/android-camerax/SKILL.md +135 -0
  55. package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
  56. package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
  57. package/skills/android-camerax/references/expert-blueprints.md +58 -0
  58. package/skills/android-camerax/references/foldables.md +83 -0
  59. package/skills/android-camerax/references/immutability.md +60 -0
  60. package/skills/android-camerax/references/low-light.md +124 -0
  61. package/skills/android-camerax/references/mlkit-spatial.md +75 -0
  62. package/skills/android-camerax/references/modern-apis.md +42 -0
  63. package/skills/android-camerax/references/testing.md +69 -0
  64. package/skills/android-camerax/references/thermals.md +85 -0
  65. package/skills/android-camerax/references/wear-os.md +76 -0
  66. package/skills/android-camerax/references/xr.md +54 -0
  67. package/skills/android-cli/SKILL.md +474 -0
  68. package/skills/android-cli/references/interact.md +113 -0
  69. package/skills/android-cli/references/journeys.md +120 -0
  70. package/skills/android-code-review/SKILL.md +58 -0
  71. package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
  72. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
  73. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
  74. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
  75. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
  76. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
  77. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
  78. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
  79. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
  80. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
  81. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
  82. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
  83. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
  84. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
  85. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
  86. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
  87. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
  88. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
  89. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
  90. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
  91. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
  92. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
  93. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
  94. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
  95. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
  96. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
  97. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
  98. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
  99. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
  100. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
  101. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
  102. package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
  103. package/skills/android-edge-to-edge/SKILL.md +429 -0
  104. package/skills/android-engage-sdk-integration/SKILL.md +130 -0
  105. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
  106. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
  107. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
  108. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
  109. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
  110. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
  111. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
  112. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
  113. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
  114. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
  115. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
  116. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
  117. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
  118. package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
  119. package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
  120. package/skills/android-engage-sdk-integration/references/common.md +519 -0
  121. package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
  122. package/skills/android-engage-sdk-integration/references/requests.md +260 -0
  123. package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
  124. package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
  125. package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
  126. package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
  127. package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
  128. package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
  129. package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
  130. package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
  131. package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
  132. package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
  133. package/skills/android-gradle-build-debug/SKILL.md +71 -0
  134. package/skills/android-intent-security/SKILL.md +550 -0
  135. package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
  136. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
  137. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
  138. package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
  139. package/skills/android-media3-cast-integration/SKILL.md +236 -0
  140. package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
  141. package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
  142. package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
  143. package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
  144. package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
  145. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
  146. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
  147. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
  148. package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
  149. package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
  150. package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
  151. package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
  152. package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
  153. package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
  154. package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
  155. package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
  156. package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
  157. package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
  158. package/skills/android-navigation-3/SKILL.md +122 -0
  159. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
  160. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
  161. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
  162. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
  163. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
  164. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
  165. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
  166. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
  167. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
  168. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
  169. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
  170. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
  171. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
  172. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
  173. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
  174. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  175. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
  176. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
  177. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
  178. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
  179. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
  180. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
  181. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
  182. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
  183. package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
  184. package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
  185. package/skills/android-navigation-event/SKILL.md +312 -0
  186. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
  187. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
  188. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
  189. package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
  190. package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
  191. package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
  192. package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
  193. package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
  194. package/skills/android-play-policy-insights/SKILL.md +172 -0
  195. package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
  196. package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
  197. package/skills/android-play-policy-insights/resources/critic.md +86 -0
  198. package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
  199. package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
  200. package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
  201. package/skills/android-play-policy-insights/resources/policies.json +321 -0
  202. package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
  203. package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
  204. package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
  205. package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
  206. package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
  207. package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
  208. package/skills/android-profiler/SKILL.md +60 -0
  209. package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
  210. package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
  211. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
  212. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
  213. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
  214. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
  215. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
  216. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
  217. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
  218. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
  219. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
  220. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
  221. package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
  222. package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
  223. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
  224. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
  225. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
  226. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
  227. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
  228. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
  229. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
  230. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
  231. package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
  232. package/skills/android-profiler/references/env_setup.md +15 -0
  233. package/skills/android-profiler/references/perfetto/setup.md +29 -0
  234. package/skills/android-profiler/references/perfetto/sql.md +327 -0
  235. package/skills/android-r8-analyzer/SKILL.md +72 -0
  236. package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
  237. package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
  238. package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  239. package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  240. package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  241. package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
  242. package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
  243. package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  244. package/skills/android-restore-credentials/SKILL.md +359 -0
  245. package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
  246. package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
  247. package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
  248. package/skills/android-styles/SKILL.md +229 -0
  249. package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
  250. package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
  251. package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
  252. package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
  253. package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
  254. package/skills/android-verified-email/SKILL.md +432 -0
  255. package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
  256. package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
  257. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
  258. package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
  259. package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
  260. package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
  261. package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
  262. package/skills/android-wear-compose-m3/SKILL.md +365 -0
  263. package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
  264. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
  265. package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
  266. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
  267. package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
  268. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
  269. package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
  270. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
  271. package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
  272. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
  273. package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
  274. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
  275. package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
  276. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
  277. package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
  278. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
  279. package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
  280. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
  281. package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
  282. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
  283. package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
  284. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
  285. package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
  286. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
  287. package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
  288. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
  289. package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
  290. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
  291. package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
  292. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
  293. package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
  294. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
  295. package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
  296. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
  297. package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
  298. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
  299. package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
  300. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
  301. package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
  302. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
  303. package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
  304. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
  305. package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
  306. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
  307. package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
  308. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
  309. package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
  310. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
  311. package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
  312. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
  313. package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
  314. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
  315. package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
  316. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
  317. package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
  318. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
  319. package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
  320. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
  321. package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
  322. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
  323. package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
  324. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
  325. package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
  326. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
  327. package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
  328. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
  329. package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
  330. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
  331. package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
  332. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
  333. package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
  334. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
  335. package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
  336. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
  337. package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
  338. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
  339. package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
  340. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
  341. package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
  342. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
  343. package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
  344. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
  345. package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
  346. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
  347. package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
  348. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
  349. package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
  350. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
  351. package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
  352. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
  353. package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
  354. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
  355. package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
  356. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
  357. package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
  358. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
  359. package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
  360. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
  361. package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
  362. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
  363. package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
  364. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
  365. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
  366. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
  367. package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
  368. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
  369. package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
  370. package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
  371. package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
  372. package/skills/flutter-build-debug/SKILL.md +66 -0
  373. package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
  374. package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
  375. package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
  376. package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
  377. package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
  378. package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
  379. package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
  380. package/skills/{provider → flutter-provider}/SKILL.md +1 -1
  381. package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
  382. package/skills/ios-cocoapods-debug/SKILL.md +65 -0
  383. package/skills/ios-code-review/SKILL.md +56 -0
  384. package/skills/ios-xcode-build-debug/SKILL.md +66 -0
  385. package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
  386. package/skills/mobile-firebase/SKILL.md +54 -0
  387. package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
  388. package/skills/mobile-firebase/references/android/analytics.md +33 -0
  389. package/skills/mobile-firebase/references/android/app-check.md +36 -0
  390. package/skills/mobile-firebase/references/android/auth.md +44 -0
  391. package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
  392. package/skills/mobile-firebase/references/android/firestore.md +44 -0
  393. package/skills/mobile-firebase/references/android/functions.md +33 -0
  394. package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
  395. package/skills/mobile-firebase/references/android/messaging.md +41 -0
  396. package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
  397. package/skills/mobile-firebase/references/android/remote-config.md +43 -0
  398. package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
  399. package/skills/mobile-firebase/references/android/storage.md +39 -0
  400. package/skills/mobile-firebase/references/android.md +30 -0
  401. package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
  402. package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
  403. package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
  404. package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
  405. package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
  406. package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
  407. package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
  408. package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
  409. package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
  410. package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
  411. package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
  412. package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
  413. package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
  414. package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
  415. package/skills/mobile-firebase/references/flutter.md +36 -0
  416. package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
  417. package/skills/mobile-firebase/references/ios/analytics.md +33 -0
  418. package/skills/mobile-firebase/references/ios/app-check.md +36 -0
  419. package/skills/mobile-firebase/references/ios/auth.md +48 -0
  420. package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
  421. package/skills/mobile-firebase/references/ios/firestore.md +53 -0
  422. package/skills/mobile-firebase/references/ios/functions.md +35 -0
  423. package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
  424. package/skills/mobile-firebase/references/ios/messaging.md +45 -0
  425. package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
  426. package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
  427. package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
  428. package/skills/mobile-firebase/references/ios/storage.md +36 -0
  429. package/skills/mobile-firebase/references/ios.md +28 -0
  430. package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
  431. package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
  432. package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
  433. package/skills/mobile-firebase/references/react-native/auth.md +50 -0
  434. package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
  435. package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
  436. package/skills/mobile-firebase/references/react-native/functions.md +28 -0
  437. package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
  438. package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
  439. package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
  440. package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
  441. package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
  442. package/skills/mobile-firebase/references/react-native/storage.md +30 -0
  443. package/skills/mobile-firebase/references/react-native.md +29 -0
  444. package/skills/mobile-test/SKILL.md +63 -0
  445. package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
  446. package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
  447. package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
  448. package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
  449. package/skills/mobile-test/references/android.md +83 -0
  450. package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
  451. package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
  452. package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
  453. package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
  454. package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
  455. package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
  456. package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
  457. package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
  458. package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
  459. package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
  460. package/skills/mobile-test/references/flutter.md +44 -0
  461. package/skills/mobile-test/references/ios.md +79 -0
  462. package/skills/mobile-test/references/react-native.md +62 -0
  463. /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,7 @@
1
+ ---
2
+ domain: The specific domain or product.
3
+ description: Description of the domain/subsystem for effective routing
4
+ keywords:
5
+ - List of symptoms and keywords where these hints are applicable,
6
+ for example, 'jank', 'surfaceflinger', 'vulkan'.
7
+ ---
@@ -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.