Files
homebox_lens/gradle_build_noise_reduction_plan.md
2025-09-28 10:10:01 +03:00

9.0 KiB

Gradle Build Semantic Noise Reduction Plan

Problem Analysis

Based on the analysis of the HomeboxLens Android project, the "semantic noise" in Gradle builds manifests as:

  1. Lint Errors and Warnings: 26 errors and 32 warnings causing build failures
  2. Missing Translations: Untranslated string resources preventing successful builds
  3. Verbose Build Output: Excessive logging from Gradle tasks and plugins
  4. Build Configuration Issues: Dependency resolution problems and module configuration errors

Current Build System Overview

  • Gradle Version: 8.13
  • Android Gradle Plugin: 8.12.3
  • Project Structure: Multi-module Android project with app, data, domain, and feature modules
  • Build Tools: Kotlin DSL, Hilt, Compose, Room, Retrofit

Proposed Solutions

1. Gradle Properties Optimization

Add the following properties to gradle.properties to reduce build verbosity:

# Reduce Gradle daemon memory usage
org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# Enable parallel execution
org.gradle.parallel=true

# Reduce console output noise
org.gradle.console=plain
org.gradle.logging.level=warn

# Disable welcome message
org.gradle.welcome=never

# Reduce lint verbosity
android.lint.abortOnError=false
android.lint.checkReleaseBuilds=false

2. Build Script Optimizations

Root build.gradle.kts Enhancements

// Add build scan for better error reporting
plugins {
    id("com.gradle.build-scan") version "3.12.1" apply false
}

// Configure build scan
buildScan {
    termsOfServiceUrl = "https://gradle.com/terms-of-service"
    termsOfServiceAgree = "yes"
    publishAlways()
}

Module-Level Lint Configuration

Add to each feature module's build.gradle.kts:

android {
    lint {
        // Reduce lint noise by ignoring certain checks
        disable += listOf(
            "UnusedResources",
            "ContentDescription",
            "HardcodedText"
        )

        // Only show errors, not warnings
        abortOnError = false
        checkReleaseBuilds = false

        // Custom lint config
        lintConfig = file("$rootDir/config/lint.xml")
    }
}

3. Wrapper Scripts for Error Handling

Smart Build Wrapper Script

Create scripts/smart-build.sh:

#!/bin/bash

# Smart Gradle Build Wrapper
# Reduces semantic noise and provides clear error reporting

set -e

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_ROOT"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Function to print colored output
print_status() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Pre-build checks
check_prerequisites() {
    print_status "Checking prerequisites..."

    # Check if Java is available
    if ! command -v java &> /dev/null; then
        print_error "Java is not installed or not in PATH"
        exit 1
    fi

    # Check Android SDK
    if [ -z "$ANDROID_HOME" ]; then
        print_warning "ANDROID_HOME not set, using default detection"
    fi
}

# Clean build artifacts
clean_build() {
    print_status "Cleaning previous build artifacts..."
    ./gradlew clean --quiet --console=plain
}

# Run build with reduced verbosity
run_build() {
    print_status "Starting Gradle build..."

    # Capture build output
    if ./gradlew build --quiet --console=plain --parallel 2>&1 | tee build.log; then
        print_status "Build completed successfully!"
        return 0
    else
        print_error "Build failed!"
        return 1
    fi
}

# Analyze build results
analyze_results() {
    if [ -f "build.log" ]; then
        # Extract key error information
        errors=$(grep -c "ERROR" build.log || true)
        warnings=$(grep -c "WARNING" build.log || true)

        if [ "$errors" -gt 0 ]; then
            print_error "Found $errors errors in build log"
            echo "Top errors:"
            grep "ERROR" build.log | head -5
        fi

        if [ "$warnings" -gt 0 ]; then
            print_warning "Found $warnings warnings in build log"
        fi

        # Check for specific common issues
        if grep -q "Unresolved reference" build.log; then
            print_error "Found unresolved references - check imports and dependencies"
        fi

        if grep -q "MissingTranslation" build.log; then
            print_error "Found missing translations - check string resources"
        fi
    fi
}

