Meshtastic-Android/docs/archive/BUILD_LOGIC_OPTIMIZATION_SUMMARY.md
James Rich 7d63f8b824
feat: build logic (#4829)
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
2026-03-17 20:35:39 +00:00

11 KiB

Build-Logic Optimization Complete

Date: March 12, 2026 Status: DEPLOYED AND VERIFIED

Executive Summary

Completed comprehensive review and optimization of build-logic/ convention plugins. Implemented high-impact centralization of test dependencies, added a reusable jvmAndroidMain hierarchy convention for Android + desktop JVM shared code, and documented other optimization opportunities. All changes tested and verified.


Completed Optimizations

1. Test Dependency Centralization DEPLOYED

What: Consolidated kotlin("test") configuration across all KMP modules

Implementation:

  • Created configureKmpTestDependencies() function in KotlinAndroid.kt
  • Integrated into KmpLibraryConventionPlugin
  • Removed manual dependencies from 7 feature modules

Impact:

BEFORE:
- 7+ build.gradle.kts files with duplicate kotlin("test")
- Risk of missing dependencies in new modules
- Inconsistent configuration patterns

AFTER:
- Single source of truth in build-logic
- All 15+ KMP modules automatically benefit
- Clear, maintainable pattern for future test frameworks

Files Changed: 9 files modified

  • build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt
  • build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt
  • 7 feature module build.gradle.kts files (simplified)
  • AGENTS.md (documentation updated)

Verification:

✅ ./gradlew spotlessCheck detekt         # BUILD SUCCESSFUL
✅ ./gradlew test                         # BUILD SUCCESSFUL (516 tasks)
✅ ./gradlew assembleDebug                # BUILD SUCCESSFUL

2. Duplication Analysis & Documentation COMPLETED

Identified Duplications:

Duplication Plugin Pair Lines Status
Identical AndroidApplicationComposeConventionPluginAndroidLibraryComposeConventionPlugin ~40 📝 Documented
Nearly Identical AndroidApplicationFlavorsConventionPluginAndroidLibraryFlavorsConventionPlugin ~30 📝 Documented
Consolidation Opportunity AndroidApplicationConventionPluginAndroidLibraryConventionPlugin ~50 📋 Planned

Decision: Keep Compose & Flavor plugins separate (for now)

  • Reason: Different extension types + explicit intent matters
  • Cost: ~70 lines of intentional duplication
  • Benefit: Clear plugin purpose in build.gradle.kts
  • Future: Can consolidate when benefits outweigh clarity costs

Documentation Added:

  • Both Compose plugins: Explicit note explaining identical implementation
  • Both Flavor plugins: Note about consolidation opportunity using CommonExtension
  • Future optimization path clearly marked

3. jvmAndroidMain Hierarchy Convention DEPLOYED

What: Standardized shared JVM+Android source-set wiring for KMP modules that need src/jvmAndroidMain.

Implementation:

  • Added configureJvmAndroidMainHierarchy() in KotlinAndroid.kt
  • Added opt-in meshtastic.kmp.jvm.android convention plugin (KmpJvmAndroidConventionPlugin)
  • Migrated core:common, core:model, core:network, and core:ui off manual dependsOn(...) edges

Impact:

BEFORE:
- 4 modules manually created jvmAndroidMain
- Kotlin emitted "Default Kotlin Hierarchy Template Not Applied Correctly"
- Source-set wiring lived in each module build.gradle.kts

AFTER:
- 1 opt-in convention plugin for shared JVM+Android code
- No manual hierarchy edges in affected modules
- The original hierarchy-template warning is removed for those modules

Files Changed:

  • build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/KotlinAndroid.kt
  • build-logic/convention/src/main/kotlin/KmpJvmAndroidConventionPlugin.kt
  • build-logic/convention/build.gradle.kts
  • core/{common,model,network,ui}/build.gradle.kts
  • AGENTS.md, docs/kmp-status.md, docs/BUILD_LOGIC_CONVENTIONS_GUIDE.md, docs/BUILD_LOGIC_INDEX.md

Documentation Created

1. docs/BUILD_CONVENTION_TEST_DEPS.md

  • Details on test dependency centralization
  • Summary of changes and impact
  • Benefits for module developers

2. docs/archive/BUILD_LOGIC_OPTIMIZATION_ANALYSIS.md

  • Complete analysis of 4 optimization opportunities
  • High/Medium/Low priority classification
  • Implementation cost/benefit analysis
  • Future recommendations

3. docs/archive/BUILD_LOGIC_OPTIMIZATIONS_COMPLETE.md PRIMARY REFERENCE

  • Full summary of all optimizations
  • Build-logic plugin inventory with duplication status
  • Future opportunities with effort estimates
  • Testing & verification procedures
  • Performance impact analysis

4. docs/BUILD_LOGIC_CONVENTIONS_GUIDE.md DEVELOPER GUIDE

  • Quick reference for maintaining build-logic
  • Core principles and best practices
  • How to add new conventions (with examples)
  • Duplication heuristics (when to consolidate vs keep separate)
  • Common pitfalls and solutions
  • Testing requirements for changes

Testing & Verification

Build Quality Checks

✅ Code Formatting:     ./gradlew spotlessCheck detekt
✅ Full Assembly:       ./gradlew clean assembleDebug assembleRelease
✅ Unit Tests:          ./gradlew test (516 tasks, all passing)
✅ Feature Tests:       ./gradlew :feature:messaging:jvmTest
✅ Android Host Tests:  ./gradlew :feature:node:testAndroidHostTest

Test Coverage

  • All feature modules compile with new test dependency convention
  • All jvmAndroidMain core modules compile with the new hierarchy convention
  • Both JVM and Android host test targets verified
  • Gradle configuration cache works correctly
  • No regressions in existing functionality

Architecture Improvements

Test Dependency Pattern (NEW)

Problem Solved: Scattered test framework configuration

BEFORE: 7 places to add test dependencies
  feature/messaging/build.gradle.kts
  feature/node/build.gradle.kts
  feature/settings/build.gradle.kts
  ... (4 more)

AFTER: 1 place for all KMP modules
  build-logic/convention/src/main/kotlin/
    org/meshtastic/buildlogic/KotlinAndroid.kt

Benefits

  1. DRY Principle: Single source of truth
  2. Scalability: New modules automatically get correct config
  3. Maintainability: One place to add new test frameworks
  4. Clarity: Explicit intent preserved in build.gradle.kts

Shared jvmAndroidMain Pattern (NEW)

Problem Solved: Hand-wired shared JVM/Android source-set graphs

BEFORE: manual dependsOn(...) in 4 modules
  core/common/build.gradle.kts
  core/model/build.gradle.kts
  core/network/build.gradle.kts
  core/ui/build.gradle.kts

AFTER: 1 opt-in convention plugin
  id("meshtastic.kmp.jvm.android")

Benefits

  1. Supported API: Uses Kotlin hierarchy templates instead of manual dependsOn(...)
  2. Signal Reduction: Removes the default hierarchy template warning in affected modules
  3. Consistency: One pattern for future Android + desktop JVM shared code
  4. Smaller build files: Modules only declare target-specific dependencies

Recommendations

Immediate

  • Deploy test dependency centralization
  • Document Compose duplication
  • Document Flavor duplication

Short-Term (Next Sprint)

  • Implement plugin validation test suite
  • Review configureTestOptions() for other centralization opportunities
  • Consider RootConventionPlugin audit for similar patterns

Long-Term (Future Roadmap)

  • If AndroidApplication/Library diverge significantly, extract common baseline (~2 hours effort)
  • If Compose or Flavor handling becomes complex, revisit consolidation decision
  • Build agent playbook for "build-logic analysis & optimization"

Key Learnings

What Worked Well

  1. Clear duplication analysis: Identified exactly which plugins were identical
  2. Principled decisions: "Clarity wins over DRY" is a valid architectural choice
  3. Documentation focus: Marked consolidation opportunities for future maintainers
  4. Verified thoroughly: All changes tested before deployment

⚠️ What Could Improve

  1. Earlier discovery: Could have added test dependency convention at module creation time
  2. Plugin testing: Consider adding Gradle plugin tests to build-logic
  3. Consolidation threshold: Define when duplication justifies consolidation vs clarity

📚 Best Practices Established

  1. Convention plugins document their duplication status
  2. Consolidation opportunities are marked for future work
  3. Test dependencies centralized by module type (KMP, Android, etc.)
  4. All changes validated with spotless + detekt + tests

Files Summary

File Purpose Status
KotlinAndroid.kt New test dependency function Deployed
KmpLibraryConventionPlugin.kt Integrated test config Deployed
KmpJvmAndroidConventionPlugin.kt Opt-in jvmAndroid hierarchy config Deployed
AndroidApplicationComposeConventionPlugin.kt Documented duplication Documented
AndroidLibraryComposeConventionPlugin.kt Documented duplication Documented
AndroidApplicationFlavorsConventionPlugin.kt Documented opportunity Documented
AndroidLibraryFlavorsConventionPlugin.kt Documented opportunity Documented
feature/*/build.gradle.kts (7 files) Simplified dependencies Deployed
core/{common,model,network,ui}/build.gradle.kts Switched to jvmAndroid convention Deployed
AGENTS.md Updated testing section Updated
BUILD_LOGIC_CONVENTIONS_GUIDE.md Developer guide Created
BUILD_LOGIC_OPTIMIZATIONS_COMPLETE.md Complete analysis Created
BUILD_LOGIC_OPTIMIZATION_ANALYSIS.md Detailed analysis Created
BUILD_CONVENTION_TEST_DEPS.md Test deps summary Created

Maintenance Going Forward

For Developers

  • Use docs/BUILD_LOGIC_CONVENTIONS_GUIDE.md when modifying build-logic
  • Follow test dependency patterns when creating new KMP modules
  • Reference docs/archive/BUILD_LOGIC_OPTIMIZATIONS_COMPLETE.md for consolidation opportunities

For Code Reviewers

  • Watch for duplicate convention plugins (can consolidate if appropriate)
  • Ensure test dependencies use convention pattern (not hardcoded in modules)
  • Check that new conventions are documented

For Maintainers

  • Review consolidation opportunities yearly (cost/benefit changes over time)
  • Monitor if Application/Library handling diverges (may justify separate plugins)
  • Expand test dependency convention if new frameworks are adopted

Conclusion

Successfully optimized build-logic with zero breaking changes while establishing patterns for future improvements. Test dependency centralization deployed and verified across all modules. Documentation provides clear path for future consolidations when appropriate.

Status: READY FOR PRODUCTION