rust-apk 1.0.0

Build, align, sign, verify, and inspect Android APKs in pure Rust
Documentation
//! Validated primitive values shared across the crate.
//!
//! Each type checks its invariants once, at construction (`try_new`,
//! `FromStr`, or `TryFrom`), and reports violations with its own error enum.

mod abi;
mod name;
mod path;
mod sdk;

pub use abi::{Abi, UnknownAbi};
pub use name::{
    ClassName, ClassNameError, LibraryName, LibraryNameError, PackageName, PackageNameError, PermissionName,
    PermissionNameError,
};
pub use path::{ArchivePath, ArchivePathError, MAX_ARCHIVE_PATH_LEN};
pub use sdk::{ApiLevel, ApiLevelError, VersionCode, VersionCodeError};

/// Whether `s` is a Java identifier restricted to ASCII, the rule Android
/// applies to package and class name segments.
pub(crate) fn is_java_identifier(s: &str) -> bool {
    let mut bytes = s.bytes();
    bytes.next().is_some_and(|b| b.is_ascii_alphabetic() || b == b'_' || b == b'$')
        && bytes.all(|b| b.is_ascii_alphanumeric() || b == b'_' || b == b'$')
}