creator_tools/commands/android/
gen_debug_key.rs

1use super::Key;
2use crate::error::*;
3use std::path::PathBuf;
4use std::process::Command;
5
6/// Generates debug key for signing APK.
7/// Runs `keytool ...` command.
8pub fn gen_debug_key() -> Result<Key> {
9    let path = android_dir()?.join("debug.keystore");
10    let password = "android".to_string();
11    if !path.exists() {
12        let mut keytool = keytool()?;
13        keytool
14            .arg("-genkey")
15            .arg("-v")
16            .arg("-keystore")
17            .arg(&path)
18            .arg("-storepass")
19            .arg("android")
20            .arg("-alias")
21            .arg("androiddebugkey")
22            .arg("-keypass")
23            .arg(&password)
24            .arg("-dname")
25            .arg("CN=Android Debug,O=Android,C=US")
26            .arg("-keyalg")
27            .arg("RSA")
28            .arg("-keysize")
29            .arg("2048")
30            .arg("-validity")
31            .arg("10000");
32        keytool.output_err(true)?;
33    }
34    Ok(Key { path, password })
35}
36
37fn android_dir() -> Result<PathBuf> {
38    let android_dir = dirs::home_dir()
39        .ok_or_else(|| Error::PathNotFound(PathBuf::from("$HOME")))?
40        .join(".android");
41    std::fs::create_dir_all(&android_dir)?;
42    Ok(android_dir)
43}
44
45fn keytool() -> Result<Command> {
46    if let Ok(keytool) = which::which(bin!("keytool")) {
47        return Ok(Command::new(keytool));
48    }
49    if let Ok(java) = std::env::var("JAVA_HOME") {
50        let keytool = PathBuf::from(java).join("bin").join(bin!("keytool"));
51        if keytool.exists() {
52            return Ok(Command::new(keytool));
53        }
54    }
55    Err(Error::CmdNotFound("keytool".to_string()))
56}