# Main execution
main() {
    echo "========================================"
    echo "  HomeboxLens Smart Build System"
    echo "========================================"

    check_prerequisites
    clean_build

    if run_build; then
        analyze_results
        print_status "Build successful!"
        exit 0
    else
        analyze_results
        print_error "Build failed. Check build.log for details."
        exit 1
    fi
}

# Run main function
main "$@"

Quick Fix Script

Create scripts/quick-fix.sh:

#!/bin/bash

# Quick Fix Script for Common Build Issues

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_ROOT"

# Fix missing translations by copying from default
fix_translations() {
    echo "Checking for missing translations..."

    # Find all string resource files
    find app/src/main/res -name "strings.xml" | while read -r file; do
        if [[ $file != *"values/strings.xml" ]]; then
            # For each non-default strings.xml, check if all strings from default are present
            default_strings="app/src/main/res/values/strings.xml"

            if [ -f "$default_strings" ]; then
                # Extract string names from default
                grep 'name="' "$default_strings" | sed 's/.*name="\([^"]*\)".*/\1/' | while read -r string_name; do
                    if ! grep -q "name=\"$string_name\"" "$file"; then
                        echo "Missing translation for '$string_name' in $file"
                        # Could automatically add placeholder translation here
                    fi
                done
            fi
        fi
    done
}

# Clean and rebuild
clean_rebuild() {
    echo "Performing clean rebuild..."
    ./gradlew clean build --parallel --quiet
}

# Main menu
echo "Quick Fix Options:"
echo "1. Fix missing translations"
echo "2. Clean rebuild"
echo "3. Run all fixes"

read -p "Choose option (1-3): " choice

case $choice in
    1) fix_translations ;;
    2) clean_rebuild ;;
    3)
        fix_translations
        clean_rebuild
        ;;
    *) echo "Invalid option" ;;
esac

4. Lint Configuration File

Create config/lint.xml:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Reduce noise by ignoring common non-critical issues -->
    <issue id="UnusedResources" severity="ignore" />
    <issue id="ContentDescription" severity="ignore" />
    <issue id="HardcodedText" severity="warning" />

    <!-- Treat translation issues as warnings instead of errors -->
    <issue id="MissingTranslation" severity="warning" />
    <issue id="ExtraTranslation" severity="warning" />

    <!-- Reduce verbosity for common warnings -->
    <issue id="ObsoleteLintCustomCheck" severity="ignore" />
    <issue id="IconMissingDensityFolder" severity="warning" />

    <!-- Custom path for baseline file -->
    <issue id="all">
        <ignore path="**/build/**" />
        <ignore path="**/generated/**" />
    </issue>
</lint>

5. CI/CD Integration

For automated builds, add to CI configuration:

# In .github/workflows/build.yml or similar
- name: Build with reduced noise
  run: |
    ./scripts/smart-build.sh
  env:
    GRADLE_OPTS: "-Dorg.gradle.console=plain -Dorg.gradle.logging.level=warn"

Implementation Steps

  1. Phase 1: Add Gradle properties optimizations
  2. Phase 2: Create wrapper scripts in scripts/ directory
  3. Phase 3: Add lint configuration file
  4. Phase 4: Update build.gradle.kts files with lint configurations
  5. Phase 5: Test and refine error handling

Expected Benefits

  • Reduced Build Time: Parallel execution and optimized memory usage
  • Clearer Error Messages: Focused output highlighting actual issues
  • Automated Fixes: Scripts to handle common problems automatically
  • Better Developer Experience: Less noise, faster feedback loops

Monitoring and Maintenance

  • Track build success rates before/after implementation
  • Monitor for new types of build noise
  • Update scripts as new Gradle versions are released
  • Regularly review and update lint configurations

Files to Create/Modify

  1. gradle.properties - Add optimization properties
  2. scripts/smart-build.sh - Main build wrapper
  3. scripts/quick-fix.sh - Common issue fixer
  4. config/lint.xml - Lint configuration
  5. build.gradle.kts (root) - Add build scan plugin
  6. Feature module build.gradle.kts files - Add lint configurations

This plan addresses the semantic noise issue by both reducing unnecessary output and providing better error handling and automated solutions for common build problems.