Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
049e660
fix: pointer_index always returns 0
sannyun May 23, 2023
924e540
Merge pull request #84 from yunsash/pointer_index_fix
rib May 24, 2023
3843a7c
Call Activity.finish() when android_main returns
rib Apr 27, 2023
4a4efd8
README: Add badges to CI, crates.io, docs.rs and show the MSRV
MarijnS95 Jun 16, 2023
120d2f6
Merge pull request #86 from rust-mobile/readme-badges
rib Jun 16, 2023
79e03e0
Merge pull request #81 from rib/finish-activity
rib Jun 19, 2023
ca0d2eb
cargo: Fix `rust_version` -> `rust-version` property typo
MarijnS95 Jun 23, 2023
1ad3abd
Merge pull request #87 from rust-mobile/rust-version
rib Jun 25, 2023
cd81420
Update agdk-mainloop
rib Jun 25, 2023
2300355
Update na-mainloop
rib Jun 25, 2023
9a713c8
Release 0.4.2
rib Jun 25, 2023
0f00a58
Merge pull request #90 from rust-mobile/release-0.4.2
rib Jun 27, 2023
a9e91f4
Fix deadlock on activity onDestroy
sagebind Jul 18, 2023
a84a7b5
Merge pull request #94 from sagebind/fix-deadlock-on-ondestroy
rib Jul 30, 2023
ab2606a
build.rs: emit rerun-if-changed lines for compiled C/C++ code
rib Jul 22, 2023
c10a2fb
GameActivity PATH: fix deadlocks in java callbacks after app destroyed
rib Jul 28, 2023
8a21219
Merge pull request #98 from rust-mobile/rib/pr/fix-game-activity-dead…
rib Jul 30, 2023
bb97af1
Release 0.4.3
rib Jul 28, 2023
1a8a92b
Merge pull request #99 from rust-mobile/release-0.4.3
rib Jul 30, 2023
c471fdf
Import unmodified GameActivity 2.0.2 Source
lexi-the-cute Jun 26, 2023
d6345ab
GameActivity PATCH: rename C symbols that need export
rib Jul 22, 2023
202ab4c
GameActivity PATCH: Rename android_main _rust_glue_entry
rib Jul 22, 2023
3e3fb84
GameActivity PATCH: remove unused variable
rib May 25, 2022
d2d1815
GameActivity PATCH: Support InputAvailable events
rib Aug 13, 2022
2a2f276
GameActivity PATCH: fix deadlocks in java callbacks after app destroyed
rib Jul 28, 2023
cc3983c
generate-bindings: add comment about installing bindgen-cli
rib Jul 22, 2023
b09526a
game-activity: update ffi bindings for 2.0.2 via ./generate-bindings.sh
rib Jul 22, 2023
a604c0a
game-activity: Integrate GameActivity 2.0.2
rib Jul 22, 2023
9bb5f9c
Merge pull request #88 from lexi-the-cute/main
rib Jul 30, 2023
c22a545
game-activity: Remove Deref implementations for Key/MotionEvent types
rib Jul 23, 2023
96497f9
Merge pull request #100 from rust-mobile/rib/pr/game-activity-no-inpu…
rib Jul 30, 2023
41f30c3
Expose TextEvent and input method state
rib Sep 12, 2022
741e633
Merge pull request #24 from rust-mobile/ime-support
rib Aug 1, 2023
74f510a
Bump `bitflags` to v2
daxpedda May 28, 2023
ed2dc53
Merge pull request #85 from daxpedda/bitflags-v2
rib Aug 3, 2023
66cfc68
Bump MSRV to 1.68
rib Aug 3, 2023
c0a9e20
Merge pull request #103 from rust-mobile/rib/pr/msrv-1.68
rib Aug 3, 2023
1abb02c
Revert 'Bump MSRV to 1.68'
rib Aug 4, 2023
3464ba2
Merge pull request #104 from rust-mobile/rib/pr/revert-msrv-bump-for-…
rib Aug 7, 2023
d0f10a0
agdk-mainloop: update for GameActivity 2.0.2
rib Aug 4, 2023
6f72dde
Merge pull request #105 from rust-mobile/rib/pr/agdk-mainloop-update-…
rib Aug 7, 2023
af331e3
Rework input_events API and expose KeyCharacterMap bindings
rib Jun 25, 2023
b4cf0ee
Merge pull request #102 from rust-mobile/rib/pr/input-api-rework-with…
rib Aug 7, 2023
6b33074
GameActivity PATCH: Don't read unicode via getUnicodeChar
rib Aug 3, 2023
535994f
Merge pull request #106 from rust-mobile/rib/pr/game-activity-disable…
rib Aug 7, 2023
1b33341
Consolidate input types to avoid portability hazards
rib Aug 7, 2023
e2f6942
build(deps): update num_enum requirement from 0.6 to 0.7
dependabot[bot] Aug 14, 2023
379f064
Merge pull request #107 from rust-mobile/rib/pr/consolidate-more-inpu…
rib Aug 15, 2023
242285b
Merge pull request #108 from rust-mobile/dependabot/cargo/num_enum-0.7
rib Aug 15, 2023
35fe600
native-activity: don't treat missing input queue as error
rib Aug 15, 2023
2654c96
Merge pull request #110 from rust-mobile/rib/pr/no-missing-input-queu…
rib Aug 15, 2023
2a61f84
Remove examples/agdk-mainloop/.idea
rib Aug 15, 2023
e91176c
CI: assume NDK + Java in official Ubuntu images
rib Aug 15, 2023
c9f57a7
Release 0.5.0-beta.0
rib Aug 15, 2023
23a8570
Merge pull request #112 from rust-mobile/release-0.5.0-beta.0
rib Aug 15, 2023
499d095
Upgrade to `ndk-sys 0.5.0-beta.0`, `ndk-0.8.0 beta.0`
MarijnS95 Jun 23, 2023
47a073f
Merge pull request #113 from MarijnS95/ndk-breaking-prep
rib Aug 15, 2023
75e9e86
Release 0.5.0-beta.1
rib Aug 15, 2023
7ea440d
Merge pull request #114 from rust-mobile/release-0.5.0-beta.1
rib Aug 15, 2023
4f6d7d6
CHANGELOG fixups
rib Aug 15, 2023
865cc6a
Merge pull request #115 from rust-mobile/rib/pr/changelog-fixups
rib Aug 15, 2023
942053d
Bump MSRV to 1.68
rib Aug 3, 2023
83cdb56
Merge pull request #123 from rust-mobile/rib/pr/msrv-1.68-v2
rib Sep 25, 2023
0eefd62
build(deps): bump actions/checkout from 3 to 4
dependabot[bot] Sep 25, 2023
9930b9b
Avoid exposing Pointer and PointersIter from ndk
fornwall Sep 26, 2023
f2132c4
Enable CI on all branches
fornwall Sep 26, 2023
733fabf
Merge pull request #124 from fornwall/enable-ci-on-all-branches
rib Sep 26, 2023
219a14b
Merge pull request #122 from fornwall/pointer-away-from-ndk
rib Sep 26, 2023
3d5e479
Merge pull request #118 from rust-mobile/dependabot/github_actions/ac…
MarijnS95 Oct 4, 2023
2ecaab9
Upgrade to stable `ndk 0.8` and `ndk-sys 0.5` releases
MarijnS95 Oct 14, 2023
a291e37
Merge pull request #128 from rust-mobile/ndk-stable
rib Oct 15, 2023
ce4413b
Close `logpipe` input file descriptor after `dup2()`
MarijnS95 Aug 15, 2023
969ba5a
Improve forwards compatibility of input API
rib Oct 15, 2023
a92237f
Add `non_exhaustive` to input enums
rib Oct 16, 2023
74d9669
Document that AndroidApp is cheaply clonable
rib Oct 16, 2023
b590ec5
Set workspace.resolver = "2" and avoid cargo warning
rib Oct 16, 2023
d16cb79
build(deps): bump hecrj/setup-rust-action from 1 to 2
dependabot[bot] Sep 4, 2023
add58db
native-activity: Fix copy&paste mistake in MotionEvent::action()
rib Oct 16, 2023
2a917ca
Expose MotionEvent::action_button() state
rib Oct 16, 2023
6e036c9
Update CHANGELOG
rib Oct 16, 2023
6af4d61
Remove redundant examples/na-mainloop/.idea directory
rib Oct 16, 2023
a7dc90d
Release 0.5.0
rib Oct 16, 2023
a7114c8
Merge pull request #137 from rust-mobile/release-0.5.0
rib Oct 16, 2023
98aef99
Disable `ndk` default features to remove `raw-window-handle 0.6` (#142)
ThierryBerger Oct 25, 2023
100d5bc
README: Update crate version in `Cargo.toml` example
MarijnS95 Oct 28, 2023
e14d2c1
README: Fix MSRV badge
MarijnS95 Nov 4, 2023
c2f467c
Name spawned threads
fornwall Oct 26, 2023
d9af670
Rename threads
fornwall Nov 20, 2023
a84722f
Clean up a `let-else` that is possible in Rust 1.68
MarijnS95 Nov 4, 2023
af34189
Generalize log-forwarding setup and stop thread on IO errors
MarijnS95 Oct 16, 2023
bfd8bfd
Merge pull request #133 from rust-mobile/marijn/bail-log-thread-on-re…
rib Nov 20, 2023
6c3583d
Merge branch 'main' into android-main-thread-name
fornwall Nov 20, 2023
eeeb802
Fix error after merge conflict
fornwall Nov 20, 2023
2deec16
Merge pull request #145 from fornwall/android-main-thread-name
rib Nov 20, 2023
9fce890
Merge pull request #143 from rust-mobile/readme-update-versions
rib Nov 20, 2023
672360c
Fix multitouch MotionActions processing as unknown in native activities
ArthurCose Dec 13, 2023
5cb67a2
Remove ndk dev-dependency added in #142
rib Dec 20, 2023
35e080b
Release 0.5.1
rib Dec 20, 2023
967882f
Merge pull request #149 from rust-mobile/release-0.5.1
rib Dec 20, 2023
4ffa3ac
Merge pull request #147 from ArthurCose/motion-event-mask
rib Jan 30, 2024
526d39c
Release 0.5.2
rib Jan 30, 2024
4b9b8d7
Force cargo-ndk to only be built with stable toolchain
rib Jan 30, 2024
c9faa9c
Merge pull request #151 from rust-mobile/release-0.5.2
rib Jan 30, 2024
e5b8242
Bump MSRV to 1.69.0 considering we can't build cargo ndk with 1.68
rib Apr 26, 2024
6a0197c
Upgrade to `ndk-sys 0.6.0` and `ndk 0.9.0`
MarijnS95 Apr 26, 2024
7bd3ba6
native-activity: Check for null saved_state_in pointer
skibon02 Feb 14, 2024
0a87a84
Release 0.6.0
rib Apr 26, 2024
0d29930
Merge pull request #158 from rust-mobile/release-0.6.0
rib Apr 26, 2024
fe171bc
Fix various codebase rots (stale CI, new Rust lints, broken MSRV chec…
MarijnS95 Jan 27, 2025
51d05d4
input: Replace open-coded types with `ndk::event` definitions (#163)
MarijnS95 Jan 27, 2025
db3ea33
Bump rust-version to 1.73.0
rib Mar 31, 2025
ac2e17e
Re-export 'ndk' and 'ndk_sys' crates
rib Apr 1, 2025
976e9d0
tree: remove local copy of v2.0.2 android-games-sdk
jb55 Mar 13, 2025
49f2b86
switch to android-game-sdk-rs grafted repo at v2.0.2
jb55 Mar 14, 2025
85eb727
android-game-sdk-rs: bump v2.0.2 -> v4.0.0
jb55 Mar 14, 2025
88714f0
Add CHANGELOG.md entry for GameActivity bump to 4.0.0
rib Mar 31, 2025
36832fe
Add import-games-sdk.sh and import some APP_CMD_ changes for 4.0.0
rib Mar 31, 2025
eacddd7
bindgen: update paths
jb55 Mar 14, 2025
5367c86
Re-generate bindings with rust-bindgen 0.71.1
rib Mar 31, 2025
3755ed7
game-activity: build fixes for rust-bindgen 0.71 ffi API
rib Mar 31, 2025
5d7616e
examples/agdk-mainloop: Use Gradle 8.4 (compatible with Java 21)
rib Mar 31, 2025
42af0cc
examples/agdk-mainloop: pull in games-activity:4.0.0
rib Mar 31, 2025
c0f3fa6
Check $ANDROID_GAMES_SDK for GameActivity source
rib Mar 31, 2025
69f3642
Update android-games-sdk/README.md
rib Apr 4, 2025
bde1cb3
Merge pull request #191 from jb55/agdk-submodule
rib Aug 11, 2025
87cda3c
Build-test (documentation) on the host and fix broken doc samples
MarijnS95 Mar 10, 2025
019ad63
Switch doctests back to native cross-compilation, supported since Rus…
MarijnS95 Aug 8, 2025
b943f58
Merge pull request #184 from rust-mobile/doctest
rib Aug 11, 2025
1652ebb
Add `package.include` to `Cargo.toml`
daxpedda Aug 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 34 additions & 28 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: ci

on:
push:
branches: [main]
branches: '*'
pull_request:

env:
Expand All @@ -12,18 +12,32 @@ env:

jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
# See top README for MSRV policy
rust_version: [1.64.0, stable]
rust-version: [1.73.0, stable]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

# Downgrade all dependencies to their minimum version, both to ensure our
# minimum version bounds are correct and buildable, as well as to satisfy
# our MSRV check when arbitrary dependencies bump their MSRV beyond our
# MSRV in a patch-release.
# This implies that downstream consumers can only rely on our MSRV when
# downgrading various (transitive) dependencies.
- uses: hecrj/setup-rust-action@v2
with:
rust-version: nightly
if: ${{ matrix.rust-version != 'stable' }}
- name: Downgrade dependencies
run: cargo +nightly generate-lockfile -Zminimal-versions
if: ${{ matrix.rust-version != 'stable' }}

- uses: hecrj/setup-rust-action@v1
- uses: hecrj/setup-rust-action@v2
with:
rust-version: ${{ matrix.rust_version }}
rust-version: ${{ matrix.rust-version }}

- name: Install Rust targets
run: >
Expand All @@ -34,18 +48,7 @@ jobs:
i686-linux-android

- name: Install cargo-ndk
# We're currently sticking with cargo-ndk 2, until we bump our
# MSRV to 1.68+
run: cargo install cargo-ndk --version "^2"

- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'

- name: Setup Android SDK
uses: android-actions/setup-android@v2
run: cargo +stable install cargo-ndk

- name: Build game-activity
working-directory: android-activity
Expand All @@ -68,7 +71,7 @@ jobs:
build --features native-activity

- name: Build agdk-mainloop example
if: matrix.rust_version == 'stable'
if: matrix.rust-version == 'stable'
working-directory: examples/agdk-mainloop
run: >
cargo ndk
Expand All @@ -79,7 +82,7 @@ jobs:
-o app/src/main/jniLibs/ -- build

- name: Build na-mainloop example
if: matrix.rust_version == 'stable'
if: matrix.rust-version == 'stable'
working-directory: examples/na-mainloop
run: >
cargo ndk
Expand All @@ -93,17 +96,20 @@ jobs:
run: >
cargo ndk -t arm64-v8a doc --no-deps

- name: Build doctests
# All doctests are set to no_run, because they require running in the
# context of an Android app.
# Only run on stable because cross-compiling doctests is only supported
# since Rust 1.89.
if: ${{ matrix.rust-version == 'stable' }}
run: |
cargo test --doc -F native-activity --target aarch64-linux-android
cargo ndk -t arm64-v8a -- test --doc -F game-activity

format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
components: rustfmt
- uses: actions/checkout@v4

- name: Format
run: cargo fmt --all -- --check
Expand Down
9 changes: 3 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
[workspace]
members = [
"android-activity"
]
resolver = "2"
members = ["android-activity"]

exclude = [
"examples",
]
exclude = ["examples"]
53 changes: 30 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
# Overview
# `android-activity`

[![ci](https://github.com/rust-mobile/android-activity/actions/workflows/ci.yml/badge.svg)](https://github.com/rust-mobile/android-activity/actions/workflows/ci.yml)
[![crates.io](https://img.shields.io/crates/v/android-activity.svg)](https://crates.io/crates/android-activity)
[![Docs](https://docs.rs/android-activity/badge.svg)](https://docs.rs/android-activity)
[![MSRV](https://img.shields.io/badge/rustc-1.68.0+-ab6000.svg)](https://blog.rust-lang.org/2023/03/09/Rust-1.68.0.html)

## Overview

`android-activity` provides a "glue" layer for building native Rust
applications on Android, supporting multiple [`Activity`] base classes.
Expand All @@ -22,14 +29,15 @@ applications.
[ndk-glue]: https://crates.io/crates/ndk-glue
[agdk]: https://developer.android.com/games/agdk

# Example
## Example

Cargo.toml
```

```toml
[dependencies]
log = "0.4"
android_logger = "0.11"
android-activity = { version = "0.4", features = [ "native-activity" ] }
android_logger = "0.13"
android-activity = { version = "0.5", features = [ "native-activity" ] }

[lib]
crate_type = ["cdylib"]
Expand All @@ -38,6 +46,7 @@ crate_type = ["cdylib"]
_Note: that you will need to either specify the **"native-activity"** feature or **"game-activity"** feature to identify which `Activity` base class your application is based on_

lib.rs

```rust
use android_activity::{AndroidApp, InputStatus, MainEvent, PollEvent};

Expand Down Expand Up @@ -69,22 +78,22 @@ fn android_main(app: AndroidApp) {
}
```

```
```sh
rustup target add aarch64-linux-android
cargo install cargo-apk
cargo apk run
adb logcat example:V *:S
```

# Full Examples
## Full Examples

See [this collection of examples](https://github.com/rust-mobile/rust-android-examples) (based on both `GameActivity` and `NativeActivity`).

Each example is a standalone project that may also be a convenient templates for starting a new project.

For the examples based on middleware frameworks (Winit and or Egui) they also aim to demonstrate how it's possible to write portable code that will run on Android and other systems.

# Should I use NativeActivity or GameActivity?
## Should I use NativeActivity or GameActivity?

To learn more about the `NativeActivity` class that's shipped with Android see [here](https://developer.android.com/ndk/guides/concepts#naa).

Expand All @@ -96,31 +105,32 @@ It's expected that the `GameActivity` backend will gain more sophisticated input

Even if you start out using `NativeActivity` for the convenience, it's likely that most moderately complex applications will eventually need to define their own `Activity` subclass (either subclassing `NativeActivity` or `GameActivity`) which will require compiling at least a small amount of Java or Kotlin code. This is generally due to Android's design which directs numerous events via the `Activity` class which can only be processed by overloading some associated Activity method.

# Switching from ndk-glue to android-activity
## Switching from ndk-glue to android-activity

### Winit-based applications

## Winit-based applications
Firstly; if you have a [Winit](https://crates.io/crates/winit) based application and also have an explicit dependency on `ndk-glue` your application will need to remove its dependency on `ndk-glue` for the 0.28 release of Winit which will be based on android-activity (Since glue crates, due to their nature, can't be compatible with alternative glue crates).

Winit-based applications can follow the [Android README](https://github.com/rust-windowing/winit#android) guidance for advice on how to switch over. Most Winit-based applications should aim to remove any explicit dependency on a specific glue crate (so not depend directly on `ndk-glue` or `android-activity` and instead rely on Winit to pull in the right glue crate). The main practical change will then be to add a `#[no_mangle]fn android_main(app: AndroidApp)` entry point.

See the [Android README](https://github.com/rust-windowing/winit#android) for more details and also see the [Winit-based examples here](https://github.com/rust-mobile/rust-android-examples).

## Middleware crates (i.e. not applications)
### Middleware crates (i.e. not applications)

If you have a crate that would be considered a middleware library (for example using JNI to support access to Bluetooth, or Android's Camera APIs) then the crate should almost certainly remove any dependence on a specific glue crate because this imposes a strict compatibility constraint that means the crate can only be used by applications that use that exact same glue crate version.

Middleware libraries can instead look at using the [ndk-context](https://crates.io/crates/ndk-context) crate as a means for being able to use JNI without making any assumptions about the applications overall architecture. This way a middleware crate can work with alternative glue crates (including `ndk-glue` and `android-activity`) as well as work with embedded use cases (i.e. non-native applications that may just embed a dynamic library written in Rust to implement certain native functions).

## Other, non-Winit-based applications
### Other, non-Winit-based applications

The steps to switch a simple standalone application over from `ndk-glue` to `android-activity` (still based on `NativeActivity`) should be:

1. Remove `ndk-glue` from your Cargo.toml
2. Add a dependency on `android-activity`, like `android-activity = { version="0.4", features = [ "native-activity" ] }`
3. Optionally add a dependency on `android_logger = "0.11.0"`
2. Add a dependency on `android-activity`, like `android-activity = { version="0.5", features = [ "native-activity" ] }`
3. Optionally add a dependency on `android_logger = "0.13.0"`
4. Update the `main` entry point to look like this:

```
```rust
use android_activity::AndroidApp;

#[no_mangle]
Expand All @@ -133,25 +143,22 @@ See this minimal [NativeActivity Mainloop](https://github.com/rust-mobile/androi

There is is no `#[ndk_glue::main]` replacement considering that `android_main()` entry point needs to be passed an `AndroidApp` argument which isn't compatible with a traditional `main()` function. Having an Android specific entry point also gives a place to initialize Android logging and handle other Android specific details (such as building an event loop based on the `app` argument)


## Design Summary / Motivation behind android-activity
### Design Summary / Motivation behind android-activity

Prior to working on android-activity, the existing glue crates available for building standalone Rust applications on Android were found to have a number of technical limitations that this crate aimed to solve:

1. **Support alternative Activity classes**: Prior glue crates were based on `NativeActivity` and their API precluded supporting alternatives. In particular there was an interest in the [`GameActivity`] class in conjunction with it's [`GameTextInput`] library that can facilitate onscreen keyboard support. This also allows building applications based on the standard [`AppCompatActivity`] base class which isn't possible with `NativeActivity`. Finally there was interest in paving the way towards supporting a first-party `RustActivity` that could be best tailored towards the needs of Rust applications on Android.
2. **Encapsulate IPC + synchronization between the native thread and the JVM thread**: For example with `ndk-glue` the application itself needs to avoid race conditions between the native and Java thread by following a locking convention) and it wasn't clear how this would extend to support other requests (like state saving) that also require synchronization.
3. **Avoid static global state**: Keeping in mind the possibility of supporting applications with multiple native activities there was interest in having an API that didn't rely on global statics to track top-level state. Instead of having global getters for state then `android-activity` passes an explicit `app: AndroidApp` argument to the entry point that encapsulates the state connected with a single `Activity`.


[`GameTextInput`]: https://developer.android.com/games/agdk/add-support-for-text-input
[`AppCompatActivity`]: https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity


# MSRV
## MSRV

We aim to (at least) support stable releases of Rust from the last three months. Rust has a 6 week release cycle which means we will support the last three stable releases.
For example, when Rust 1.69 is released we would limit our `rust_version` to 1.67.
For example, when Rust 1.69 is released we would limit our `rust-version` to 1.67.

We will only bump the `rust_version` at the point where we either depend on a new features or a dependency has increased its MSRV, and we won't be greedy. In other words we will only set the MSRV to the lowest version that's _needed_.
We will only bump the `rust-version` at the point where we either depend on a new features or a dependency has increased its MSRV, and we won't be greedy. In other words we will only set the MSRV to the lowest version that's _needed_.

MSRV updates are not considered to be inherently semver breaking (unless a new feature is exposed in the public API) and so a `rust_version` change may happen in patch releases.
MSRV updates are not considered to be inherently semver breaking (unless a new feature is exposed in the public API) and so a `rust-version` change may happen in patch releases.
Loading