dotnet / dotnet/android

Support SDK channel selection (beta/canary/stable) in SdkManager

Open
#12,080 0 comments 0 reactions 0 assignees View on GitHub
android-tools enhancement needs-triage
Dominant language
C#
Stars
2.1k
Forks
579
Avg merge
1d 19h
Merged PRs (30d)
252

Description

## Summary

Add support for passing the `--channel=N` argument to underlying `sdkmanager` commands (`list`, `install`, `update`) so consumers can access beta, canary, and dev channel packages.

## Background

Google's new [`android` CLI](https://developer.android.com/tools/agents/android-cli) exposes `--beta` and `--canary` flags on `sdk list`, `sdk install`, and `sdk update`:

```bash
android sdk install --canary system-images/android-35/google_apis/x86_64
android sdk list --beta
android sdk update --canary platforms/android-35
```

The underlying `sdkmanager` already supports channels via `--channel=N`:
- `0` = Stable (default)
- `1` = Beta
- `2` = Dev
- `3` = Canary

Our `SdkManager` wrapper currently does not pass this argument through to any commands.

## Use Cases

1. **Preview API testing**: Developers building against pre-release Android API levels need access to beta/canary SDK components (platforms, system images, build-tools) before they hit the stable channel.
2. **CI pipelines**: Automated builds testing against upcoming Android versions need to install canary packages non-interactively.
3. **Agent workflows**: AI agents managing Android environments need to discover and install pre-release packages programmatically.
4. **Parity with Google tooling**: The `android` CLI sets the expectation that channel selection is a first-class SDK management feature.

## Proposed API Changes

```csharp
public enum SdkChannel
{
Stable = 0,
Beta = 1,
Dev = 2,
Canary = 3
}

// ListAsync with channel
Task<(List Installed, List Available)> ListAsync(
SdkChannel channel = SdkChannel.Stable,
CancellationToken cancellationToken = default);

// InstallAsync with channel
Task InstallAsync(IEnumerable packages,
bool acceptLicenses = true,
SdkChannel channel = SdkChannel.Stable,
CancellationToken cancellationToken = default);

// UpdateAsync with channel
Task UpdateAsync(
SdkChannel channel = SdkChannel.Stable,
CancellationToken cancellationToken = default);
```

The implementation would append `--channel=N` to the sdkmanager process arguments when channel != Stable.

## References

- [Android CLI `sdk install` docs](https://developer.android.com/tools/agents/android-cli#sdk-install)
- [Android CLI `sdk list` docs](https://developer.android.com/tools/agents/android-cli#sdk-list)
- [Android CLI `sdk update` docs](https://developer.android.com/tools/agents/android-cli#sdk-update)
- Downstream consumer: `dotnet/maui-labs` CLI (`maui android sdk` commands)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.