# android-build
[![Latest Version](https://img.shields.io/crates/v/android-build.svg)](https://crates.io/crates/android_build)
[![Docs](https://docs.rs/android-build/badge.svg)](https://docs.rs/android-build/latest/android_build/)
[![Project Robius Matrix Chat](https://img.shields.io/matrix/robius-general%3Amatrix.org?server_fqdn=matrix.org&style=flat&logo=matrix&label=Project%20Robius%20Matrix%20Chat&color=B7410E)](https://matrix.to/#/#robius:matrix.org)
Use this crate from your Cargo `build.rs` build script to compile Java source files and to run Java/Android commands as part of a Rust build,
specifically designed for Android-targeted builds and Android tools.
This crate aims to behave similarly to [`cc-rs`](https://github.com/rust-lang/cc-rs/tree/main), but for Java (primarily on Android) instead of C/C++.
This crate is part of [Project Robius](https://github.com/project-robius) and is primarily used by those crates.
## Usage
Add this crate as a build dependency to your `Cargo.toml`:
```toml
[build-dependencies]
android-build = "0.1.0"
```
Then add this to your `build.rs` build script:
```rust
fn main() {
let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
if target_os == "android" {
let output_dir = std::env::var("OUT_DIR").unwrap();
let android_jar_path = android_build::android_jar(None)
.expect("Failed to find android.jar");
android_build::JavaBuild::new()
.class_path(android_jar_path)
.classes_out_dir(std::path::PathBuf::from(output_dir))
.file("YourJavaFile.java")
.compile()
.expect("java build failed!");
// `YourJavaFile.class` will be the Cargo-specified OUT_DIR.
}
}
```
The above code will automatically run when you build your crate using `cargo build`.
## Configuration via environment variables
The [crate-level documentation](https://docs.rs/android-build/latest/android_build/) provides a detailed list of environment variables that can be set
to configure this crate.
## Examples
Check out the [`robius-authentication` build script](https://github.com/project-robius/robius-authentication/blob/main/build.rs) to see how we use this crate for more complicated build procedures:
* Discovering specific Android jarfiles and SDK directories (platforms, build tools, etc).
* Compiling Java classes against the main `android.jar` jarfile.
* Invoking Android's `d8` DEXer tool.