1use std::path::PathBuf;
2
3use error::Error;
4
5macro_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
28pub 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
47pub 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}