REFACTOR END
This commit is contained in:
342
gradle_build_noise_reduction_plan.md
Normal file
342
gradle_build_noise_reduction_plan.md
Normal file
@@ -0,0 +1,342 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user