Skip to content
CAI
Software that uses CAICheck a score

googlemaps/android-maps-utils

56.8

Adequate · 28 September 2026

19.9k

lines of production code

Kotlin

with Java

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.