@wazir-dev/cli 1.0.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/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
# Mobile Memory & Battery — Performance Expertise Module
|
|
2
|
+
|
|
3
|
+
> Memory and battery are the most constrained resources on mobile devices. Apps that consume excessive memory get killed by the OS; apps that drain battery get uninstalled. On Android, the Low Memory Killer Daemon (lmkd) terminates background apps based on oom_adj_score thresholds — processes using more than ~200MB in the background are prime candidates. iOS is even more aggressive — the Jetsam watchdog enforces per-process hard memory limits (e.g., ~2098MB on 4GB iPhones) and terminates apps immediately with no warning.
|
|
4
|
+
|
|
5
|
+
> **Impact:** Critical
|
|
6
|
+
> **Applies to:** Mobile (iOS, Android, Flutter, React Native)
|
|
7
|
+
> **Key metrics:** Peak memory usage (MB), Memory leak rate (KB/min), Battery consumption (mAh/hour), CPU wake-ups per hour, Partial wake lock duration (hours/24h)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Why This Matters
|
|
12
|
+
|
|
13
|
+
**Android lmkd** assigns each process an `oom_adj_score`. When free RAM drops below thresholds, lmkd kills highest-scored processes first. Since Android 11, PSI (Pressure Stall Information) provides more accurate pressure detection. Each memory page = 4KB; a 50MB threshold = 12,800 pages.
|
|
14
|
+
|
|
15
|
+
**iOS Jetsam** enforces hard per-process limits. When exceeded, the app is killed immediately — no `didReceiveMemoryWarning`, no grace period. Background limits are ~50-80MB; foreground limits scale with device RAM.
|
|
16
|
+
|
|
17
|
+
**Google Play Store (March 2026):** If >5% of user sessions hold >2 cumulative hours of non-exempt wake locks in 24 hours, the app is excluded from recommendations and may show a battery drain warning on its listing.
|
|
18
|
+
|
|
19
|
+
| Factor | Statistic |
|
|
20
|
+
|--------|-----------|
|
|
21
|
+
| Users who stop using battery-draining apps | 36% (TestDevLab/Pcloudy) |
|
|
22
|
+
| Users who uninstall after 2 crashes | 71% (App Annie) |
|
|
23
|
+
| Cold start abandonment threshold | > 2 seconds (Scalosoft 2025) |
|
|
24
|
+
| 1-star reviews citing battery | ~18% of negative reviews |
|
|
25
|
+
| #1 crash cause on iOS | Memory (OOM) terminations (Apple WWDC) |
|
|
26
|
+
|
|
27
|
+
Apps in the "Restricted" Android Standby Bucket get near-zero background execution. Users who disable Background App Refresh eliminate push-driven re-engagement entirely.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 2. Performance Budgets & Targets
|
|
32
|
+
|
|
33
|
+
### Memory Budgets by Device Tier
|
|
34
|
+
|
|
35
|
+
| Device Tier | RAM | Foreground Budget | Background Budget | Image Cache |
|
|
36
|
+
|-------------|-----|-------------------|-------------------|-------------|
|
|
37
|
+
| Low-end Android (2GB) | 2GB | 80-120MB | 30-50MB | 20MB |
|
|
38
|
+
| Mid-range Android (4GB) | 4GB | 150-200MB | 50-80MB | 40MB |
|
|
39
|
+
| High-end Android (8GB+) | 8-12GB | 250-350MB | 80-120MB | 80MB |
|
|
40
|
+
| iPhone SE/older (3GB) | 3GB | 120-180MB | 40-55MB | 30MB |
|
|
41
|
+
| iPhone 15/16 (6GB) | 6GB | 250-400MB | 55-80MB | 60MB |
|
|
42
|
+
|
|
43
|
+
### Battery Drain Targets
|
|
44
|
+
|
|
45
|
+
| Scenario | Target | Unacceptable |
|
|
46
|
+
|----------|--------|-------------|
|
|
47
|
+
| Active foreground | < 5%/hr | > 10%/hr |
|
|
48
|
+
| Background sync | < 0.5%/hr | > 2%/hr |
|
|
49
|
+
| Idle | < 0.1%/hr | > 1%/hr |
|
|
50
|
+
| Wake locks per 24h | < 30 min cumulative | > 2 hours |
|
|
51
|
+
| GPS active | < 8%/hr | > 15%/hr |
|
|
52
|
+
|
|
53
|
+
### Memory Leak Thresholds
|
|
54
|
+
|
|
55
|
+
| Metric | Acceptable | Warning | Critical |
|
|
56
|
+
|--------|-----------|---------|----------|
|
|
57
|
+
| Leak rate | < 5 KB/min | 5-20 KB/min | > 20 KB/min |
|
|
58
|
+
| Retained objects after nav | 0 | 1-3 | > 3 |
|
|
59
|
+
| Heap growth per session | < 10% | 10-30% | > 30% |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. Measurement & Profiling
|
|
64
|
+
|
|
65
|
+
**Android Studio Memory Profiler:** Live allocation tracking, heap dumps, GC event visualization, native memory tracking (API 26+). CLI: `adb shell dumpsys meminfo com.example.app` shows PSS, Private Dirty, Heap Alloc.
|
|
66
|
+
|
|
67
|
+
**LeakCanary 2.14 (Square):** Auto-detects leaks of Activity, Fragment, View, ViewModel, Service. Zero code changes — auto-initializes via classpath. For CI: `leakcanary-android-instrumentation` artifact provides `FailTestOnLeakRunListener` that fails tests on confirmed leaks.
|
|
68
|
+
|
|
69
|
+
```kotlin
|
|
70
|
+
// Debug-only: debugImplementation("com.squareup.leakcanary:leakcanary-android:2.14")
|
|
71
|
+
// CI tests: androidTestImplementation("com.squareup.leakcanary:leakcanary-android-instrumentation:2.14")
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Xcode Instruments (iOS):** Allocations (object lifetimes, "Mark Generation" for delta analysis), Leaks (retain cycle detection), Zombies (use-after-free). Memory Graph Debugger shows visual reference graphs with purple marks on retain cycles. CLI: `leaks`, `heap`, `vmmap` for `.memgraph` analysis.
|
|
75
|
+
|
|
76
|
+
**iOS Energy Impact:** Xcode gauge shows CPU, GPU, network, location, background cost (Low/High/Very High). MetricKit delivers daily production diagnostics (memory peak, CPU time, hang rate).
|
|
77
|
+
|
|
78
|
+
**Battery Historian (Android):** `adb bugreport bugreport.zip` — timeline of wake locks, jobs, alarms, network, GPS, screen, CPU state.
|
|
79
|
+
|
|
80
|
+
**Flutter DevTools:** Memory tab shows Dart heap, external allocations, RSS, GC events. "Diff Snapshots" identifies accumulated objects between actions. Dart 3.5 (2025) optimized GC further.
|
|
81
|
+
|
|
82
|
+
**React Native / Hermes:** Chrome DevTools heap snapshots. Hermes provides ~30% cold-start improvement over JSC via bytecode precompilation. Flipper for real-time monitoring.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 4. Common Bottlenecks
|
|
87
|
+
|
|
88
|
+
### Memory (8 critical bottlenecks)
|
|
89
|
+
|
|
90
|
+
1. **Bitmap blowout:** One uncompressed 12MP photo = 48MB. Ten images without downsampling = 480MB = OOM. Glide auto-downsamples: 1000px image in 200px view = 0.15MB vs 3.8MB.
|
|
91
|
+
2. **Activity/Context leaks:** Static or singleton references prevent GC of the entire Activity tree (5-50MB per leak). The #1 Android memory leak source.
|
|
92
|
+
3. **Retain cycles (iOS):** Two objects with mutual strong references prevent ARC deallocation. Common in delegates, closures, parent-child VCs.
|
|
93
|
+
4. **Unbounded caches:** `HashMap`/`Dictionary` without size limits grows indefinitely. Always use `LruCache`/`NSCache`.
|
|
94
|
+
5. **Navigation stack accumulation:** 20+ screens deep = 200-400MB. Use `popUpTo(inclusive=true)` or limit stack depth.
|
|
95
|
+
6. **WebView:** 30-80MB per instance. Explicit `destroy()` required on Android — not released when removed from hierarchy.
|
|
96
|
+
7. **Subscription leaks:** RxJava Disposable, Flow collectors, Combine AnyCancellable not cancelled on lifecycle events.
|
|
97
|
+
8. **Uncompressed asset loading:** A 50MB JSON parsed into objects expands to 200-300MB due to object overhead.
|
|
98
|
+
|
|
99
|
+
### Battery (9 critical bottlenecks)
|
|
100
|
+
|
|
101
|
+
9. **Excessive wake locks:** `PARTIAL_WAKE_LOCK` keeps CPU running. Google threshold: >2h/24h = "excessive" = Play Store warning.
|
|
102
|
+
10. **Continuous GPS:** HIGH_ACCURACY = 30-50mA. At 1s intervals = ~10% battery/hr. BALANCED_POWER at 30s = ~2%/hr.
|
|
103
|
+
11. **Polling vs push:** 30s polling keeps radio perpetually active (20s tail time per request). FCM/APNs use 5-10x less power.
|
|
104
|
+
12. **Fragmented network requests:** Each request wakes radio from idle (50ms, 2W) + 20s high-power tail. 100 small requests/min = radio never idles. Batching into 5-10 requests saves 80%.
|
|
105
|
+
13. **Sensor oversampling:** Accelerometer at FASTEST (~200Hz) = 10-15mA. SENSOR_DELAY_NORMAL (~5Hz) = 2-3mA (70% reduction).
|
|
106
|
+
14. **Background video/audio processing:** Full CPU core = 500-1500mA. Defer to charging state.
|
|
107
|
+
15. **GPU overdraw:** 3x overdraw = GPU processes each pixel 3 times. Reducing 3x to 1x cuts GPU power 50-60%.
|
|
108
|
+
16. **Foreground service abuse:** Prevents Doze; 3-5% battery/hr even when idle.
|
|
109
|
+
17. **Unthrottled analytics:** Each event = radio wake. Batch 20 events or flush every 60s.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 5. Optimization Patterns
|
|
114
|
+
|
|
115
|
+
### Memory
|
|
116
|
+
|
|
117
|
+
**Object pooling** — Reuse bitmaps, buffers, view holders instead of allocating new ones. Eliminates GC pressure.
|
|
118
|
+
|
|
119
|
+
**Image right-sizing** — Decode at target display size: `inSampleSize=16` reduces 48MB image to 0.19MB (99.6% reduction).
|
|
120
|
+
|
|
121
|
+
**Weak references** — Break retain cycles: `[weak self]` in Swift closures, `WeakReference<T>` in Kotlin.
|
|
122
|
+
|
|
123
|
+
**Bounded caches** — Android: `LruCache` at 1/8 of `Runtime.maxMemory()`. iOS: `NSCache` with `totalCostLimit` (auto-evicts under memory pressure).
|
|
124
|
+
|
|
125
|
+
**Lazy loading** — Defer heavy initialization with `by lazy` (Kotlin), lazy properties (Swift). Feature modules loaded on demand.
|
|
126
|
+
|
|
127
|
+
**Struct vs class (iOS)** — Small structs (<16 bytes) pass in registers with zero ARC overhead. Large shared state belongs in classes.
|
|
128
|
+
|
|
129
|
+
### Battery
|
|
130
|
+
|
|
131
|
+
**Batch network requests** — Group small requests into fewer transfers. Reduces radio active time from 33 min/hr to 2 min/hr (94% reduction).
|
|
132
|
+
|
|
133
|
+
**Doze/App Standby compliance** — Use `WorkManager` with constraints (`setRequiresBatteryNotLow`, `setRequiredNetworkType`). Minimum interval: 15 minutes.
|
|
134
|
+
|
|
135
|
+
**Location optimization** — Use `BALANCED_POWER_ACCURACY` with 30s intervals (Android), `significantLocationChanges` (iOS). Switch to HIGH_ACCURACY only during active navigation.
|
|
136
|
+
|
|
137
|
+
**Sensor management** — Use `SENSOR_DELAY_NORMAL`; unregister all sensors in `onPause`/`onStop`.
|
|
138
|
+
|
|
139
|
+
**Background scheduling** — iOS: `BGTaskScheduler` with `requiresExternalPower = true` for heavy work. Android: `WorkManager` replaces AlarmManager and JobScheduler.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 6. Anti-Patterns
|
|
144
|
+
|
|
145
|
+
### Memory Anti-Patterns
|
|
146
|
+
|
|
147
|
+
| # | Anti-Pattern | Impact | Fix |
|
|
148
|
+
|---|-------------|--------|-----|
|
|
149
|
+
| 1 | Caching everything in HashMap | Unbounded growth to 500MB+ | `LruCache`/`NSCache` at 1/8 heap |
|
|
150
|
+
| 2 | Not releasing resources in onPause | Camera, sensors, bitmaps held while backgrounded | Release in onPause, re-acquire in onResume |
|
|
151
|
+
| 3 | Static Activity/Context references | 5-50MB leaked per instance | Use ApplicationContext or WeakReference |
|
|
152
|
+
| 4 | Loading full-resolution images | 48MB per 12MP image | Downsample with Glide/Coil size targets |
|
|
153
|
+
| 5 | Anonymous inner classes capturing outer | Implicit strong reference to Activity | Static inner class + WeakReference |
|
|
154
|
+
| 6 | Not cancelling async operations | Coroutines/Rx/Combine keep references alive | viewModelScope, CompositeDisposable, lifecycle |
|
|
155
|
+
| 7 | Deep navigation stacks | 200-400MB for 20+ screens | popUpTo with inclusive=true |
|
|
156
|
+
| 8 | String concatenation in loops | N iterations = N String objects | StringBuilder or joinToString |
|
|
157
|
+
| 9 | Autoboxing in collections | List<Integer> = 16 bytes/element overhead | SparseIntArray, IntArray |
|
|
158
|
+
| 10 | Not calling WebView.destroy() | 30-80MB retained after removal | Explicit destroy() and null reference |
|
|
159
|
+
|
|
160
|
+
### Battery Anti-Patterns
|
|
161
|
+
|
|
162
|
+
| # | Anti-Pattern | Impact | Fix |
|
|
163
|
+
|---|-------------|--------|-----|
|
|
164
|
+
| 1 | Polling every N seconds | Radio never idles; 5-10x waste | FCM/APNs push notifications |
|
|
165
|
+
| 2 | GPS at HIGH_ACCURACY always | ~10% battery/hr | BALANCED_POWER; stop when not navigating |
|
|
166
|
+
| 3 | Wake locks without timeout | CPU never sleeps on exception | acquire(timeoutMs) + try/finally |
|
|
167
|
+
| 4 | AlarmManager for periodic work | Bypasses Doze | Migrate to WorkManager |
|
|
168
|
+
| 5 | Foreground service for non-essential work | Prevents Doze; 3-5%/hr idle drain | WorkManager for deferrable tasks |
|
|
169
|
+
| 6 | Animations while backgrounded | CPU/GPU active for invisible UI | Pause in onPause/viewDidDisappear |
|
|
170
|
+
| 7 | Unthrottled analytics | Each event = radio wake | Batch 20 events or flush every 60s |
|
|
171
|
+
| 8 | Continuous BT/WiFi scanning | 50-100mA | Scan every 30-60s; stop when found |
|
|
172
|
+
| 9 | setExactRepeating for syncs | Prevents OS batching | setInexactRepeating |
|
|
173
|
+
| 10 | Downloading on cellular | 200-800mA vs WiFi 50-200mA | NetworkType.UNMETERED constraint |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 7. Architecture-Level Decisions
|
|
178
|
+
|
|
179
|
+
**On-demand loading:** Shell app (8-15MB) with lazy feature modules. Register for `onTrimMemory(TRIM_MEMORY_RUNNING_LOW)` / `didReceiveMemoryWarning` to proactively release caches. Dynamic Feature Modules (Android) and on-demand resources (iOS) report 30-50% base memory reduction.
|
|
180
|
+
|
|
181
|
+
**Data lifecycle:** Parse API responses into models, immediately release raw buffers. Keep only current screen's data in memory; persist rest to database. Use cursor pagination (LIMIT/OFFSET). Set TTL on all cache entries. On memory warning: drop all caches, keep only nav state.
|
|
182
|
+
|
|
183
|
+
**WorkManager vs AlarmManager:** WorkManager is the default choice — Doze-compatible, full constraint support, task chaining, guaranteed execution, 15-min minimum interval. AlarmManager only for exact-time requirements (alarms, reminders). Never use AlarmManager for syncing.
|
|
184
|
+
|
|
185
|
+
**Image pipeline:** Request -> Memory LRU (1/8 heap) -> Disk cache (50-100MB) -> Network fetch + downsample -> Store in both caches. Libraries: Coil/Glide (Android), Kingfisher/SDWebImage (iOS), cached_network_image (Flutter), react-native-fast-image (RN).
|
|
186
|
+
|
|
187
|
+
**Flutter architecture:** Dart's generational GC: New Generation (short-lived, frequent collection) and Old Generation (long-lived, infrequent). Dispose all controllers in `dispose()`. Cancel all StreamSubscriptions and Timers. Use `compute()` for heavy work (isolate). Dart 3.5 (2025) optimizes allocation and GC.
|
|
188
|
+
|
|
189
|
+
**React Native new architecture:** JSI eliminates bridge serialization (~1ms -> ~0.01ms per call). TurboModules lazy-load (save 10-30MB startup memory). Hermes bytecode precompilation reduces memory baseline 20-30% vs JSC.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 8. Testing & Regression Prevention
|
|
194
|
+
|
|
195
|
+
**Android Macrobenchmark:** `MemoryUsageMetric(Mode.Max)` captures peak memory during instrumented user flows. Run in CI against baseline.
|
|
196
|
+
|
|
197
|
+
**iOS XCTest:** `XCTMemoryMetric` and `XCTCPUMetric` in `measure(metrics:)` blocks. Assert peak memory stays within budget.
|
|
198
|
+
|
|
199
|
+
**LeakCanary in CI:** `FailTestOnLeakRunListener` fails instrumentation tests on confirmed leaks. Catches regressions before production.
|
|
200
|
+
|
|
201
|
+
**iOS MetricKit:** `MXMetricManagerSubscriber` delivers daily production payloads — memory peak, CPU time, hang rate. Track Jetsam terminations via `MXDiagnosticPayload.crashDiagnostics`.
|
|
202
|
+
|
|
203
|
+
**Android Vitals:** Tracks excessive wake locks, background WiFi scans, stuck partial wake locks, background cellular usage. Alerts at bad-behavior thresholds.
|
|
204
|
+
|
|
205
|
+
### Regression Thresholds
|
|
206
|
+
|
|
207
|
+
| Metric | Warning | Fail |
|
|
208
|
+
|--------|---------|------|
|
|
209
|
+
| Peak memory vs baseline | +15% | +30% |
|
|
210
|
+
| Memory after GC vs baseline | +10% | +20% |
|
|
211
|
+
| Leaked objects per test | 1 | 3+ |
|
|
212
|
+
| Battery drain vs baseline | +20% | +40% |
|
|
213
|
+
| Wake lock duration vs baseline | +25% | +50% |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 9. Decision Trees
|
|
218
|
+
|
|
219
|
+
### "My App Uses Too Much Memory"
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
Is peak memory high on fresh launch?
|
|
223
|
+
YES -> Loading all features at startup? -> Lazy loading / dynamic features (30-50% savings)
|
|
224
|
+
-> Large assets at startup? -> Defer loading; use placeholders (20-40MB savings)
|
|
225
|
+
NO -> Memory grows during usage?
|
|
226
|
+
Does memory recover after navigating back?
|
|
227
|
+
NO -> MEMORY LEAK:
|
|
228
|
+
Android: LeakCanary -> static refs, uncancelled coroutines, inner classes
|
|
229
|
+
iOS: Memory Graph -> retain cycles (purple !), uncancelled Combine
|
|
230
|
+
Flutter: DevTools Diff -> undisposed controllers, active streams
|
|
231
|
+
YES -> High transient usage:
|
|
232
|
+
Images? -> Downsample + LRU cache (90%+ reduction per image)
|
|
233
|
+
Data objects? -> Pagination; reduce page size (60-80% reduction)
|
|
234
|
+
WebView? -> Limit to 1; call destroy() on dismiss (30-80MB savings)
|
|
235
|
+
Memory stable but too high?
|
|
236
|
+
-> Check cache sizes (image > 1/8 heap?), duplicate data across caches
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### "My App Drains Battery"
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
Foreground or background drain?
|
|
243
|
+
FOREGROUND:
|
|
244
|
+
CPU > 30% sustained? -> Profile hot functions; offload to background thread
|
|
245
|
+
CPU < 30%? -> Check GPU overdraw (Debug GPU Overdraw: target blue/1x, no red/4x)
|
|
246
|
+
Network: many small requests? -> Batch. Polling? -> WebSocket/push.
|
|
247
|
+
Location: HIGH_ACCURACY always? -> BALANCED_POWER when not navigating
|
|
248
|
+
BACKGROUND:
|
|
249
|
+
Wake locks > 2h/24h? -> Add timeout: acquire(10*60*1000L), use try/finally
|
|
250
|
+
Using AlarmManager for sync? -> Migrate to WorkManager
|
|
251
|
+
Foreground service without user task? -> Convert to WorkManager
|
|
252
|
+
GPS in background? -> significantLocationChanges (iOS) / geofencing (Android)
|
|
253
|
+
Sensors polling? -> Unregister all in onPause/onStop
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 10. Code Examples
|
|
259
|
+
|
|
260
|
+
### Ex 1: Image Loading (Android) — 960MB -> 45MB
|
|
261
|
+
|
|
262
|
+
```kotlin
|
|
263
|
+
// BEFORE: Full-resolution decode. 48MB/image x 20 = 960MB -> OOM
|
|
264
|
+
holder.imageView.setImageBitmap(BitmapFactory.decodeFile(path))
|
|
265
|
+
|
|
266
|
+
// AFTER: Coil with size constraints. 0.2MB/image x 20 = 4MB
|
|
267
|
+
holder.imageView.load(path) { size(200, 200); memoryCachePolicy(CachePolicy.ENABLED) }
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Ex 2: Coroutine Leak (Kotlin) — 750MB leaked -> 0
|
|
271
|
+
|
|
272
|
+
```kotlin
|
|
273
|
+
// BEFORE: GlobalScope survives ViewModel destruction — 15MB leaked per recreation
|
|
274
|
+
GlobalScope.launch { repository.dataFlow.collect { _uiState.value = it } }
|
|
275
|
+
|
|
276
|
+
// AFTER: Auto-cancelled on onCleared()
|
|
277
|
+
viewModelScope.launch { repository.dataFlow.collect { _uiState.value = it } }
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Ex 3: Retain Cycle (Swift) — 240MB leaked -> 0
|
|
281
|
+
|
|
282
|
+
```swift
|
|
283
|
+
// BEFORE: Strong capture creates retain cycle — 12MB leaked per dismiss
|
|
284
|
+
networkManager.onDataReceived = { data in self.updateUI(with: data) }
|
|
285
|
+
|
|
286
|
+
// AFTER: Weak capture breaks cycle
|
|
287
|
+
networkManager.onDataReceived = { [weak self] data in self?.updateUI(with: data) }
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Ex 4: Wake Lock Safety (Android) — 45min/day -> 8min/day
|
|
291
|
+
|
|
292
|
+
```kotlin
|
|
293
|
+
// BEFORE: No timeout, no guaranteed release. CPU never sleeps on exception.
|
|
294
|
+
wakeLock.acquire(); doWork(); wakeLock.release()
|
|
295
|
+
|
|
296
|
+
// AFTER: Timeout + try/finally
|
|
297
|
+
wakeLock.acquire(10 * 60 * 1000L) // 10-min max
|
|
298
|
+
try { doWork() } finally { if (wakeLock.isHeld) wakeLock.release() }
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Ex 5: Network Batching (Android) — 33min radio/hr -> 2min/hr
|
|
302
|
+
|
|
303
|
+
```kotlin
|
|
304
|
+
// BEFORE: 100 individual events/hr = radio never idles
|
|
305
|
+
fun trackEvent(event: Event) { api.sendEvent(event) }
|
|
306
|
+
|
|
307
|
+
// AFTER: Batch 20 events, flush via WorkManager every 15 min
|
|
308
|
+
fun trackEvent(event: Event) {
|
|
309
|
+
synchronized(buffer) { buffer.add(event); if (buffer.size >= 20) flush() }
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Ex 6: Flutter Controller Disposal — 100MB leaked -> 0
|
|
314
|
+
|
|
315
|
+
```dart
|
|
316
|
+
// BEFORE: Missing dispose() — controllers, streams, timers all leak
|
|
317
|
+
// AFTER: Explicit cleanup
|
|
318
|
+
@override
|
|
319
|
+
void dispose() {
|
|
320
|
+
_animController.dispose(); // Native animation resources
|
|
321
|
+
_dataSub.cancel(); // Stream listener
|
|
322
|
+
_pollingTimer?.cancel(); // Timer
|
|
323
|
+
super.dispose();
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Ex 7: iOS autoreleasepool — 4.8GB peak -> 2MB
|
|
328
|
+
|
|
329
|
+
```swift
|
|
330
|
+
// BEFORE: 10,000 images in loop — all temporaries retained until function returns
|
|
331
|
+
for path in imagePaths { let img = UIImage(contentsOfFile: path)!; process(img) }
|
|
332
|
+
|
|
333
|
+
// AFTER: autoreleasepool drains each iteration
|
|
334
|
+
for path in imagePaths { autoreleasepool { let img = UIImage(contentsOfFile: path)!; process(img) } }
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Ex 8: React Native FlatList — OOM at 500 items -> stable at 10,000+
|
|
338
|
+
|
|
339
|
+
```javascript
|
|
340
|
+
// BEFORE: ScrollView renders ALL items (1000 x 2MB = 2GB -> crash)
|
|
341
|
+
<ScrollView>{items.map(i => <Card key={i.id} data={i} />)}</ScrollView>
|
|
342
|
+
|
|
343
|
+
// AFTER: FlatList virtualizes — only visible items rendered (~20-30MB stable)
|
|
344
|
+
<FlatList data={items} renderItem={({item}) => <Card data={item} />}
|
|
345
|
+
windowSize={5} maxToRenderPerBatch={10} removeClippedSubviews={true} />
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Ex 9: Location Power (iOS) — 10%/hr -> 1%/hr
|
|
349
|
+
|
|
350
|
+
```swift
|
|
351
|
+
// BEFORE: Continuous HIGH_ACCURACY — 30-50mA
|
|
352
|
+
manager.desiredAccuracy = kCLLocationAccuracyBest; manager.startUpdatingLocation()
|
|
353
|
+
|
|
354
|
+
// AFTER: Significant-change monitoring — cell tower based, very low power
|
|
355
|
+
manager.startMonitoringSignificantLocationChanges()
|
|
356
|
+
manager.desiredAccuracy = kCLLocationAccuracyHundredMeters; manager.distanceFilter = 50
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 11. Quick Reference
|
|
362
|
+
|
|
363
|
+
| Action | Android | iOS | Flutter | React Native |
|
|
364
|
+
|--------|---------|-----|---------|-------------|
|
|
365
|
+
| **Profiler** | Studio Memory Profiler | Instruments Allocations | DevTools Memory | Flipper / Hermes |
|
|
366
|
+
| **Leak detector** | LeakCanary 2.14 | Memory Graph Debugger | DevTools Diff | Chrome DevTools heap |
|
|
367
|
+
| **Bounded cache** | `LruCache` (1/8 heap) | `NSCache` (auto-evict) | Cache with maxSize | WeakMap + manual LRU |
|
|
368
|
+
| **Image loader** | Coil / Glide | Kingfisher / SDWebImage | cached_network_image | fast-image |
|
|
369
|
+
| **Lifecycle cleanup** | onCleared / onDestroy | deinit / viewDidDisappear | dispose() | useEffect cleanup |
|
|
370
|
+
| **Weak ref** | WeakReference\<T\> | weak var / unowned | N/A (GC handles) | WeakRef / WeakMap |
|
|
371
|
+
| **Memory warning** | onTrimMemory(level) | didReceiveMemoryWarning | didHaveMemoryPressure | AppState + native |
|
|
372
|
+
| **Bg scheduler** | WorkManager | BGTaskScheduler | — | — |
|
|
373
|
+
| **Push** | FCM | APNs | firebase_messaging | @react-native-firebase |
|
|
374
|
+
| **Location (efficient)** | BALANCED_POWER + 30s | significantLocationChanges | geolocator | react-native-geolocation |
|
|
375
|
+
|
|
376
|
+
### Critical Thresholds
|
|
377
|
+
|
|
378
|
+
| Metric | Green | Yellow | Red |
|
|
379
|
+
|--------|-------|--------|-----|
|
|
380
|
+
| Foreground memory | < budget | +20% | +50% |
|
|
381
|
+
| Leak rate | 0 KB/min | < 10 KB/min | > 20 KB/min |
|
|
382
|
+
| Battery (active) | < 5%/hr | 5-10%/hr | > 10%/hr |
|
|
383
|
+
| Battery (background) | < 0.5%/hr | 0.5-2%/hr | > 2%/hr |
|
|
384
|
+
| Wake locks (24h) | < 30 min | 30min-2hr | > 2 hr |
|
|
385
|
+
| Radio active time | < 5 min/hr | 5-15 min/hr | > 15 min/hr |
|
|
386
|
+
| Retained objects post-nav | 0 | 1-3 | > 3 |
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Sources
|
|
391
|
+
|
|
392
|
+
- [Android — Manage your app's memory](https://developer.android.com/topic/performance/memory)
|
|
393
|
+
- [Android — Low Memory Killer](https://developer.android.com/topic/performance/vitals/lmk)
|
|
394
|
+
- [Android — Excessive partial wake locks](https://developer.android.com/topic/performance/vitals/excessive-wakelock)
|
|
395
|
+
- [Android — Doze and App Standby](https://developer.android.com/training/monitoring-device-state/doze-standby)
|
|
396
|
+
- [Android — App Standby Buckets](https://developer.android.com/topic/performance/appstandby)
|
|
397
|
+
- [Android — WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
|
398
|
+
- [Android Blog — Battery Technical Quality Enforcement (March 2026)](https://android-developers.googleblog.com/2026/03/battery-technical-quality-enforcement.html)
|
|
399
|
+
- [Android Blog — Wake Lock Usage Guide](https://android-developers.googleblog.com/2025/09/guide-to-excessive-wake-lock-usage.html)
|
|
400
|
+
- [Apple — Jetsam event reports](https://developer.apple.com/documentation/xcode/identifying-high-memory-use-with-jetsam-event-reports)
|
|
401
|
+
- [Apple — iOS Memory Deep Dive (WWDC18)](https://developer.apple.com/videos/play/wwdc2018/416/)
|
|
402
|
+
- [Apple — Detect and diagnose memory issues (WWDC21)](https://developer.apple.com/videos/play/wwdc2021/10180/)
|
|
403
|
+
- [Apple — Analyze heap memory (WWDC24)](https://developer.apple.com/videos/play/wwdc2024/10173/)
|
|
404
|
+
- [LeakCanary — Official Documentation](https://square.github.io/leakcanary/)
|
|
405
|
+
- [Dropbox — Detecting memory leaks in Android](https://dropbox.tech/mobile/detecting-memory-leaks-in-android-applications)
|
|
406
|
+
- [iOS Memory Management 2025](https://www.alimertgulec.com/en/blog/ios-memory-management-performance-2025)
|
|
407
|
+
- [Flutter Memory Management Guide 2025](https://devalflutterdev.in/blog/flutter-memory-management-guide/)
|
|
408
|
+
- [Dart Garbage Collection](https://fluttermasterylibrary.com/6/11/4/4/)
|
|
409
|
+
- [React Native Performance 2025](https://danielsarney.com/blog/react-native-performance-optimization-2025-making-mobile-apps-fast/)
|
|
410
|
+
- [React Native New Architecture Performance](https://dev.to/amazonappdev/how-does-react-natives-new-architecture-affect-performance-1dkf)
|
|
411
|
+
- [BrowserStack — Battery Usage Metric](https://www.browserstack.com/docs/app-performance/app-performance-guides/android/battery-usage)
|
|
412
|
+
- [TestDevLab — Battery Consumption Testing](https://www.testdevlab.com/blog/how-we-test-mobile-app-battery-usage)
|
|
413
|
+
- [Pcloudy — Battery Drain Testing](https://www.pcloudy.com/blogs/battery-drain-testing-for-mobile-apps/)
|
|
414
|
+
- [Android Image Loaders 2025](https://redwerk.com/blog/android-image-loaders-in-2025-picasso-vs-glide-vs-fresco/)
|
|
415
|
+
- [Scalosoft — Mobile Performance 2025](https://www.scalosoft.com/blog/mobile-app-performance-optimization-best-practices-for-2025/)
|
|
416
|
+
- [Bugfender — Android Performance](https://bugfender.com/blog/android-app-performance/)
|