Universal Android Debloater Next Generation vs Original: Key Differences Explained

Universal Android Debloater Next Generation (UAD-NG) is a detached fork that transforms the original CLI-only tool into a modern, multi-crate Rust workspace featuring both asynchronous command-line and graphical interfaces powered by iced 0.14.

The original Universal Android Debloater (UAD) by @0x192 was a single-purpose Rust CLI utility for removing bloatware from Android devices. Universal Android Debloater Next Generation, maintained by the Universal-Debloater-Alliance organization, represents a complete architectural rewrite that prioritizes privacy, performance, and user experience while maintaining the core debloating functionality.

Architectural Overhaul: From Single Binary to Workspace

The most fundamental difference lies in the project structure. Where the original UAD compiled to a single Rust binary with basic dependencies, UAD-NG adopts a Rust workspace architecture separating concerns into three distinct crates.

The Three-Crate Structure

According to the repository source code, UAD-NG organizes functionality as follows:

  1. uad-core – Contains the shared business logic including ADB communication, package list parsing, and update mechanisms. Key files include crates/uad-core/src/adb.rs for low-level ADB wrapper functionality, crates/uad-core/src/uad_lists.rs for dynamic list management, and crates/uad-core/src/config.rs for typed configuration handling.

  2. uad-cli – Provides the command-line interface built on clap 4 and tokio for asynchronous operations. The entry point at crates/uad-cli/src/main.rs dispatches commands defined in crates/uad-cli/src/commands.rs, while crates/uad-cli/src/filters.rs exposes the StateFilter, RemovalFilter, and ListFilter enums for fine-grained package queries.

  3. uad-gui – Implements a native desktop GUI using iced 0.14, the cross-platform Rust UI toolkit. The entry point resides at crates/uad-gui/src/main.rs, with view logic in crates/uad-gui/src/views/list.rs and custom widgets defined in crates/uad-gui/src/widgets/package_row.rs.

This modular approach ensures that any improvements to core debloating logic automatically benefit both interfaces, while allowing the GUI and CLI to evolve independently.

User Interface Evolution

Command-Line Interface Improvements

While the original UAD offered basic CLI functionality, UAD-NG introduces asynchronous operations via tokio and a sophisticated filtering system. The CLI now supports auto-generated shell completions for Bash, Zsh, Fish, and PowerShell, available through the Commands::Completions variant in the CLI's main module.

New Graphical Interface

The most visible addition is the full-featured desktop GUI, absent from the original project. Built on the event-driven Iced runtime, the interface provides real-time device detection, search-as-you-type filtering, and system-aware light/dark theming. The GUI mirrors all CLI capabilities while adding conveniences like persistent user preferences stored via the dirs crate in the user's config directory.

Package List Management

The original UAD shipped with static JSON files compiled into the binary. UAD-NG changes this model to fetch lists dynamically from resources/assets/uad_lists.json hosted in the repository.

The update mechanism, implemented in crates/uad-core/src/update.rs, downloads fresh package definitions on request while maintaining the same minimal network footprint—only issuing GET requests to GitHub for list and update checks. This ensures users always have access to the latest bloatware definitions without reinstalling the application.

Configuration and Extensibility

UAD-NG introduces typed configuration through src/core/config.rs, allowing persistent settings such as default device selection and UI theme preferences. This contrasts sharply with the original's minimal CLI flag-based approach.

The filtering system has evolved from hard-coded filters to a flexible enum-based architecture in src/cli/filters.rs, supporting complex queries across package states, removal recommendations, and list categories.

Using UAD-NG: Code Examples

Both front-ends share the same core library, ensuring feature parity across interfaces.

List packages with advanced filtering:


# Show all packages on the first connected device

uad list

# Filter by "bloatware" list and only show enabled packages

uad list --list bloatware --state enabled

Uninstall operations support dry-run previews:


# Preview actions before executing

uad uninstall com.example.unwantedapp --dry-run

# Execute uninstallation

uad uninstall com.example.unwantedapp

Package state management:


# Reinstall a previously removed package

uad enable com.example.app

# Disable a package while preserving data

uad disable com.example.app

Launch the graphical interface:

uad-gui

Access the interactive REPL:

uad shell

Programmatic usage from Rust:

use uad_core::adb::Adb;
use uad_core::uad_lists::PackageState;

// Connect to a device
let mut adb = Adb::connect("emulator-5554")?;
let packages = adb.list_packages()?;

// Uninstall a specific package
adb.change_package_state("com.example.unwanted", PackageState::Uninstalled)?;

Summary

  • Architecture: UAD-NG uses a three-crate workspace (core, cli, gui) versus the original's single binary structure
  • Interface: Adds a full GUI built on iced 0.14 while maintaining and enhancing CLI functionality with async tokio operations
  • Package Lists: Implements dynamic fetching from remote JSON rather than static embedded files
  • Configuration: Introduces persistent typed configuration stored in user directories
  • Extensibility: Provides flexible filter enums (StateFilter, RemovalFilter, ListFilter) and auto-generated shell completions
  • Community: Transitioned from individual maintainer to Alliance-driven development with formalized semantic versioning and CI-driven releases

Frequently Asked Questions

Is UAD-NG backwards compatible with the original UAD?

Yes, UAD-NG maintains compatibility with the same ADB-backed debloating operations. Both versions target identical Android Debug Bridge functionality, and UAD-NG supports the same core commands for listing, uninstalling, enabling, and disabling packages. However, UAD-NG introduces additional flags and filtering options not present in the original CLI.

Can I use UAD-NG without the GUI?

Absolutely. The uad-cli crate provides a complete command-line interface that often exceeds the original UAD's capabilities. Users can perform all debloating operations via terminal commands, and the CLI includes new features like asynchronous execution, shell completions, and an interactive REPL mode (uad shell) that were unavailable in the previous version.

How does the dynamic package list update mechanism work?

Rather than embedding static JSON files, UAD-NG fetches the latest uad_lists.json from the repository's resources/assets/ directory when requested. The implementation in src/core/update.rs checks GitHub for updates while maintaining strict privacy—only GET requests are issued, and no telemetry data is transmitted. Users can trigger updates manually or rely on cached local copies when offline.

What are the system requirements for UAD-NG compared to the original?

UAD-NG requires a Rust toolchain capable of building the iced GUI framework and tokio runtime, resulting in larger binary sizes but significantly better performance through asynchronous operations. The GUI component requires a desktop environment supporting iced 0.14 (Windows, macOS, or Linux with appropriate graphics drivers). The CLI component remains lightweight and can run on headless systems, though it now requires tokio for async execution rather than the original's synchronous approach.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →