android_tools/
lib.rs

1use std::path::PathBuf;
2
3use error::Error;
4
5/// On Windows adds `.exe` to given string.
6macro_rules! bin {
7    ($bin:expr) => {{
8        #[cfg(not(target_os = "windows"))]
9        let bin = $bin;
10        #[cfg(target_os = "windows")]
11        let bin = concat!($bin, ".exe");
12        bin
13    }};
14}
15
16pub mod error;
17
18#[cfg(feature = "aapt2")]
19pub mod aapt2;
20pub mod adb;
21#[cfg(feature = "bundletool")]
22pub mod bundletool;
23#[cfg(feature = "emulator")]
24pub mod emulator;
25#[cfg(feature = "java-tools")]
26pub mod java_tools;
27
28/// Return SDK path from found environment variable
29pub fn sdk_path_from_env() -> crate::error::Result<PathBuf> {
30    let sdk_path = {
31        let sdk_path = std::env::var("ANDROID_SDK_ROOT")
32            .ok()
33            .or_else(|| std::env::var("ANDROID_SDK_PATH").ok())
34            .or_else(|| std::env::var("ANDROID_HOME").ok());
35        if let Some(path) = sdk_path {
36            std::path::PathBuf::from(path)
37        } else {
38            sdk_install_path()?
39        }
40    };
41    if !sdk_path.exists() {
42        return Err(Error::AndroidSdkNotFound)?;
43    }
44    Ok(sdk_path)
45}
46
47/// Default installation path
48pub fn sdk_install_path() -> crate::error::Result<PathBuf> {
49    let home_dir_path = dirs::home_dir().ok_or(Error::UnableToAccessHomeDirectory)?;
50    #[cfg(target_os = "windows")]
51    let path = std::path::Path::new("Local").join("Android").join("Sdk");
52    #[cfg(target_os = "macos")]
53    let path = std::path::Path::new("Library").join("Android").join("sdk");
54    #[cfg(target_os = "linux")]
55    let path = std::path::Path::new("Android").join("sdk");
56
57    #[cfg(target_os = "windows")]
58    let app_data = std::path::Path::new("AppData");
59    #[cfg(target_os = "windows")]
60    let sdk_path = home_dir_path.join(app_data).join(path);
61
62    #[cfg(not(target_os = "windows"))]
63    let sdk_path = home_dir_path.join(path);
64
65    Ok(sdk_path)
66}
67
68pub fn find_max_version(target_dir: &std::path::Path) -> crate::error::Result<String> {
69    let max_version = std::fs::read_dir(&target_dir)?
70        .filter_map(|path| path.ok())
71        .filter(|path| path.path().is_dir())
72        .filter_map(|path| path.file_name().into_string().ok())
73        .filter(|name| name.chars().next().unwrap().is_ascii_digit())
74        .max()
75        .ok_or(Error::AndroidToolNotFound)?;
76    Ok(max_version)
77}