Herramientas para analizar y visualizar dependencias entre módulos en proyectos Android multi-módulo.
- ✅ Análisis automático de dependencias leyendo archivos
build.gradle/build.gradle.kts - 🔍 Detección recursiva de todos los módulos sin importar la profundidad
- 📈 Visualización clara con diagramas PlantUML y Mermaid
- 🎨 Colores por tipo de módulo (common, gateway, features)
- 📊 Dos perspectivas: dependencias internas y llamadas externas
- 📝 Reportes detallados en texto plano
- Python 3.7+
- PlantUML (opcional, para generar imágenes)
git clone https://github.com/pfranccino/android-gradle-analyzer.git
cd android-gradle-analyzer# macOS
brew install plantuml
# Ubuntu/Debian
sudo apt install plantuml
# Windows (con Chocolatey)
choco install plantumlAnaliza las dependencias dentro de un módulo específico.
python3 gradle_analyzer.py <ruta_al_modulo>Ejemplo:
python3 gradle_analyzer.py /Users/tu-usuario/proyecto/paymentsSalida:
diagrams/gradle-dependencies.puml- Diagrama PlantUMLdiagrams/gradle-dependencies.mmd- Diagrama Mermaiddiagrams/gradle-report.txt- Reporte detallado
Detecta qué módulos externos llaman a tu módulo target.
python3 external_callers.py <ruta_proyecto> <nombre_modulo>Ejemplo:
python3 external_callers.py /Users/tu-usuario/proyecto paymentsSalida:
external-calls/payments-external-calls.pumlexternal-calls/payments-external-calls.mmdexternal-calls/payments-external-report.txt
# Convertir .puml a PNG
plantuml diagrams/gradle-dependencies.puml
# Convertir todos los archivos .puml
plantuml diagrams/*.puml
plantuml external-calls/*.puml
# Generar SVG (escalable)
plantuml -tsvg diagrams/gradle-dependencies.pumlMuestra cómo los módulos dentro de tu feature dependen unos de otros:
┌─────────────┐ ┌─────────────┐
│ home │ ───────→│ common │
└─────────────┘ └─────────────┘
│
↓
┌─────────────┐
│ dashboard │
└─────────────┘
Muestra qué módulos externos (app, otros features) usan tu feature:
┌─────────────┐
│ app │ 🟠
└─────────────┘
│
↓
┌─────────────────────┐
│ my-feature │
│ ┌──────────┐ │
│ │ home │ 🟢 │
│ └──────────┘ │
└─────────────────────┘
Edita gradle_analyzer.py, líneas ~195-197:
"skinparam nodesep 100", # Espacio horizontal (default: 60)
"skinparam ranksep 100", # Espacio vertical (default: 60)
"skinparam padding 20", # Espacio interno (default: 10)Valores sugeridos:
- Compacto: 60, 60, 10
- Balanceado: 100, 100, 20
- Espacioso: 150, 150, 30
Edita la función get_style() en gradle_analyzer.py:
def get_style(module):
if module == 'common':
return ' <<common>>'
elif 'payment' in module:
return ' <<payment>>' # Nuevo tipo
# ...Luego agrega el color:
"skinparam classBackgroundColor<<payment>> #FFCDD2",android-gradle-analyzer/
├── README.md ← Documentación principal
├── LICENSE ← Licencia MIT
├── .gitignore ← Archivos a ignorar
├── CONTRIBUTING.md ← Guía para contribuir
├── EXAMPLES.md ← Ejemplos de uso
├── setup.sh ← Script de configuración
├── gradle_analyzer.py ← Script principal 1
└── external_callers.py ← Script principal 2
- Usa
rglob()para buscar recursivamente todos los archivosbuild.gradle* - Convierte paths a nombres de módulos:
payments/home→payments:home - Mapea cada módulo encontrado
- Lee el contenido completo de cada
build.gradle - Aplica regex para encontrar patrones como:
implementation project(path: ':my-feature:common') api(project(":my-feature:gateway"))
- Normaliza los paths y almacena las relaciones
- Clasifica módulos por tipo (common, gateway, features)
- Aplica colores según la clasificación
- Genera código PlantUML/Mermaid con las dependencias
Las contribuciones son bienvenidas! Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -m 'Agrega nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
- ✅ Documentar arquitectura de proyectos multi-módulo
- ✅ Detectar dependencias circulares
- ✅ Identificar módulos altamente acoplados
- ✅ Auditar dependencias antes de refactorizar
- ✅ Onboarding de nuevos desarrolladores
- ✅ Revisiones de arquitectura
Causa: El módulo no tiene archivo build.gradle o build.gradle.kts
Solución: Verifica que el path sea correcto y que el módulo tenga un archivo gradle.
Solución: Aumenta los valores de espaciado:
"skinparam nodesep 150",
"skinparam ranksep 150",
"skinparam padding 30",Causa: El formato del gradle puede ser diferente
Solución: Verifica los patrones regex en _parse_gradle_file() y agrega el formato que usa tu proyecto.
MIT License - ver LICENSE para más detalles.
¿Preguntas o sugerencias? Abre un issue
⭐ Si este proyecto te fue útil, considera darle una estrella!