Browse Source
- Add validate_android_assets() function to build-android.sh - Check for missing source assets (icon.png, splash.png, splash_dark.png) - Verify Android resources exist (drawable/splash.png, mipmap/*/ic_launcher*.png) - Auto-regenerate missing resources using @capacitor/assets - Integrate validation into main build process with exit code 9 - Add npm run assets:validate:android for manual validation - Support --assets-only flag for asset-only operations - Create comprehensive documentation in doc/android-asset-validation.md Fixes build failures caused by missing drawable/splash and mipmap/ic_launcher resources. Prevents "Android resource linking failed" errors during Gradle builds. Resolves: Android build failures due to missing asset resourcesandroid-safe-area-insets
4 changed files with 425 additions and 2 deletions
@ -0,0 +1,238 @@ |
|||||
|
# Android Asset Validation System |
||||
|
|
||||
|
**Author**: Matthew Raymer |
||||
|
**Date**: 2025-08-22 |
||||
|
**Status**: 🎯 **ACTIVE** - Production Ready |
||||
|
|
||||
|
## Overview |
||||
|
|
||||
|
The Android Asset Validation System automatically detects and fixes missing Android resources before building, preventing common build failures related to missing splash screens and app icons. |
||||
|
|
||||
|
## Problem Solved |
||||
|
|
||||
|
Previously, Android builds would fail with errors like: |
||||
|
``` |
||||
|
error: resource drawable/splash (aka app.timesafari.app:drawable/splash) not found. |
||||
|
error: resource mipmap/ic_launcher (aka app.timesafari.app:mipmap/ic_launcher) not found. |
||||
|
``` |
||||
|
|
||||
|
This happened when: |
||||
|
- Source assets existed but weren't generated into Android resources |
||||
|
- Android resource directories were missing |
||||
|
- Asset generation tools weren't run before building |
||||
|
|
||||
|
## Solution |
||||
|
|
||||
|
### Enhanced Build Script Validation |
||||
|
|
||||
|
The `scripts/build-android.sh` script now includes comprehensive asset validation that: |
||||
|
|
||||
|
1. **Checks Source Assets**: Validates that required source files exist in `resources/` |
||||
|
2. **Checks Android Resources**: Verifies that generated Android resources exist |
||||
|
3. **Auto-Regenerates**: Automatically regenerates missing resources when detected |
||||
|
4. **Verifies Results**: Confirms that regeneration was successful |
||||
|
|
||||
|
### Validation Process |
||||
|
|
||||
|
```bash |
||||
|
# Validates and regenerates if needed |
||||
|
npm run assets:validate:android |
||||
|
|
||||
|
# Full build with validation |
||||
|
npm run build:android:studio |
||||
|
``` |
||||
|
|
||||
|
### What Gets Validated |
||||
|
|
||||
|
#### Source Assets (Required) |
||||
|
- `resources/icon.png` - App icon source |
||||
|
- `resources/splash.png` - Splash screen source |
||||
|
- `resources/splash_dark.png` - Dark mode splash source |
||||
|
|
||||
|
#### Android Resources (Generated) |
||||
|
- `android/app/src/main/res/drawable/splash.png` - Splash screen drawable |
||||
|
- `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities |
||||
|
- `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities |
||||
|
|
||||
|
### Density Levels Checked |
||||
|
- `mipmap-mdpi` (1x) |
||||
|
- `mipmap-hdpi` (1.5x) |
||||
|
- `mipmap-xhdpi` (2x) |
||||
|
- `mipmap-xxhdpi` (3x) |
||||
|
- `mipmap-xxxhdpi` (4x) |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
### Automatic Validation (Recommended) |
||||
|
The validation runs automatically during all Android builds: |
||||
|
|
||||
|
```bash |
||||
|
# Development build with validation |
||||
|
npm run build:android:studio |
||||
|
|
||||
|
# Production build with validation |
||||
|
npm run build:android:prod |
||||
|
|
||||
|
# Debug build with validation |
||||
|
npm run build:android:debug |
||||
|
``` |
||||
|
|
||||
|
### Manual Validation |
||||
|
Run validation only to check/fix assets: |
||||
|
|
||||
|
```bash |
||||
|
# Validate and regenerate if needed |
||||
|
npm run assets:validate:android |
||||
|
|
||||
|
# Alternative command |
||||
|
./scripts/build-android.sh --assets-only |
||||
|
``` |
||||
|
|
||||
|
### Validation Only (No Regeneration) |
||||
|
Check configuration without fixing: |
||||
|
|
||||
|
```bash |
||||
|
npm run assets:validate |
||||
|
``` |
||||
|
|
||||
|
## Error Handling |
||||
|
|
||||
|
### Missing Source Assets |
||||
|
If source assets are missing, the build fails with clear error messages: |
||||
|
|
||||
|
``` |
||||
|
[ERROR] Missing source assets: |
||||
|
[ERROR] - resources/icon.png |
||||
|
[ERROR] - resources/splash.png |
||||
|
[ERROR] Please ensure all required assets are present in the resources/ directory. |
||||
|
``` |
||||
|
|
||||
|
### Missing Generated Resources |
||||
|
If generated resources are missing, they're automatically regenerated: |
||||
|
|
||||
|
``` |
||||
|
[WARN] Missing Android resources detected: |
||||
|
[WARN] - drawable/splash.png |
||||
|
[WARN] - mipmap-mdpi/ic_launcher.png |
||||
|
[INFO] Regenerating Android assets... |
||||
|
[SUCCESS] Android assets regenerated successfully |
||||
|
``` |
||||
|
|
||||
|
### Generation Failure |
||||
|
If regeneration fails, helpful guidance is provided: |
||||
|
|
||||
|
``` |
||||
|
[ERROR] Failed to generate Android assets |
||||
|
[INFO] You may need to manually create the missing resources: |
||||
|
[INFO] - android/app/src/main/res/drawable/splash.png |
||||
|
[INFO] - android/app/src/main/res/mipmap-mdpi/ic_launcher.png |
||||
|
``` |
||||
|
|
||||
|
## Integration Points |
||||
|
|
||||
|
### Build Script Integration |
||||
|
The validation is integrated into the main build process: |
||||
|
|
||||
|
```bash |
||||
|
# In scripts/build-android.sh |
||||
|
validate_dependencies |
||||
|
validate_android_assets || { |
||||
|
log_error "Android asset validation failed. Please fix the issues above and try again." |
||||
|
exit 9 |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### NPM Scripts |
||||
|
New npm scripts for asset management: |
||||
|
|
||||
|
```json |
||||
|
{ |
||||
|
"assets:validate": "npx tsx scripts/assets-validator.ts", |
||||
|
"assets:validate:android": "./scripts/build-android.sh --assets-only", |
||||
|
"assets:clean": "rimraf android/app/src/main/res/mipmap-* ios/App/App/Assets.xcassets/**/AppIcon*.png ios/App/App/Assets.xcassets/**/Splash*.png || true" |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Benefits |
||||
|
|
||||
|
### For Developers |
||||
|
- **No More Build Failures**: Automatic detection and fixing of missing resources |
||||
|
- **Faster Development**: No need to manually run asset generation tools |
||||
|
- **Clear Error Messages**: Helpful guidance when issues occur |
||||
|
- **Consistent Results**: Same validation on all development machines |
||||
|
|
||||
|
### For CI/CD |
||||
|
- **Reliable Builds**: Consistent asset validation across environments |
||||
|
- **Early Detection**: Catches issues before they reach production |
||||
|
- **Automated Fixes**: Self-healing builds when possible |
||||
|
|
||||
|
### For Project Maintenance |
||||
|
- **Reduced Support**: Fewer "build doesn't work" issues |
||||
|
- **Documentation**: Clear requirements for required assets |
||||
|
- **Standardization**: Consistent asset structure across the project |
||||
|
|
||||
|
## Troubleshooting |
||||
|
|
||||
|
### Common Issues |
||||
|
|
||||
|
#### "No assets found in the asset path" |
||||
|
This occurs when the `assets/` directory is empty. The validation system automatically copies source assets and regenerates them. |
||||
|
|
||||
|
#### "Failed to generate Android assets" |
||||
|
Check that: |
||||
|
- Source assets exist in `resources/` |
||||
|
- `@capacitor/assets` is installed |
||||
|
- You have write permissions to the Android directories |
||||
|
|
||||
|
#### "Asset generation completed but some resources are still missing" |
||||
|
This indicates a problem with the asset generation tool. Try: |
||||
|
1. Running `npm install` to ensure dependencies are up to date |
||||
|
2. Manually running `npx @capacitor/assets generate` |
||||
|
3. Checking the asset generation logs for specific errors |
||||
|
|
||||
|
### Manual Recovery |
||||
|
If automatic regeneration fails, you can manually create the missing resources: |
||||
|
|
||||
|
```bash |
||||
|
# Create missing directories |
||||
|
mkdir -p android/app/src/main/res/drawable |
||||
|
mkdir -p android/app/src/main/res/mipmap-{mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi} |
||||
|
|
||||
|
# Copy source assets to assets directory |
||||
|
cp resources/icon.png assets/ |
||||
|
cp resources/splash.png assets/ |
||||
|
cp resources/splash_dark.png assets/ |
||||
|
|
||||
|
# Generate assets manually |
||||
|
npx @capacitor/assets generate |
||||
|
|
||||
|
# Clean up |
||||
|
rm assets/icon.png assets/splash.png assets/splash_dark.png |
||||
|
``` |
||||
|
|
||||
|
## Future Enhancements |
||||
|
|
||||
|
### Planned Improvements |
||||
|
- **iOS Asset Validation**: Extend validation to iOS assets |
||||
|
- **Asset Quality Checks**: Validate image dimensions and formats |
||||
|
- **Performance Optimization**: Cache validation results |
||||
|
- **CI/CD Integration**: Add validation to GitHub Actions |
||||
|
|
||||
|
### Configuration Options |
||||
|
- **Custom Asset Paths**: Support for different asset directory structures |
||||
|
- **Validation Rules**: Configurable validation requirements |
||||
|
- **Skip Options**: Ability to skip validation for specific scenarios |
||||
|
|
||||
|
## References |
||||
|
|
||||
|
- [Capacitor Assets Documentation](https://github.com/ionic-team/capacitor-assets) |
||||
|
- [Android Resource System](https://developer.android.com/guide/topics/resources/providing-resources) |
||||
|
- [Build Script Documentation](./build-android.sh) |
||||
|
- [Asset Configuration](./capacitor-assets.config.json) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**Status**: Active validation system |
||||
|
**Priority**: High |
||||
|
**Maintainer**: Development team |
||||
|
**Next Review**: 2025-09-22 |
Loading…
Reference in new issue