1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use crate::{commands::android::*, error::*, types::*};
use android_manifest::AndroidManifest;
use std::path::{Path, PathBuf};

/// Generates minimal unsigned aab
pub fn gen_minimal_unsigned_aab(
    sdk: AndroidSdk,
    package_name: &str,
    target_sdk_version: u32,
    aab_build_dir: &Path,
) -> Result<PathBuf> {
    let mut manifest = AndroidManifest {
        package: "com.crossbow.minimal".to_owned(),
        ..Default::default()
    };
    update_android_manifest_with_default(
        &mut manifest,
        Some("Minimal".to_owned()),
        "minimal",
        AndroidStrategy::NativeAab,
    );

    let manifest_path = save_android_manifest(aab_build_dir, &manifest)?;
    let apk_path = aab_build_dir.join(format!("{}_module.apk", package_name));
    if !aab_build_dir.exists() {
        std::fs::create_dir_all(&aab_build_dir)?;
    }

    let mut aapt2_link = sdk
        .aapt2()?
        .link_compiled_res(None, &apk_path, &manifest_path);
    aapt2_link
        .android_jar(sdk.android_jar(target_sdk_version)?)
        .version_code(1)
        .proto_format(true)
        .auto_add_overlay(true);
    aapt2_link.run()?;

    let output_dir = aab_build_dir.join("extracted_apk_files");
    let extracted_apk_path = extract_archive(&apk_path, &output_dir)?;

    let gen_zip_modules = super::gen_zip_modules(aab_build_dir, package_name, &extracted_apk_path)?;

    let aab_path =
        super::gen_aab_from_modules(package_name, &[gen_zip_modules.clone()], aab_build_dir)?;

    remove(vec![gen_zip_modules, extracted_apk_path])?;
    Ok(aab_path)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_gen_minimal_unsigned_aab() {
        // Creates a temporary directory
        let tempdir = tempfile::tempdir().unwrap();
        let aab_build_dir = tempdir.path();

        // Assigns configuration for aab generation
        let sdk = AndroidSdk::from_env().unwrap();
        let package_name = "minimal_unsigned_aab";
        let target_sdk_version = 31;

        // Generates minimal unsigned aab
        gen_minimal_unsigned_aab(sdk, package_name, target_sdk_version, aab_build_dir).unwrap();
    }
}