Skip to main content

A drop-in replacement for sdkmanager from the Android SDK that gets package metadata from a signed index generated from an append-only transparency log. Additionally, it uses SHA-256 checksums to verify packages before installing (Google's sdkmanager uses unsigned index and SHA1 checksums).

It is written in Python with minimal dependencies to make it easy to deploy anywhere and cover many use cases that Google's does not. This makes it really easy to package for distros like Debian or Homebrew, so users can just apt-get install sdkmanager and get verified Android SDK package installs based on the root that is already trusted in their system. Also, it is trivial to install a single arbitrary package without having to install the full requirements of Google's sdkmanager (e.g. Java 17, etc). A security researcher can install just build-tools;36.0.0. Or a translator can just install emulator and system-images;android-36;default;x86_64.

It implements the exact API of the sdkmanager command line. It only deviates from that API if it can be done while being 100% compatible. The project also attempts to maintain the same terminal output so it can be compatible with things that scrape sdkmanager output.

Architecture

This was designed around the idea that each SDK package contains all the relevant metadata in it, e.g. source.properties. So the checksums.json index file was designed just to be the index of those package files. This is how F-Droid and Debian indexes work. It looks like Google's sdkmanager was designed with that idea, but sadly, the maintainers of Google's sdkmanager have not been faithful to it. Some values like "display-name" are only available in the index files, e.g. repository2-3.xml. Even worse, the SDK packages contain something similar, Pkg.Desc, but it has strange conflicting values.

Also, since XML is a nightmare and this sdkmanager is written in Python, this sdkmanager was designed to use JSON as much as possible.

Key sources

The AOSP source code is hard to navigate for many reasons. Here are a couple of entry points for info relevant to this project:

Code Format

This project uses Black to automatically format all the Python code. It uses the version of Black that is in Debian/stable. To format the code, run:

black --skip-string-normalization *.py

Metadata

Release files for sdkmanager 0.7.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sdkmanager 0.7.1
File Size Uploaded
sdkmanager-0.7.1.tar.gz 274.5 kB Details

Release files / sdkmanager-0.7.1.tar.gz

Download URL sdkmanager-0.7.1.tar.gz
Size 274.5 kB
Tags Source
SHA-256 checksum
How to use checksums
49063acd70f37826ae2e88a78fe774d394b0a56cbc538649f40369834e356c67
BLAKE2b-256 checksum
How to use checksums
7a44094af0982afc46ae2dd5e749c10ca7eea7ed6c439e2a80bd2b8c63158047
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

0.7.1 This release

1 release file

0.7.0

1 release file

0.6.11

1 release file

0.6.10

1 release file

0.6.9

1 release file

0.6.8

1 release file

0.6.7

1 release file

0.6.6

1 release file

0.6.5

1 release file

0.6.4

1 release file

0.6.3

1 release file

0.6.2

1 release file

0.6.1

1 release file

0.6.0

1 release file

0.5.4

1 release file

0.5.3

1 release file

0.5.2

1 release file

0.5.1

1 release file

0.5

1 release file

0.4.1

1 release file

0.4

1 release file

0.3

1 release file

0.2

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page