342 lines
9.0 KiB
Markdown
342 lines
9.0 KiB
Markdown
# 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:
|
|
|
|
```properties
|
|
# 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
|
|
|
|
```kotlin
|
|
// 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:
|
|
|
|
```kotlin
|
|
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`:
|
|
|
|
```bash
|
|
#!/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`:
|
|
|
|
```bash
|
|
#!/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
|
|
<?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:
|
|
|
|
```yaml
|
|
# 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. |