Skip to content

Commit

Permalink
cargo-apk: Use min_sdk_version to select compiler target
Browse files Browse the repository at this point in the history
According to [1] minSdkVersion is used to determine the compiler target
and ultimately limit what API is available at compile-time.  This is
most likely because using/linking newer API will result in runtime
linker errors on these older platforms.

[1]: https://developer.android.com/ndk/guides/sdk-versions#minsdkversion
  • Loading branch information
MarijnS95 committed Nov 16, 2021
1 parent b912a6b commit 0b8ee4a
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 14 deletions.
2 changes: 1 addition & 1 deletion cargo-apk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ runtime_libs = "path/to/libs_folder"
#
# Defaults to a `min_sdk_version` of 23 and `target_sdk_version` is based on the ndk's default platform.
[package.metadata.android.sdk]
min_sdk_version = 16
min_sdk_version = 23
target_sdk_version = 29
max_sdk_version = 29

Expand Down
21 changes: 9 additions & 12 deletions cargo-apk/src/apk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,8 @@ impl<'a> ApkBuilder<'a> {
pub fn check(&self) -> Result<(), Error> {
for target in &self.build_targets {
let triple = target.rust_triple();
let target_sdk_version = self
.manifest
.android_manifest
.sdk
.target_sdk_version
.unwrap();
let mut cargo = cargo_ndk(&self.ndk, *target, target_sdk_version)?;
let min_sdk_version = self.manifest.android_manifest.sdk.min_sdk_version.unwrap();
let mut cargo = cargo_ndk(&self.ndk, *target, min_sdk_version)?;
cargo.arg("check");
if self.cmd.target().is_none() {
cargo.arg("--target").arg(triple);
Expand Down Expand Up @@ -158,9 +153,11 @@ impl<'a> ApkBuilder<'a> {
.join(artifact)
.join(artifact.file_name(CrateType::Cdylib, triple));

let target_sdk_version = config.manifest.sdk.target_sdk_version.unwrap();
// Use minSdkVersion to select the right compiler target:
// https://developer.android.com/ndk/guides/sdk-versions#minsdkversion
let min_sdk_version = config.manifest.sdk.min_sdk_version.unwrap();

let mut cargo = cargo_ndk(&config.ndk, *target, target_sdk_version)?;
let mut cargo = cargo_ndk(&config.ndk, *target, min_sdk_version)?;
cargo.arg("rustc");
if self.cmd.target().is_none() {
cargo.arg("--target").arg(triple);
Expand Down Expand Up @@ -233,14 +230,14 @@ impl<'a> ApkBuilder<'a> {

pub fn default(&self) -> Result<(), Error> {
let ndk = Ndk::from_env()?;
let target_sdk_version = self
let min_sdk_version = self
.manifest
.android_manifest
.sdk
.target_sdk_version
.min_sdk_version
.unwrap_or_else(|| ndk.default_platform());
for target in &self.build_targets {
let mut cargo = cargo_ndk(&ndk, *target, target_sdk_version)?;
let mut cargo = cargo_ndk(&ndk, *target, min_sdk_version)?;
cargo.args(self.cmd.args());
if !cargo.status()?.success() {
return Err(NdkError::CmdFailed(cargo).into());
Expand Down
2 changes: 1 addition & 1 deletion ndk-examples/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ name = "looper"
crate-type = ["cdylib"]

[package.metadata.android.sdk]
min_sdk_version = 16
min_sdk_version = 23
target_sdk_version = 29

0 comments on commit 0b8ee4a

Please sign in to comment.