REFACTOR END

This commit is contained in:
2025-09-28 10:10:01 +03:00
parent 394e0040de
commit 9b914b2904
117 changed files with 3070 additions and 5447 deletions

View 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.