ROMMER is a powerful tool designed to customize Android ROM ZIP files without building from source. Built with Rust for maximum performance and reliability, ROMMER automates the tedious process of downloading, unpacking, modifying, and repacking Android ROMs.
Customizing Android ROMs typically requires either building from source (which is resource-intensive) or manually modifying ZIP files (which is error-prone). ROMMER bridges this gap by providing a streamlined, declarative approach to ROM customization.
- Declarative Configuration: Define your desired modifications in a simple YAML file
- Automatic ROM Downloading: Fetch official/latest ROM builds by device and ROM name
- Modular Patch System: Apply changes using directory structures that map directly to the ROM filesystem
- File Management: Add, replace, or delete files and directories with precision
- Signing Support: Configure ROM signing with user-provided keys
- Checksum Verification: Verify downloaded ROM integrity with SHA-256
- Progress Tracking: Real-time progress indicators for long-running operations
- Error Handling: Robust error recovery and detailed logging
- Configuration: User creates a
ROMMER.yaml
file specifying device, ROM source, patches, and options - Download: ROMMER fetches the specified ROM ZIP from official servers or mirrors
- Extraction: The ROM ZIP is unpacked into a temporary working directory
- Patching: Each patch folder is applied sequentially:
- Files are copied from patch folders to the unpacked ROM (overwriting existing files)
- Directories/files listed in
.rommerdel
/.rommerfdel
are deleted
- Repacking: Modified files are compressed into a new ZIP file
- Signing: If enabled, ROMMER signs the ZIP with provided keys
- Output: Final flashable ZIP is created with the configured filename
From crates.io:
cargo install rommer
From source:
git clone https://github.com/TheROMMER/core.git rommer
cd rommer
cargo install --path .
# Run with default config file (ROMMER.yaml in current directory)
rommer
# dry-run mode
rommer -d # or --dry-run
# Specify a custom config file
rommer -c my-config.yaml
# dry-run mode with a custom config
rommer -d -c my-config.yaml
# Use an existing ROM ZIP instead of downloading
# Also supports using tilde (~) which is the home directory
rommer -r path/to/existing/rom.zip
# dry-run mode with an existing ROM ZIP
rommer -d -r path/to/existing/rom.zip
# Keep temporary files (override cleanup setting)
rommer -n
# Initialize a sample ROM
rommer init -n my-rom # or --name, also name optional, defaults to my-rom
ROMMER uses a YAML configuration file (ROMMER.yaml
by default) to define how your ROM should be customized:
device: garnet # Device codename
rom: lineageos # ROM name or direct download URL
max_retries: 3 # Download retry attempts
version: 20.0 # ROM version to download
android_version: 15 # Android version
variant: nightly # ROM Variant, required for downloading LineageOS.
# Optional SHA-256 checksum for download verification
expected_checksum: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
# List of patch folders to apply (in order)
patches:
- patches/remove_bloatware_patch
- patches/custom_bootanimation_patch
# Output configuration
output:
filename: lineageos-garnet-custom.zip
# Optional signing configuration
signing:
method: apksigner # apksigner, jarsigner, or custom
keystore_path: ~/.android/debug.keystore
key_alias: androiddebugkey
keystore_password: android
key_password: android
custom_command: null # Only used when method is 'custom'
# Whether to remove temporary files after completion
cleanup: true
ROMMER can download ROMs from the following sources:
- LineageOS (
rom: lineageos
) - PixelOS (
rom: pixelos
) - EvolutionX (
rom: evolutionx
) - Custom URL (
rom: https://example.com/path/to/rom.zip
)
Patches are directories that mirror the structure of the ROM's filesystem. Each patch can:
- Add or replace files: Files in the patch folder are copied to the corresponding location in the ROM
- Delete directories: Listed in
.rommerdel
file within the patch folder - Delete files: Listed in
.rommerfdel
file within the patch folder
patches/remove_bloatware_patch/
├── .rommerdel # Contains paths of directories to delete
│ └── Contents: "system/app/Bloatware"
├── .rommerfdel # Contains paths of files to delete
│ └── Contents: "system/app/UnwantedApp.apk"
└── system/
└── etc/
└── custom_file # File to add/replace in the ROM
system/app/Facebook
system/priv-app/GooglePlay
system/product/app/YouTube
system/build.prop
system/etc/permissions/unwanted_permission.xml
system/media/bootanimation.zip
Usage: rommer [OPTIONS]
Options:
-c, --config <CONFIG> Path to config file [default: ROMMER.yaml]
-r, --romzip <ROMZIP> Path to ROM ZIP file [default: .download]
-n, --no-cleanup Override cleanup setting from config
-s, --skip-signing Skip signing the final ROM
-d, --dry-run Running in dry-run mode
-h, --help Print help information
-V, --version Print version information
ROMMER supports multiple signing methods:
- apksigner: Uses Android SDK's apksigner tool
- jarsigner: Uses Java's jarsigner tool
- custom: Executes a custom command specified in the config
- test: Creates a test signature (default when no signing config is provided)
ROMMER provides detailed error messages and handles common issues such as:
- Download failures (with configurable retry mechanism)
- Checksum verification failures
- File access permission issues
- Signing errors
git clone https://github.com/TheROMMER/core.git
cd rommer
cargo build --release
ROMMER relies on the following Rust crates:
reqwest
: HTTP client for downloading ROMsserde
&serde_yaml
: For parsing YAML configurationsha2
: For checksum verificationanyhow
: Error handlingwalkdir
: Directory traversaltokio
: Async runtimetempfile
: Temporary file managementclap
: Command-line argument parsingzip
: ZIP file manipulationindicatif
: Progress bars
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch:
git checkout -b feature/nameof-feature
- Commit your changes:
git commit -m 'Add some amazing feature'
- Push to the branch:
git push origin feature/nameof-feature
- Open a Pull Request
This project is licensed under the GNU General Public License v3 License.
- The Android ROM development community
- All ROM projects for their amazing work
- The Rust community for providing excellent libraries
#KeepROMMING