Skip to content

Commit ca36e6b

Browse files
committed
Add gdb command.
1 parent 12a1f55 commit ca36e6b

File tree

7 files changed

+34
-5
lines changed

7 files changed

+34
-5
lines changed

android-build-tools/src/apk.rs

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ impl ApkConfig {
3737
version_name: config.version_name,
3838
version_code: config.version_code,
3939
target_name: config.target_name,
40+
debuggable: config.debuggable,
4041
target_sdk_version,
4142
min_sdk_version: metadata.min_sdk_version.unwrap_or(23),
4243
opengles_version: metadata.opengles_version.unwrap_or((3, 1)),

android-build-tools/src/config.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub struct Config {
1212
pub version_name: String,
1313
pub version_code: u32,
1414
pub target_name: String,
15+
pub debuggable: bool,
1516
pub assets: Option<String>,
1617
pub res: Option<String>,
1718
}

android-build-tools/src/manifest.rs

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub struct Manifest {
1717
pub permissions: Vec<Permission>,
1818
pub icon: Option<String>,
1919
pub fullscreen: bool,
20+
pub debuggable: bool,
2021
}
2122

2223
impl Manifest {
@@ -54,6 +55,7 @@ impl Manifest {
5455
<application
5556
android:hasCode="false"
5657
android:label="{package_label}"
58+
android:debuggable="{debuggable}"
5759
{icon}
5860
{fullscreen}>
5961
<activity
@@ -78,6 +80,7 @@ impl Manifest {
7880
target_name = &self.target_name,
7981
icon = icon,
8082
fullscreen = fullscreen,
83+
debuggable = self.debuggable,
8184
features = features.join("\n"),
8285
permissions = permissions.join("\n"),
8386
)

android-build-tools/src/ndk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ impl Ndk {
292292
.output()?
293293
.stdout;
294294
let abi = std::str::from_utf8(&stdout).or(Err(NdkError::UnsupportedTarget))?;
295-
Target::from_android_abi(abi)
295+
Target::from_android_abi(abi.trim())
296296
}
297297
}
298298

cargo-ndk/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ edition = "2018"
66

77
[dependencies]
88
android-build-tools = { path = "../android-build-tools" }
9-
cargo-subcommand = "0.1.0"
9+
cargo-subcommand = { path = "../../cargo-subcommand" } #"0.1.0"
1010
env_logger = "0.7.1"
1111
log = "0.4.8"
1212
serde = "1.0.104"

cargo-ndk/src/apk.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use android_build_tools::config::Config;
44
use android_build_tools::error::NdkError;
55
use android_build_tools::ndk::Ndk;
66
use android_build_tools::target::Target;
7-
use cargo_subcommand::{Artifact, CrateType, Subcommand};
7+
use cargo_subcommand::{Artifact, CrateType, Profile, Subcommand};
88
use std::path::PathBuf;
99
use std::process::Command;
1010

@@ -65,6 +65,7 @@ impl<'a> ApkBuilder<'a> {
6565
version_name: self.manifest.version.clone(),
6666
version_code: 1,
6767
target_name: artifact.name().to_string(),
68+
debuggable: *self.cmd.profile() == Profile::Dev,
6869
assets: self.manifest.assets.clone(),
6970
res: self.manifest.res.clone(),
7071
};
@@ -97,6 +98,20 @@ impl<'a> ApkBuilder<'a> {
9798
apk.start()?;
9899
Ok(())
99100
}
101+
102+
pub fn gdb(&self, artifact: &Artifact) -> Result<(), NdkError> {
103+
self.run(artifact)?;
104+
let abi = self.ndk.detect_abi()?;
105+
let target_dir = self.build_dir.join(artifact);
106+
let jni_dir = target_dir.join("jni");
107+
std::fs::create_dir_all(&jni_dir)?;
108+
std::fs::write(
109+
jni_dir.join("Android.mk"),
110+
format!("APP_ABI=\"{}\"\nTARGET_OUT=\"\"\n", abi.android_abi()),
111+
)?;
112+
Command::new("ndk-gdb").current_dir(target_dir).status()?;
113+
Ok(())
114+
}
100115
}
101116

102117
fn cargo_env_target_cfg(tool: &str, target: &str) -> String {

cargo-ndk/src/main.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use cargo_ndk::ApkBuilder;
2-
use cargo_subcommand::Subcommand;
2+
use cargo_subcommand::{Error, Subcommand};
33
use std::process::Command;
44

55
fn main() -> Result<(), Box<dyn std::error::Error>> {
66
env_logger::init();
77

8-
let cmd = Subcommand::new("ndk")?;
8+
let cmd = Subcommand::new("ndk", |_, _| Ok(false))?;
99
let builder = ApkBuilder::from_subcommand(&cmd)?;
1010

1111
match cmd.cmd() {
@@ -17,6 +17,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
1717
"run" => {
1818
if cmd.artifacts().len() == 1 {
1919
builder.run(&cmd.artifacts()[0])?;
20+
} else {
21+
return Err(Error::InvalidArgs.into());
22+
}
23+
}
24+
"gdb" => {
25+
if cmd.artifacts().len() == 1 {
26+
builder.gdb(&cmd.artifacts()[0])?;
27+
} else {
28+
return Err(Error::InvalidArgs.into());
2029
}
2130
}
2231
_ => {

0 commit comments

Comments
 (0)