googlemaps/android-maps-utils
56.8
Adequate · 28 September 2026
19.9k
lines of production code
Kotlin
with Java
2
measurements over time
What this system is
This system is the Maps SDK for Android Utility Library, a modular Kotlin codebase providing geospatial visualization and map interaction utilities. It handles data rendering for KML, GeoJSON, and GPX formats, manages map object collections, and implements clustering and heatmap algorithms. The library also offers UI enhancements such as marker animations and custom info windows, alongside tools for visual regression testing and emulator management.
How it got here
2013–2019 — Kotlin modular rewrite and build modernization
8 changes.
The project underwent a comprehensive rewrite to Kotlin, introducing a multi-module architecture with dedicated managers for map objects and new utility classes. This period also focused on modernizing the build system by migrating to Gradle Kotlin DSL and version catalogs, while establishing foundational repository structures and CI tooling.
2020–2026 — Kotlin migration and module modernization
9 changes.
The project underwent a comprehensive rewrite of core modules, including clustering, heatmaps, and UI utilities, migrating them from Java to Kotlin with modern APIs and improved interoperability. A unified data module was introduced to standardize parsing and rendering of geospatial formats, while the build infrastructure was updated to use the vanniktech Maven publish plugin for streamlined artifact distribution. Additionally, new capabilities such as Gemini-powered visual testing and automated coverage tracking were integrated to enhance development workflows and code quality.
Features
Add unit test coverage history tracking
The project now records and displays unit test coverage history. A new \coverage/COVERAGE.md\ file provides a summary of current line and branch coverage for modules including clustering, data, heatmaps, library, and ui, while \coverage/history.csv\ stores the raw data for each merged commit, enabling visibility into how test coverage trends over time.
coverage · high confidence
Added Android emulator readiness check script
A new shell script, tools/android-wait-for-emulator.sh, has been added to the project. This utility allows developers and CI pipelines to reliably wait for an Android emulator to finish booting before executing subsequent commands, polling the emulator's boot animation status with a configurable timeout to prevent indefinite hangs.
tools · high confidence
Introduce Gemini-powered visual testing helper
The visual-testing module now includes a new GeminiVisualTestHelper class that enables natural language-driven UI automation. By integrating with the Gemini API, this helper can analyze the current Android UI hierarchy and execute actions such as clicks, long clicks, and text input based on user prompts. This capability is supported by the addition of an AndroidManifest.xml, ProGuard rules, and a placeholder test to establish the module's structure.
visual-testing · high confidence
Introduce unified data module with legacy bridge classes
The data module now provides a new platform-agnostic architecture for parsing and rendering KML, GeoJSON, and GPX, featuring a clean separation of parsers, mappers, and a MapViewRenderer that supports advanced markers and async icon loading. To ensure backward compatibility, the module also includes a set of deprecated legacy bridge classes (such as GeoJsonLayer, Feature, and Style) that wrap the new renderer and model, allowing existing code to continue functioning while encouraging migration to the new unified API.
data · high confidence
Library rewritten in Kotlin with new collection managers and Street View support
The library has been rewritten in Kotlin, introducing a new object-oriented collection management system (MarkerManager, PolylineManager, PolygonManager, CircleManager, GroundOverlayManager) that simplifies adding and tracking map objects. New utility classes (MathUtil, PolyUtil, SphericalUtil) provide geometric calculations, while StreetViewUtil and StreetViewJavaHelper add support for fetching Street View data, including a Java-compatible callback interface. The AndroidManifest now registers an androidx.startup.Initializer for attribution tracking, and ProGuard rules are standardized.
library · high confidence
Repository scaffolding for v5.2.0 modular Kotlin rewrite
This change establishes the foundational structure for the Maps SDK for Android Utility Library v5.2.0, introducing a multi-module architecture (core, clustering, data, heatmaps, ui) and a complete rewrite in Kotlin. It adds essential project configuration files including \.editorconfig\ for consistent code formatting, \.gitignore\ and \.geminiignore\ for build artifacts, and \AGENTS.md\ to guide AI coding agents. The entry also includes the \MIGRATION.md\ guide detailing breaking changes for v4.x to v5.x upgrades, such as the shift to Kotlin property syntax and modular imports, alongside standard repository documentation like \CONTRIBUTING.md\, \CODE\_OF\_CONDUCT.md\, and \SECURITY.md\.
(repo-wide) · high confidence
Rewritten Android Maps UI utilities in Kotlin
The UI module has been rewritten in Kotlin, introducing new classes for marker animations (AnimationUtil), custom info-window icons (IconGenerator), and layout rotation (RotationLayout). This change adds support for animating marker positions, generating styled bitmap icons with text or custom views, and rotating UI content, along with the necessary Android resource layouts and styles to support these features.
ui · high confidence
Removals
Removal of SphericalUtil class
The \SphericalUtil\ class, which provided static methods for geographic calculations such as computing headings, distances, areas, and offsets between \LatLng\ points, has been removed from the codebase. Users relying on these utility functions for spherical geometry operations will no longer have access to this implementation.
src/com · high confidence
Behavioural changes
Android module configuration and manifest updates
The collections and maps-utils modules now include explicit AndroidManifest.xml files and ProGuard configuration files (consumer-rules.pro and proguard-rules.pro). The maps-utils manifest defines the package com.google.maps.android.utils, while the collections module includes a minimal manifest. These changes ensure proper Android packaging and allow for configurable code shrinking and obfuscation rules for these utility libraries.
collections, maps-utils · high confidence
Clustering module rewritten in Kotlin with new algorithms and open API
The clustering module has been rewritten in Kotlin, introducing new clustering algorithms such as CentroidNonHierarchicalDistanceBasedAlgorithm, GridBasedAlgorithm, and ContinuousZoomEuclideanCentroidAlgorithm, alongside a new ScreenBasedAlgorithm interface for view-based clustering. The ClusterManager class is now open and uses JvmSuppressWildcards to improve Java interoperability, and the module includes a PreCachingAlgorithmDecorator for performance optimization. This change also adds a new AndroidManifest.xml and ProGuard rules, and updates the ClusterItem interface to include zIndex support.
clustering · high confidence
Demo app configuration updates for Maps SDK v3 and build standardization
The demo application now includes a dedicated .gitignore file to exclude build artifacts and secure properties, a V3\_FILE\_HEADER to clarify that generated code originates from the gms source directory, and updated ProGuard rules. Specifically, the ProGuard configuration now preserves the com.google.android.libraries.maps package to prevent crashes in minified release builds when using Maps SDK v3.1 beta, addressing a known issue tracked in Google's issue tracker.
demo · high confidence
Heatmaps module rewritten in Kotlin with new API and tests
The heatmaps module has been migrated from Java to Kotlin, introducing a new \HeatmapTileProvider\ built via a fluent \Builder\ pattern that accepts weighted or unweighted data, radius, gradient, and opacity. The \Gradient\ class now generates color maps by interpolating HSV values, and \WeightedLatLng\ serves as the core data point structure. To support this rewrite, comprehensive Robolectric tests were added for the gradient interpolation, tile provider construction and validation, and utility functions like kernel generation and convolution.
heatmaps · high confidence
Lint warning for methods that may override Maps SDK behavior
A new custom lint rule has been added to the \lint-checks\ module that warns when code calls \GoogleMap\ methods such as \setInfoWindowAdapter\, \setOnMarkerClickListener\, \setOnMarkerDragListener\, \setOnInfoWindowClickListener\, or \setOnInfoWindowLongClickListener\. These warnings alert developers that using these methods directly may override behaviors set by the Maps SDK for Android Utility Library (e.g., clustering, GeoJson, or KML features). The rule guides users to use alternative APIs, such as setting adapters on \MarkerManager.Collection\ objects, to ensure intended functionality is preserved.
lint-checks · high confidence
Migrate publishing infrastructure to vanniktech Maven publish plugin
The build-logic/convention module now uses the vanniktech Maven publish plugin for publishing artifacts to Maven Central. This change introduces new convention plugins (BomPublishingConventionPlugin and PublishingConventionPlugin) that configure the publishing extension, handle signing based on available keys, and set up artifact coordinates and POM metadata. The PublishingConventionPlugin also integrates Kover for test coverage reporting and Dokka for documentation generation, replacing previous publishing and coverage configurations.
build-logic/convention · high confidence
Test coverage
AI-assisted visual regression testing for demo app
The demo app now includes a suite of Android instrumented tests that use Google Gemini to verify map rendering. These tests capture screenshots of features like clustering, KML overlays, and z-index layering, then use natural language prompts to confirm visual correctness, falling back to AI verification when static golden images do not match.
demo/src · high confidence
Dependencies
Migrate build system to Gradle Kotlin DSL and version catalogs
The project build has been rewritten from Groovy to Kotlin DSL (build.gradle.kts) and now uses a centralized version catalog (gradle/libs.versions.toml) to manage dependencies. This change introduces a new build-logic convention plugin module to standardize configuration across modules, establishes a BOM (Bill of Materials) module to enforce consistent dependency versions, and sets the project minimum SDK to 23 and Java/Kotlin toolchain to 17. The demo app now requires a secrets.properties file for API keys and includes a new 'navigation' product flavor.
(dependencies) · high confidence
Updated Gradle wrapper to version 9.7.1
The project's Gradle wrapper has been updated to version 9.7.1. This ensures that builds use a consistent, specific version of the Gradle build tool, improving reproducibility and potentially bringing in new features or performance improvements from the 9.7.1 release.
gradle · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 57 → 57 (-0.0)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 92 → 91 (-0.8)
- Architecture 100 → 82 (-17.7)
- Maturity 61 → 61 (-0.2)
- Readiness 83 → 84 (+1.2)
- Security 68 → 69 (+0.3)
- Accessibility 41 → 41 (+0.0)
- Performance 100 (new)
Resolved (3)
- Duplicated block (11 lines × 2) (visual-testing/src/main/java/com/google/maps/android/visualtesting/GeminiVisualTestHelper.kt)
- High: security finding (details withheld)
- Off-boarding risk: anonymized user #1
New (33)
- Documentation: no architecture or design documentation (data/README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no project overview (README.md)
- Duplicated block (10 lines × 2) (visual-testing/src/main/java/com/google/maps/android/visualtesting/GeminiVisualTestHelper.kt)
- Duplicated block (11 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/CustomMarkerClusteringDemoActivity.java)
- Duplicated block (11 lines × 3) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (12 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/BigClusteringDemoActivity.java)
- Duplicated block (12 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ZIndexDemoActivity.kt)
- Duplicated block (13 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (13–14 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (14 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/StreetViewDemoJavaActivity.java)
- Duplicated block (16 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/PolySimplifyDemoActivity.java)
- Duplicated block (17–18 lines × 3) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (20 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (5 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/CustomAdvancedMarkerClusteringDemoActivity.java)
- Duplicated block (7 lines × 3) (demo/src/main/java/com/google/maps/android/utils/demo/BigClusteringDemoActivity.java)
- Duplicated block (7–8 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Duplicated block (9 lines × 2) (demo/src/main/java/com/google/maps/android/utils/demo/ClusteringDiffDemoActivity.java)
- Edited copy of a member (28 corresponding lines) (demo/src/main/java/com/google/maps/android/utils/demo/CustomAdvancedMarkerClusteringDemoActivity.java)
- Low cohesion: Builder (LCOM4 5) (heatmaps/src/main/java/com/google/maps/android/heatmaps/HeatmapTileProvider.kt)
- …and 13 more
Changes since last survey
- 25 commits — 24 feature/other, 1 fixes
By area
- coverage/COVERAGE.md — 10 commits
- gradle/libs.versions.toml — 5 commits
- .github/scripts — 2 commits
- .github/workflows — 2 commits
- data/src — 2 commits
- (root) — 1 commit
- .github/dependabot.yml — 1 commit
- demo/src — 1 commit
- gradle/wrapper — 1 commit
Notable commits
- fix: fix(data): enforce decompression limit and reject payload on KMZ directory entries (#1792)
- change: build(deps): bump actions/setup-java from 5.7.0 to 6.0.1 (#1781)
- change: build(deps): bump androidx.compose:compose-bom (#1783)
- change: build(deps): bump com.google.android.libraries.navigation:navigation (#1762)
- change: build(deps): bump github/codeql-action/upload-sarif (#1780)
- change: build(deps): bump gradle-wrapper from 9.6.1 to 9.7.1 (#1763)
- change: build(deps): bump io.github.pdvrieze.xmlutil:serialization (#1768)
- change: build(deps): bump kotlin from 2.4.10 to 2.4.20 (#1782)
- change: build(deps): bump org.robolectric:robolectric (#1791)
- change: chore(ci): harden Gemini issue triage against prompt injection (#1772)
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- change: chore: update coverage history [skip ci]
- …and 5 more
Architecture
- Containers 0 added · 0 removed · contexts 5 added · 0 removed · edges 5 added · 0 removed
Added bounded contexts (5)
- clustering
- data
- demo
- heatmaps
- library
Added dependency edges (5)
- clustering → library
- data → library
- demo → clustering
- demo → data
- heatmaps → clustering
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
googlemaps/android-maps-utils was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 82faf3f732909b17337a29e0f0484ea07a5ddf7b — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-2d9048c36d26.