From 93c83863a6b4861c29bad0afc80879387d029c5f Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Thu, 16 Jul 2026 07:28:22 +0000 Subject: [PATCH 01/14] Update uad_lists.json --- resources/assets/uad_lists.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 76744c5..d0b66aa 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -41220,7 +41220,7 @@ }, "com.blackview.filetrans": { "list": "Oem", - "description": "Moving Assistant/Data Migration Assistant\nApp used to transfer data from one device to another.\nWARNING: Uninstalling it breaks the App info Settings page on Android 15, Blackview Tab 60 WiFi.", + "description": "Moving Assistant/Data Migration Assistant\nApp used to transfer data from one device to another.\nWARNING: Uninstalling it breaks the App info Settings page on Android 15, Blackview Tab 60 WiFi.\nTry disabling instead of uninstalling in case that happens.", "dependencies": [], "neededBy": [], "labels": [], @@ -43131,5 +43131,13 @@ "neededBy": [], "labels": [], "removal": "Expert" + }, + "com.blackview.systemmanager": { + "list": "Oem", + "description": "'System Manager'\nA pre-installed 'task killer', which ironically slows down the system. It also has internet and install apps permisions by default, making it a potential backdoor.\nAlthough 'systemmanager' might sound scary, disabling it will significantly reduce scroll stuttering. Try disabling instead of uninstalling in case that breaks the App info Settings page.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Advanced" } } From 3bc538292db032c2c34380255ac8401254416aff Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Thu, 16 Jul 2026 07:47:04 +0000 Subject: [PATCH 02/14] Update uad_lists.json --- resources/assets/uad_lists.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index d0b66aa..4368a13 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43134,7 +43134,7 @@ }, "com.blackview.systemmanager": { "list": "Oem", - "description": "'System Manager'\nA pre-installed 'task killer', which ironically slows down the system. It also has internet and install apps permisions by default, making it a potential backdoor.\nAlthough 'systemmanager' might sound scary, disabling it will significantly reduce scroll stuttering. Try disabling instead of uninstalling in case that breaks the App info Settings page.", + "description": "'System Manager'\nA pre-installed 'task killer', which ironically slows down the system. It also has internet and install apps permisions by default, making it a potential backdoor.\nAlthough 'systemmanager' might sound important, disabling it will significantly reduce scroll stuttering. Try disabling instead of uninstalling in case that breaks the App info Settings page.", "dependencies": [], "neededBy": [], "labels": [], From 85c0d67776493a8ab9999a72f39ed1bb9e8466d8 Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:04:11 +0000 Subject: [PATCH 03/14] Update uad_lists.json --- resources/assets/uad_lists.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 4368a13..8320cc0 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43139,5 +43139,13 @@ "neededBy": [], "labels": [], "removal": "Advanced" + }, + "com.blackview.apkupgrade": { + "list": "Oem", + "description": "System Message\nSends unwanted promotional notifications.\nhttps://www.reddit.com/r/blackview/comments/1mo441x/get_rid_of_system_notification_that_contains_ads/", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Recommended" } } From 4ec90fa807c950222d49948b69164079550e4837 Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:07:28 +0000 Subject: [PATCH 04/14] Update uad_lists.json --- resources/assets/uad_lists.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 8320cc0..1ca7540 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43142,7 +43142,7 @@ }, "com.blackview.apkupgrade": { "list": "Oem", - "description": "System Message\nSends unwanted promotional notifications.\nhttps://www.reddit.com/r/blackview/comments/1mo441x/get_rid_of_system_notification_that_contains_ads/", + "description": "System Message\nAdware, sends unwanted promotional notifications.\nhttps://www.reddit.com/r/blackview/comments/1mo441x/get_rid_of_system_notification_that_contains_ads/", "dependencies": [], "neededBy": [], "labels": [], From 43d323332f4c7a074fffd3cdb31a7ce20f464fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Klein?= <44199273+burninc0de@users.noreply.github.com> Date: Fri, 17 Jul 2026 00:35:15 +0300 Subject: [PATCH 05/14] fix(core): two bugs blocking package operations on real devices (#1430) * fix(core): two bugs blocking package operations on real devices - adb.rs: replace debug_assert! in list_packages_sys with filter_map to avoid panicking on nonstandard package names from real devices. - sync.rs: fix inverted guard in request_builder (is_some -> is_none) that was rejecting every valid package name instead of invalid ones. --- crates/uad-core/src/adb.rs | 12 ++++++++---- crates/uad-core/src/sync.rs | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/crates/uad-core/src/adb.rs b/crates/uad-core/src/adb.rs index e7d223c..f2335e0 100644 --- a/crates/uad-core/src/adb.rs +++ b/crates/uad-core/src/adb.rs @@ -44,7 +44,7 @@ use std::rc::Rc; use std::os::windows::process::CommandExt; use crate::utils::is_all_w_c; -use log::{error, info}; +use log::{error, info, warn}; /// Convert ADB output bytes to a trimmed UTF-8 string. /// Uses lossy conversion to prevent panics on non-UTF8 output from certain OEMs. @@ -366,11 +366,15 @@ impl PmCommand { self.0.0.run().map(|pack_ls| { pack_ls .lines() - .map(|p_ln| { + .filter_map(|p_ln| { debug_assert!(p_ln.starts_with(PACK_PREFIX)); let p = &p_ln[PACK_PREFIX.len()..]; - debug_assert!(PackageId::new(p).is_some()); - String::from(p) + if PackageId::new(p).is_some() { + Some(String::from(p)) + } else { + warn!("skipping nonstandard package name: {p:?}"); + None + } }) .collect() }) diff --git a/crates/uad-core/src/sync.rs b/crates/uad-core/src/sync.rs index 9bdd7cc..b4b912a 100644 --- a/crates/uad-core/src/sync.rs +++ b/crates/uad-core/src/sync.rs @@ -213,7 +213,7 @@ pub fn request_builder(commands: &[&str], package: &str, user: Option) -> // guarantee local to the sink instead of relying on each caller to sanitise. // Fail closed: emit no command for a malformed name rather than an injectable // device-shell string. - if PackageId::new(package).is_some() { + if PackageId::new(package).is_none() { error!("request_builder: refusing invalid package name: {package:?}"); return Vec::new(); } From 067f2251e99bd0a023522803c8d13fa2316f8ef1 Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Sat, 18 Jul 2026 09:43:54 +0000 Subject: [PATCH 06/14] Update uad_lists.json --- resources/assets/uad_lists.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 1ca7540..db8943f 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43147,5 +43147,13 @@ "neededBy": [], "labels": [], "removal": "Recommended" + }, + "com.huawei.localBackup": { + "list": "Oem", + "description": "Backup\nA hidden app, which has storage, location, contacts, sms, call logs and calendar permissions. Can be uninstalled via Settings.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Recommended" } } From 31234bed3ccc44e356cdb07b86e76013de6f284c Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Sat, 18 Jul 2026 09:50:33 +0000 Subject: [PATCH 07/14] Update uad_lists.json --- resources/assets/uad_lists.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index db8943f..9d1c5c6 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43150,7 +43150,15 @@ }, "com.huawei.localBackup": { "list": "Oem", - "description": "Backup\nA hidden app, which has storage, location, contacts, sms, call logs and calendar permissions. Can be uninstalled via Settings.", + "description": "Backup\nA hidden app, which has storage, location, contacts, SMS, call logs and calendar permissions. Can be uninstalled via Settings.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Recommended" + }, + "com.huawei.aml": { + "list": "Oem", + "description": "Huawei AML\nA hidden app, which has phone, location and SMS permissions.", "dependencies": [], "neededBy": [], "labels": [], From c38c1cd2d04d661b178fcf19112095560f71d697 Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:05:39 +0000 Subject: [PATCH 08/14] Update uad_lists.json --- resources/assets/uad_lists.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 9d1c5c6..7ef314e 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43142,11 +43142,11 @@ }, "com.blackview.apkupgrade": { "list": "Oem", - "description": "System Message\nAdware, sends unwanted promotional notifications.\nhttps://www.reddit.com/r/blackview/comments/1mo441x/get_rid_of_system_notification_that_contains_ads/", + "description": "System Message\nAdware, sends unwanted promotional notifications.\nTry disabling instead of uninstalling in case that breaks the App info Settings page.\nhttps://www.reddit.com/r/blackview/comments/1mo441x/get_rid_of_system_notification_that_contains_ads/", "dependencies": [], "neededBy": [], "labels": [], - "removal": "Recommended" + "removal": "Advanced" }, "com.huawei.localBackup": { "list": "Oem", @@ -43163,5 +43163,13 @@ "neededBy": [], "labels": [], "removal": "Recommended" + }, + "com.blackview.helper": { + "list": "Oem", + "description": "DKHelper\nTry disabling instead of uninstalling in case that breaks the App info Settings page.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Advanced" } } From 3f55e6cdba096a5d089c6956552dd8416c6f5ae9 Mon Sep 17 00:00:00 2001 From: Wakelock <263392226+Wakelock@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:25:28 +0000 Subject: [PATCH 09/14] Update uad_lists.json --- resources/assets/uad_lists.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 7ef314e..8caff7f 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -43171,5 +43171,13 @@ "neededBy": [], "labels": [], "removal": "Advanced" + }, + "com.softwinner.dragonatt": { + "list": "Oem", + "description": "DragonAtt", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Recommended" } } From 856606c58b5872106516c465ddff6639e2f7258b Mon Sep 17 00:00:00 2001 From: TechyDodoDevMan <156003199+TechyDodoDevMan@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:05:16 -0400 Subject: [PATCH 10/14] Update uad_lists.json Added Fitbit Connected Fitness --- resources/assets/uad_lists.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 8caff7f..8ffc450 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -23,6 +23,14 @@ "labels": [], "removal": "Unsafe" }, + "com.google.android.wearable.pixel.aspen": { + "list": "Oem", + "description": "Fitbit's Connected Fitness feature for the Pixel Watch. Can be safely removed if you don't need/use it.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Recommended" + }, "org.lineageos.recorder": { "list": "Oem", "description": "LineageOS Voice Recorder App.\nSafe to remove if you don't need it or have replaced it with another app.", From 266f1b9597f99e266ad8660bdd5886c49f7911c4 Mon Sep 17 00:00:00 2001 From: insanebecauseimbestwheniminlove Date: Sat, 25 Jul 2026 03:53:55 +0200 Subject: [PATCH 11/14] Update uad_lists.json --- resources/assets/uad_lists.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 8caff7f..d232403 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -367,6 +367,14 @@ "labels": [], "removal": "Advanced" }, + "com.xiaomi.aiservice": { + "list": "Oem", + "description": "Xiaomi on-device AI inference engine (HyperOS/MIUI). Runs many ML models (OCR, translation, etc.) in isolated per-model processes. \nEmbeds Xiaomi's OneTrack SDK, which collects OAID, android_id, device fingerprint, region, network type, and per-event usage data, then uploads it encrypted to tracking.*.miui.com. \nAlso embeds XCrash for crash reporting. Downloads AI model updates silently via Android DownloadManager (probably has to do with AI Core). \nRemoving probably breaks HyperOS AI features (I haven't tested) but does not affect core phone, SMS, or data functions.", + "dependencies": [], + "neededBy": [], + "labels": [], + "removal": "Advanced" + }, "com.xiaomi.phone.overlay": { "list": "Oem", "description": "An overlay needed for com.xiaomi.phone. Safe to remove if com.xiaomi.phone has been removed.", From 3c4011807ba29ca2ec1c38987eef0084ec10429e Mon Sep 17 00:00:00 2001 From: TechyDodoDevMan <156003199+TechyDodoDevMan@users.noreply.github.com> Date: Thu, 30 Jul 2026 16:12:33 -0400 Subject: [PATCH 12/14] Change removal recommendation from 'Recommended' to 'Advanced' Resolved suggestion --- resources/assets/uad_lists.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 75635c4..6b8ae92 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -29,7 +29,7 @@ "dependencies": [], "neededBy": [], "labels": [], - "removal": "Recommended" + "removal": "Advanced" }, "org.lineageos.recorder": { "list": "Oem", From f3df24beb987d9977ae5422d1cfd09b9fa60f4a1 Mon Sep 17 00:00:00 2001 From: Jarek <42780718+jarekt@users.noreply.github.com> Date: Wed, 5 Aug 2026 14:57:22 +0200 Subject: [PATCH 13/14] change com.android.networkstack.tethering.inprocess to unsafe --- resources/assets/uad_lists.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/uad_lists.json b/resources/assets/uad_lists.json index 6b8ae92..ae97e4e 100644 --- a/resources/assets/uad_lists.json +++ b/resources/assets/uad_lists.json @@ -42228,11 +42228,11 @@ }, "com.android.networkstack.tethering.inprocess": { "list": "Oem", - "description": "Completely empty package. Useless.", + "description": "Causes a lockscreen loop on some Xiaomi devices. Provides TetherableWifiRegexs, the lack of which crashes systemui and miui.home.", "dependencies": [], "neededBy": [], "labels": [], - "removal": "Recommended" + "removal": "Unsafe" }, "com.samsung.android.a20.d01.wallpapermulti": { "list": "Oem", From 67f880b5078b40e38c17370d153077335aff4611 Mon Sep 17 00:00:00 2001 From: Rudxain <76864299+Rudxain@users.noreply.github.com> Date: Fri, 7 Aug 2026 18:06:51 -0400 Subject: [PATCH 14/14] feat(settings): Disable-mode by default - feat(settings): `disable_mode=true` if device supports it; update description - refactor: define `supports_disabling` and use it whenever possible - refactor(sync): inline `MULTI_USER_SDK`, with tiny comment - docs(sync): rm redundant "Android" --- crates/uad-core/src/config.rs | 2 +- crates/uad-core/src/sync.rs | 27 ++++++++++++++++----------- crates/uad-gui/src/views/settings.rs | 13 +++++++------ 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/crates/uad-core/src/config.rs b/crates/uad-core/src/config.rs index 5522b16..5c41d78 100644 --- a/crates/uad-core/src/config.rs +++ b/crates/uad-core/src/config.rs @@ -37,7 +37,7 @@ pub struct BackupSettings { pub struct DeviceSettings { /// Unique serial identifier pub device_id: String, - pub disable_mode: bool, + pub disable_mode: bool, // should be `enum RemovalMode` pub multi_user_mode: bool, #[serde(skip)] pub backup: BackupSettings, diff --git a/crates/uad-core/src/sync.rs b/crates/uad-core/src/sync.rs index b4b912a..f90b6ee 100644 --- a/crates/uad-core/src/sync.rs +++ b/crates/uad-core/src/sync.rs @@ -180,16 +180,19 @@ pub fn apply_pkg_state_commands( _ => vec![], }, PackageState::Disabled => match package.state { - PackageState::Uninstalled | PackageState::Enabled => match phone.android_sdk { - sdk if sdk >= 23 => vec!["pm disable-user", "am force-stop", PM_CLEAR_PACK], - _ => vec![], - }, + PackageState::Uninstalled | PackageState::Enabled => { + if supports_disabling(phone) { + vec!["pm disable-user", "am force-stop", PM_CLEAR_PACK] + } else { + vec![] + } + } _ => vec![], }, PackageState::Uninstalled => match package.state { PackageState::Enabled | PackageState::Disabled => match phone.android_sdk { - sdk if sdk >= 23 => vec!["pm uninstall"], // > Android Marshmallow (6.0) - 21 | 22 => vec!["pm hide", PM_CLEAR_PACK], // Android Lollipop (5.x) + sdk if sdk >= 23 => vec!["pm uninstall"], // > Marshmallow (6.0) + 21 | 22 => vec!["pm hide", PM_CLEAR_PACK], // Lollipop (5.x) _ => vec!["pm block", PM_CLEAR_PACK], // Disable mode is unavailable on older devices because the specific ADB commands need root }, _ => vec![], @@ -401,10 +404,11 @@ pub fn detect_cross_user_behavior( } } -/// Minimum inclusive Android SDK version -/// that supports multi-user mode. -/// Lollipop 5.0 -pub const MULTI_USER_SDK: u8 = 21; +#[must_use] +pub const fn supports_disabling(dev: &Phone) -> bool { + // >= Marshmallow (6.0) + dev.android_sdk >= 23 +} /// Check if it might support multi-user mode, /// by simply comparing SDK version. @@ -415,7 +419,8 @@ pub const MULTI_USER_SDK: u8 = 21; /// - #[must_use] pub const fn supports_multi_user(dev: &Phone) -> bool { - dev.android_sdk >= MULTI_USER_SDK + // >= Lollipop (5.0) + dev.android_sdk >= 21 } /// Check if a `user_id` is protected on a device by trying diff --git a/crates/uad-gui/src/views/settings.rs b/crates/uad-gui/src/views/settings.rs index c19b999..3a09b80 100644 --- a/crates/uad-gui/src/views/settings.rs +++ b/crates/uad-gui/src/views/settings.rs @@ -19,7 +19,7 @@ use uad_core::{ save::{backup_phone, list_available_backup_user, list_available_backups, restore_backup}, sync::{ AdbError, CorePackage, Phone, User, get_android_sdk, run_adb_shell_action, - supports_multi_user, + supports_disabling, supports_multi_user, }, utils::{DisplayablePath, Error, NAME, export_packages, generate_backup_name, open_url}, }; @@ -113,7 +113,7 @@ impl Settings { } fn handle_disable_mode(&mut self, phone: &Phone, toggled: bool) -> Task { - if phone.android_sdk >= 23 { + if supports_disabling(phone) { self.device.disable_mode = toggled; debug!("Config change: {self:?}"); let mut config = Config::load_configuration_file(); @@ -170,8 +170,9 @@ impl Settings { None => { self.device = DeviceSettings { device_id: phone.adb_id.clone(), + // see FAQ, and GH-issue #1426 + disable_mode: supports_disabling(phone), multi_user_mode: supports_multi_user(phone), - disable_mode: false, backup, }; } @@ -498,14 +499,14 @@ impl Settings { .size(20) .style(style::CheckBox::SettingsEnabled); - let disable_checkbox_style = if phone.android_sdk >= 23 { + let disable_checkbox_style = if supports_disabling(phone) { style::CheckBox::SettingsEnabled } else { style::CheckBox::SettingsDisabled }; let disable_mode_descr = - text("In some cases, it can be better to disable a package instead of uninstalling it") + text("In many cases, it's better to disable a package instead of uninstalling it") .style(style::Text::Commentary); let unavailable_btn = button(text("Unavailable").size(14)) @@ -522,7 +523,7 @@ impl Settings { .size(20) .style(disable_checkbox_style); - let disable_setting_row = if phone.android_sdk >= 23 { + let disable_setting_row = if supports_disabling(phone) { row![ disable_mode_checkbox, Space::new().width(Length::Fill).height(Length::Shrink),