Skip to content

Commit 5dfb507

Browse files
committed
Fix gradle for external android projects
Signed-off-by: Nico Burns <nico@nicoburns.com>
1 parent 29691b2 commit 5dfb507

File tree

3 files changed

+58
-40
lines changed

3 files changed

+58
-40
lines changed

packages/cli/src/build/request.rs

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3259,6 +3259,40 @@ impl BuildRequest {
32593259
use std::fs::{create_dir_all, write};
32603260
let root = self.root_dir();
32613261

3262+
// Top-level gradle config
3263+
write(
3264+
root.join("build.gradle.kts"),
3265+
include_bytes!("../../assets/android/gen/build.gradle.kts"),
3266+
)?;
3267+
write(
3268+
root.join("gradle.properties"),
3269+
include_bytes!("../../assets/android/gen/gradle.properties"),
3270+
)?;
3271+
write(
3272+
root.join("gradlew"),
3273+
include_bytes!("../../assets/android/gen/gradlew"),
3274+
)?;
3275+
write(
3276+
root.join("gradlew.bat"),
3277+
include_bytes!("../../assets/android/gen/gradlew.bat"),
3278+
)?;
3279+
write(
3280+
root.join("settings.gradle"),
3281+
include_bytes!("../../assets/android/gen/settings.gradle"),
3282+
)?;
3283+
3284+
// Then the wrapper and its properties
3285+
let wrapper = root.join("gradle").join("wrapper");
3286+
create_dir_all(&wrapper)?;
3287+
write(
3288+
wrapper.join("gradle-wrapper.properties"),
3289+
include_bytes!("../../assets/android/gen/gradle/wrapper/gradle-wrapper.properties"),
3290+
)?;
3291+
write(
3292+
wrapper.join("gradle-wrapper.jar"),
3293+
include_bytes!("../../assets/android/gen/gradle/wrapper/gradle-wrapper.jar"),
3294+
)?;
3295+
32623296
// If the user has specified a custom android project directory in their Dioxus.toml
32633297
// then simply copy that directory as the project directory.
32643298
if let Some(custom_project_dir) = self.config.application.android_project_dir.as_deref() {
@@ -3269,15 +3303,11 @@ impl BuildRequest {
32693303
custom_project_dir.display()
32703304
));
32713305
}
3272-
std::fs::remove_dir_all(&root).unwrap();
3273-
dircpy::copy_dir(custom_project_dir, &root).unwrap();
3306+
std::fs::remove_dir_all(&root.join("app")).unwrap();
3307+
dircpy::copy_dir(custom_project_dir, &root.join("app")).unwrap();
32743308
return Ok(());
32753309
}
32763310

3277-
// gradle
3278-
let wrapper = root.join("gradle").join("wrapper");
3279-
create_dir_all(&wrapper)?;
3280-
32813311
// app
32823312
let app = root.join("app");
32833313
let app_main = app.join("src").join("main");
@@ -3318,38 +3348,6 @@ impl BuildRequest {
33183348
};
33193349
let hbs = handlebars::Handlebars::new();
33203350

3321-
// Top-level gradle config
3322-
write(
3323-
root.join("build.gradle.kts"),
3324-
include_bytes!("../../assets/android/gen/build.gradle.kts"),
3325-
)?;
3326-
write(
3327-
root.join("gradle.properties"),
3328-
include_bytes!("../../assets/android/gen/gradle.properties"),
3329-
)?;
3330-
write(
3331-
root.join("gradlew"),
3332-
include_bytes!("../../assets/android/gen/gradlew"),
3333-
)?;
3334-
write(
3335-
root.join("gradlew.bat"),
3336-
include_bytes!("../../assets/android/gen/gradlew.bat"),
3337-
)?;
3338-
write(
3339-
root.join("settings.gradle"),
3340-
include_bytes!("../../assets/android/gen/settings.gradle"),
3341-
)?;
3342-
3343-
// Then the wrapper and its properties
3344-
write(
3345-
wrapper.join("gradle-wrapper.properties"),
3346-
include_bytes!("../../assets/android/gen/gradle/wrapper/gradle-wrapper.properties"),
3347-
)?;
3348-
write(
3349-
wrapper.join("gradle-wrapper.jar"),
3350-
include_bytes!("../../assets/android/gen/gradle/wrapper/gradle-wrapper.jar"),
3351-
)?;
3352-
33533351
// Now the app directory
33543352
write(
33553353
app.join("build.gradle.kts"),
@@ -4449,12 +4447,27 @@ __wbg_init({{module_or_path: "/{}/{wasm_path}"}}).then((wasm) => {{
44494447
}
44504448

44514449
fn gradle_exe(&self) -> Result<PathBuf> {
4450+
let gradle_dir = if let Some(gradle_wrapper_dir) =
4451+
self.config.application.gradle_wrapper_dir.as_deref()
4452+
{
4453+
let gradle_wrapper_dir = self.package_manifest_dir().join(gradle_wrapper_dir);
4454+
if !gradle_wrapper_dir.exists() {
4455+
return Err(anyhow::anyhow!(
4456+
"Specified gradle_wrapper_dir \"{}\" does not exist",
4457+
gradle_wrapper_dir.display()
4458+
));
4459+
}
4460+
gradle_wrapper_dir
4461+
} else {
4462+
self.root_dir()
4463+
};
4464+
44524465
// make sure we can execute the gradlew script
44534466
#[cfg(unix)]
44544467
{
44554468
use std::os::unix::prelude::PermissionsExt;
44564469
std::fs::set_permissions(
4457-
self.root_dir().join("gradlew"),
4470+
gradle_dir.join("gradlew"),
44584471
std::fs::Permissions::from_mode(0o755),
44594472
)
44604473
.context("Failed to make gradlew executable")?;
@@ -4465,7 +4478,7 @@ __wbg_init({{module_or_path: "/{}/{wasm_path}"}}).then((wasm) => {{
44654478
false => "gradlew",
44664479
};
44674480

4468-
Ok(self.root_dir().join(gradle_exec_name))
4481+
Ok(gradle_dir.join(gradle_exec_name))
44694482
}
44704483

44714484
pub(crate) fn debug_apk_path(&self) -> PathBuf {

packages/cli/src/config/app.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ pub(crate) struct ApplicationConfig {
4444
#[serde(default)]
4545
pub(crate) android_project_dir: Option<PathBuf>,
4646

47+
/// The directory containing gradle
48+
#[serde(default)]
49+
pub(crate) gradle_wrapper_dir: Option<PathBuf>,
50+
4751
/// Use this file for the AndroidManifest.xml associated with the Android app.
4852
/// `dx` will merge any required settings into this file required to build the app
4953
#[serde(default)]

packages/cli/src/config/dioxus_config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ impl Default for DioxusConfig {
2929
ios_info_plist: None,
3030
android_manifest: None,
3131
android_project_dir: None,
32+
gradle_wrapper_dir: None,
3233
android_main_activity: None,
3334
android_min_sdk_version: None,
3435
macos_info_plist: None,

0 commit comments

Comments
 (0)