diff --git a/xbuild/src/command/build.rs b/xbuild/src/command/build.rs index 7fccf49..363b054 100644 --- a/xbuild/src/command/build.rs +++ b/xbuild/src/command/build.rs @@ -29,7 +29,12 @@ pub fn build(env: &BuildEnv) -> Result<()> { let bin_target = env.target().platform() != Platform::Android; let has_lib = env.root_dir().join("src").join("lib.rs").exists(); if bin_target || has_lib { - if env.target().platform() == Platform::Android && env.config().android().gradle { + ensure!( + env.target().format() != Format::Aab || env.target().android_gradle, + "Android App Bundles (AABs) can currently only be built using `gradle`" + ); + + if env.target().platform() == Platform::Android && env.target().android_gradle { crate::gradle::prepare(env)?; } for target in env.target().compile_targets() { @@ -190,7 +195,7 @@ pub fn build(env: &BuildEnv) -> Result<()> { } } - if env.config().android().gradle { + if env.target().android_gradle { crate::gradle::build(env, libraries, &out)?; runner.end_verbose_task(); return Ok(()); diff --git a/xbuild/src/config.rs b/xbuild/src/config.rs index 82540ac..d5d204f 100644 --- a/xbuild/src/config.rs +++ b/xbuild/src/config.rs @@ -430,8 +430,10 @@ pub struct AndroidConfig { pub manifest: AndroidManifest, #[serde(default)] pub dependencies: Vec, + /// Defaults to [`false`], but uses [`true`] when the user builds a format that requires + /// `gradle` (i.e. [`Format::Aab`]). #[serde(default)] - pub gradle: bool, + pub gradle: Option, #[serde(default)] pub wry: bool, #[serde(default)] diff --git a/xbuild/src/lib.rs b/xbuild/src/lib.rs index 4a376e5..d1e7d56 100644 --- a/xbuild/src/lib.rs +++ b/xbuild/src/lib.rs @@ -1,7 +1,7 @@ use crate::cargo::{Cargo, CargoBuild, CrateType}; use crate::config::Config; use crate::devices::Device; -use anyhow::Result; +use anyhow::{ensure, Result}; use clap::{Parser, ValueEnum}; use std::path::{Path, PathBuf}; use xcommon::Signer; @@ -386,8 +386,18 @@ impl BuildTargetArgs { } else if store == Some(Store::Play) { Format::Aab } else { - Format::platform_default(platform, opt, config.android().gradle) + let user_wants_gradle = config.android().gradle.unwrap_or(false); + Format::platform_default(platform, opt, user_wants_gradle) }; + + let android_gradle = config.android().gradle.unwrap_or(format == Format::Aab); + + ensure!( + // This fails if the format is Aab while `gradle == Some(false)` + format != Format::Aab || android_gradle, + "Android App Bundles (AABs) can currently only be built using `gradle`" + ); + let provisioning_profile = if let Some(profile) = self.provisioning_profile { anyhow::ensure!( profile.exists(), @@ -412,6 +422,7 @@ impl BuildTargetArgs { signer, provisioning_profile, api_key, + android_gradle, }) } } @@ -427,6 +438,7 @@ pub struct BuildTarget { signer: Option, provisioning_profile: Option>, api_key: Option, + android_gradle: bool, } impl BuildTarget {