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 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use super::bundletool;
use crate::error::*;
use std::path::{Path, PathBuf};
/// ## Build your app bundle using bundletool
/// To build your app bundle, you use the `bundletool build-bundle` command, as shown
/// below:
///
/// ```sh
/// `bundletool build-bundle --modules=base.zip --output=mybundle.aab`
/// ```
///
/// ## Note
/// If you plan to publish the app bundle, you need to sign it using [`jarsigner`]. You
/// can not use apksigner to sign your app bundle.
///
/// [jarsigner]: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html
#[derive(Debug, PartialEq, PartialOrd)]
pub struct BuildBundle {
modules: Vec<PathBuf>,
output: PathBuf,
config: Option<PathBuf>,
metadata_file: Option<PathBuf>,
}
impl BuildBundle {
/// Specifies the list of module ZIP files `bundletool` should use to build your app
/// bundle.
///
/// Specifies the path and filename for the output `.aab` file
pub fn new(modules: &[PathBuf], output: &Path) -> Self {
Self {
modules: modules.to_vec(),
output: output.to_owned(),
config: None,
metadata_file: None,
}
}
/// Specifies the path to an optional configuration file you can use to customize the
/// build process. To learn more, see the section about
/// [`customizing downstream APK generation`](https://developer.android.com/studio/build/building-cmdline#bundleconfig)
pub fn config(&mut self, config: &Path) -> &mut Self {
self.config = Some(config.to_owned());
self
}
/// Instructs bundletool to package an optional metadata file inside your app bundle.
/// You can use this file to include data, such as ProGuard mappings or the complete
/// list of your app's DEX files, that may be useful to other steps in your toolchain
/// or an app store.
///
/// `target-bundle-path` specifies a path relative to the root of the app bundle where
/// you would like the metadata file to be packaged, and `local-file-path` specifies
/// the path to the local metadata file itself
pub fn metadata_file(&mut self, metadata_file: &Path) -> &mut Self {
self.metadata_file = Some(metadata_file.to_owned());
self
}
/// Runs `bundletool` commands to build AAB
pub fn run(&self) -> Result<()> {
let mut build_bundle = bundletool()?;
build_bundle.arg("build-bundle");
build_bundle.arg("--modules");
build_bundle.arg(
self.modules
.iter()
.map(|v| v.to_string_lossy().to_string())
.collect::<Vec<String>>()
.join(","),
);
build_bundle.arg("--output").arg(&self.output);
if let Some(config) = &self.config {
build_bundle.arg("--config").arg(config);
}
if let Some(metadata_file) = &self.metadata_file {
build_bundle.arg("--metadata-file").arg(metadata_file);
}
build_bundle.output_err(true)?;
Ok(())
}
}
