Analiza dependencias y mide la sanidad de proyectos Android multi-módulo.
Project description
📊 Android Gradle Dependency Analyzer
Herramientas para analizar, visualizar y medir la salud de las dependencias entre módulos en proyectos Android multi-módulo.
👀 En 30 segundos
Todo lo de abajo es salida real, no maquetas: se reproduce clonando el repo y corriendo el comando contra los fixtures incluidos en tests/fixtures/leaf_coupling.
$ gradle-analyzer tests/fixtures/leaf_coupling
🚀 Analizador de Dependencias via Gradle
======================================================================
📁 Escaneando módulos en: .../tests/fixtures/leaf_coupling
• app • cart • checkout • core • database
• legacy • model • network • payments • util
✓ 10 módulos encontrados
🔍 Analizando dependencias (motor: static)...
✓ app: 3 dependencia(s)
✓ payments: 5 dependencia(s)
○ core: sin dependencias internas
...
✓ Análisis completado: 15 dependencias detectadas
📊 Generando archivos...
✓ PlantUML: diagrams/gradle-dependencies.puml
✓ Mermaid: diagrams/gradle-dependencies.mmd
✓ Reporte: diagrams/gradle-report.txt
El Mermaid que genera lo renderiza GitHub directamente — este es el grafo real de ese proyecto de ejemplo:
graph TD
app["📦 app"]
cart["📦 cart"]
checkout["📦 checkout"]
core["🔧 core"]
database["💾 database"]
legacy["📦 legacy"]
model["📦 model"]
network["🌐 network"]
payments["📦 payments"]
util["📦 util"]
app --> cart
app --> checkout
app --> core
cart --> payments
checkout --> payments
database --> core
legacy --> app
model --> core
network --> core
payments --> core
payments --> database
payments --> model
payments --> network
payments --> util
util --> core
classDef commonStyle fill:#FFF9C4,stroke:#F57F17,stroke-width:2px
classDef gatewayStyle fill:#E1F5FE,stroke:#0277BD,stroke-width:2px
class core commonStyle
class network gatewayStyle
⚡ Quick start
# Recomendado · instalación global con pipx desde PyPI
pipx install android-gradle-analyzer
# Con parser AST para .gradle.kts (maneja multilínea y comentarios correctamente)
pipx install "android-gradle-analyzer[kts]"
# Última versión de desarrollo (sin esperar al release en PyPI)
pipx install git+https://github.com/pfranccino/android-gradle-analyzer.git
# Ver versión instalada
gradle-analyzer-menu --version
# → android-gradle-analyzer 1.4.0 · by pfranccino · https://pfranccino.dev
Los cuatro análisis, cada uno con su CLI:
# 1 · Dependencias internas de un módulo
gradle-analyzer /ruta/a/tu/proyecto/payments
# 2 · Quién llama a un módulo desde fuera (refactors seguros)
gradle-externals /ruta/a/tu/proyecto payments
# 3 · Score de sanidad (Ca/Ce/I, ciclos, anti-patrones)
gradle-sanity /ruta/a/tu/proyecto/payments
# 4 · Impacto de cambios — qué se rompe si cambio X
gradle-impact /ruta/a/tu/proyecto payments:common
Tip: todos aceptan
.si ya estás dentro del módulo,--quietpara silenciar el progreso y--jsonpara salida parseable.
Alternativa · clonar el repo (para desarrollo o contribuir)
git clone https://github.com/pfranccino/android-gradle-analyzer.git
cd android-gradle-analyzer
pip install -e ".[kts,yaml]"
gradle-analyzer tests/fixtures/leaf_coupling
🎛️ Modo interactivo
Un único comando con dashboard, autodetección de módulos, navegación con teclado y export a HTML / Markdown / ZIP.
gradle-analyzer-menu
Modo no-interactivo (CI/scripts):
gradle-analyzer-menu --quick sanity /ruta/proyecto
gradle-analyzer-menu --version
✨ Qué hace
🔍 Dependencias internasLee Salida · PlantUML · Mermaid · reporte de texto |
🌐 Llamadas externasDetecta qué módulos de fuera de tu feature lo están consumiendo. Útil para refactors seguros. Salida · PlantUML · Mermaid · reporte de texto |
🏥 Sanidad arquitectónicaMétricas Ca/Ce/I, detección de ciclos, violaciones SDP y score 0–100 con explicación. Salida · reporte detallado · JSON |
💥 Impacto de cambiosDado un módulo, muestra qué otros módulos se romperían si cambia (BFS sobre el grafo invertido de dependencias). Salida · PlantUML · Mermaid · reporte de texto |
Características destacadas
- ✅ Detección recursiva sin importar la profundidad de los módulos
- 📋
settings.gradle(.kts)como fuente de verdad para los módulos (si existe) - 🎯 Type-safe project accessors (
projects.foo.barBaz, Gradle 7+) junto al formato clásicoproject(":foo:bar") - 🌳 Parser AST para
.kts(opcional) — usa tree-sitter-kotlin para manejar dependencias multilínea y comentadas - 🎯 Motor dinámico vía Gradle (opcional,
--engine dynamic) — lee la verdad que Gradle resuelve: precisión total con Version Catalogs, variables y convention plugins - ⚠️ Detección automática de ciclos y lógica compartida mal ubicada
- 🔭 Scopes soportados:
implementation,api,kapt,compileOnly,testImplementation, y más - 🤫
--quiet· 📄--jsonen todos los CLIs · 🚦--fail-on-cycle/--fail-on-score-below Nengradle-sanitypara CI
🧠 Motor de extracción: estático vs dinámico
Todos los análisis aceptan --engine static|dynamic|auto (default static).
| static (default) | dynamic | auto | |
|---|---|---|---|
| Cómo obtiene las dependencias | Parsea build.gradle(.kts) con regex/tree-sitter |
Ejecuta gradlew -I <init script> y lee lo que Gradle resuelve |
Dynamic si hay gradlew y configura; si no, static |
| Precisión | Alta para project(...) y accessors |
Total (Version Catalogs, variables, convention plugins) | La mejor disponible |
| Requisitos | Ninguno (Python puro) | JDK + wrapper de Gradle en la raíz | — |
| Seguridad | Solo lee texto (seguro en repos no confiables) | Ejecuta el build del proyecto | Solo ejecuta si hay wrapper |
⚠️ Seguridad:
--engine dynamicejecuta el build del proyecto analizado. Úsalo solo sobre repos de confianza. El motorstatic(default) nunca ejecuta nada: solo lee texto.
Detalle completo, garantías y ejemplos en Motor estático vs dinámico (wiki).
🚦 Integración CI/CD
gradle-sanity puede fallar la build si detecta problemas:
# Falla si hay ciclos, o si el score cae por debajo de 70
gradle-sanity /ruta/proyecto --fail-on-cycle --fail-on-score-below 70 --quiet
# Salida JSON para parsear en el pipeline
gradle-sanity /ruta/proyecto --json > sanity-report.json
Workflow listo para copiar en Integración CI (wiki) y en examples/github-actions-dependency-health.yml.
📚 Documentación
El detalle vive en el Wiki, con salida real en cada página:
| Página | Contenido |
|---|---|
| Comandos | Los 4 CLIs: flags, archivos generados y salida real de cada uno |
| Métricas de sanidad | Ca/Ce/I, qué detecta el score y las referencias (Uncle Bob, ADP/SDP/SAP) |
| Motor estático vs dinámico | Cuándo usar cada uno y sus garantías |
| Configuración | analyzer_config.json, analyzer.yml y el detector de acoplamiento |
| Integración CI | Gates, JSON y GitHub Actions |
| Cómo funciona | Detección de módulos, extracción y generación de diagramas |
| Troubleshooting | Problemas comunes y soluciones |
¿Buscas recetas end-to-end (auditoría, onboarding, refactor seguro)? → EXAMPLES.md.
🤝 Contribuir
Las contribuciones son bienvenidas. Forkea, crea una rama, commitea y abre un PR. Ver CONTRIBUTING.md para detalles.
📄 Licencia
MIT — ver LICENSE.
made with care · pfranccino.dev
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file android_gradle_analyzer-1.6.0.tar.gz.
File metadata
- Download URL: android_gradle_analyzer-1.6.0.tar.gz
- Upload date:
- Size: 82.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8ba51344543ab73654e251009cf9829ffac6dd857a0a9d030e20e45c2e0d086
|
|
| MD5 |
f95a4fcf9a4d8bcf1b3337f9c8fefee7
|
|
| BLAKE2b-256 |
6692e1fb0d4d975aeb1aeba8813f509463e62da9923257bd4c94874fcc18b19f
|
Provenance
The following attestation bundles were made for android_gradle_analyzer-1.6.0.tar.gz:
Publisher:
release.yml on pfranccino/android-gradle-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
android_gradle_analyzer-1.6.0.tar.gz -
Subject digest:
e8ba51344543ab73654e251009cf9829ffac6dd857a0a9d030e20e45c2e0d086 - Sigstore transparency entry: 1756395136
- Sigstore integration time:
-
Permalink:
pfranccino/android-gradle-analyzer@da2377700aae6a301106edcc00e79fbd34b7ad58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pfranccino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da2377700aae6a301106edcc00e79fbd34b7ad58 -
Trigger Event:
push
-
Statement type:
File details
Details for the file android_gradle_analyzer-1.6.0-py3-none-any.whl.
File metadata
- Download URL: android_gradle_analyzer-1.6.0-py3-none-any.whl
- Upload date:
- Size: 61.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f22d53c34b1d07e2e702b688137913d8c4656fc11c86cdbfaa266fdf65d2e93
|
|
| MD5 |
1c4e9f4bab59b59dd2ab1e23a9b51955
|
|
| BLAKE2b-256 |
64032e4a8fc8f27eae28abfcdcc30d506b3ad8819e3e282b724e59214399fc06
|
Provenance
The following attestation bundles were made for android_gradle_analyzer-1.6.0-py3-none-any.whl:
Publisher:
release.yml on pfranccino/android-gradle-analyzer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
android_gradle_analyzer-1.6.0-py3-none-any.whl -
Subject digest:
2f22d53c34b1d07e2e702b688137913d8c4656fc11c86cdbfaa266fdf65d2e93 - Sigstore transparency entry: 1756395167
- Sigstore integration time:
-
Permalink:
pfranccino/android-gradle-analyzer@da2377700aae6a301106edcc00e79fbd34b7ad58 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/pfranccino
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@da2377700aae6a301106edcc00e79fbd34b7ad58 -
Trigger Event:
push
-
Statement type: