commit f45c0991c5257d8de0fe9b6ed341f6409b020e16 Author: jegly Date: Fri Mar 27 13:18:34 2026 +1100 Initial release — ATK Android Toolkit v1.0.0 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..46928dc --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,69 @@ +name: Build ATK + +on: + push: + tags: + - 'v*' + workflow_dispatch: + +env: + GO_VERSION: "1.23" + NODE_VERSION: "20" + PNPM_VERSION: "10" + +jobs: + build-linux: + name: Build Linux + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential pkg-config \ + libgtk-3-dev libwebkit2gtk-4.1-dev \ + libayatana-appindicator3-dev + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + cache: true + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: ${{ env.PNPM_VERSION }} + run_install: false + + - name: Install Wails + run: go install github.com/wailsapp/wails/v2/cmd/wails@latest + + - name: Install nfpm + run: go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest + + - name: Install frontend dependencies + run: pnpm install + working-directory: frontend + + - name: Build binary + run: wails build -tags webkit2_41 + + - name: Package .deb + run: nfpm pkg --packager deb --target build/ + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: atk-linux-${{ github.ref_name }} + path: | + build/bin/ATK + build/*.deb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5ba58a --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Build output +build/bin/ +build/*.deb +build/*.rpm +build/*.AppImage +build/*.tar.gz + +# Go +*.exe +*.test +*.prof +vendor/ + +# Frontend +frontend/dist/ +frontend/node_modules/ +frontend/.astro/ + +# Wails dev +frontend/wailsjs/ + +# Editor +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +ATK_*.log + +# Temp +*.tmp +/tmp/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..50ace92 --- /dev/null +++ b/LICENSE @@ -0,0 +1,60 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or you can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these rights. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For the full license text see: https://www.gnu.org/licenses/gpl-3.0.txt + +ATK (Android Toolkit) +Copyright (C) 2025 jegly (https://github.com/jegly) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +--- + +THIRD-PARTY ATTRIBUTIONS + +Universal Android Debloater (UAD-ng) + Package database (uad_lists.json) used under GPL-3.0 + Copyright (C) Universal-Debloater-Alliance + https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation + +Wails v2 + GUI framework used under MIT License + Copyright (C) Lea Anthony + https://github.com/wailsapp/wails + +PixelFlasher + Flash sequence logic studied and independently reimplemented + Original: Copyright (C) Badabing2005, AGPL-3.0 + https://github.com/badabing2005/PixelFlasher diff --git a/README.md b/README.md new file mode 100644 index 0000000..46161a8 --- /dev/null +++ b/README.md @@ -0,0 +1,193 @@ +# ATK — Android Toolkit + +> An all-in-one ADB GUI for Android power users, security researchers, and bug hunters. + +Built with [Wails v2](https://wails.io) (Go + React). Runs natively on Linux, macOS, and Windows. Uses **your system ADB** — no bundled binaries, no mystery executables. + +--- + +## Features + +### 📱 Dashboard +- Live device list with connection status +- Rich device info — model, Android version, build, kernel, CPU, RAM, storage, battery, IP, root status, security patch, bootloader state +- Wireless ADB — enable TCP/IP, connect/disconnect +- One-click reboot to system / recovery / bootloader / fastboot / sideload + +### 📁 File Explorer +- Browse the device filesystem +- Push, pull, rename, copy, delete, create folders +- Batch select and export multiple files +- No timeout on large transfers + +### 📦 Package Manager +- List all / user / system / disabled packages +- Batch install, uninstall, enable, disable +- Pull APK from device, clear data, force stop +- Install APKs from local files + +### 🛡️ Debloater +- **2,157 packages** from the Universal Android Debloater (UAD-ng) database +- Covers: Samsung, Xiaomi, OnePlus/Oppo, Huawei, Sony, Motorola, LG, Nokia, Asus, Realme, Google, Carriers, AOSP +- Safety ratings: Safe / Caution / Keep +- Dependency warnings +- Filter by manufacturer, safety level, or search +- Batch disable or uninstall for user 0 + +### 📜 Live Logcat +- Real-time streaming via Wails events +- Colour-coded by log level (V/D/I/W/E/F) +- Filter by level, tag, or search string +- Buffer selector: main / radio / events / crash / all +- Auto-scroll, save to file, clear buffer + +### 🔍 App Inspector +- Deep package inspection: version, paths, UID, install dates, debuggable flag +- All granted permissions +- Activities, services, broadcast receivers, content providers +- Native libraries (.so files) +- Signing certificate info +- Full package dump +- Certificate pinning heuristic check (OkHttp, TrustKit, networkSecurityConfig) + +### 🔒 Certificate Manager +- List all system and user CA certificates +- Install user CA certificates (for Burp Suite / mitmproxy HTTPS interception) +- Remove user certificates +- Fingerprint and expiry display +- Built-in HTTPS interception setup guide + +### 💾 Device Backup +- `adb backup` with APK, shared storage, and app selection options +- Restore from `.adb` backup files +- Honest warnings about Android 12+ restrictions + +### ⚙️ Prop Editor +- View all 300+ system properties grouped by category +- Search and filter +- Edit properties inline (uses root if available) +- Read-only properties clearly marked + +### 💻 Shell Terminal +- Direct `adb shell` and `adb host` command execution +- Command history (arrow keys) +- No shell injection — args are split directly, no shell interpretation + +### 🔧 Utilities +- **487 commands** across 15 categories: + Device Info, Processes & Memory, Battery & Power, Network & Connectivity, + Permissions & Security, Package Manager, Activities & Services, Sensors & Media, + Logs & Diagnostics, File System, Settings & Config, **Fastboot** (including all + `fastboot oem` commands), Root & Magisk, Instrumentation & Testing, Reboot +- Commands that need arguments prompt inline before running +- Search across all commands +- Output copy button + +### ⚡ Flasher (Fastboot) +- Flash individual partitions +- Fastboot getvar queries +- ADB sideload +- Partition allowlist prevents accidental flashes to wrong targets + +### 📲 Pixel Factory Flash +- Select a Pixel factory image zip directly from Google +- Reads `flash-all.sh` from inside the zip — executes the correct sequence automatically +- Options: wipe data, disable verity, disable verification, **force flash**, flash both slots +- Step-by-step live progress with per-step status +- Live flash log + +--- + +## Security Design + +- **No bundled binaries** — uses system `adb`/`fastboot` from your PATH +- **Settings view shows SHA-256** of whichever binary is being used — verify it yourself +- **No shell string building** — every command uses `exec.Command(binary, arg1, arg2, ...)` with discrete args passed directly to execve. No shell injection surface. +- **Input validation** — package names, partition names, IP addresses, and paths all validated before use +- **Partition allowlist** — fastboot flash only accepts known partition names + +--- + +## Building from Source + +### Prerequisites (Ubuntu/Debian) + +```bash +sudo apt update +sudo apt install -y build-essential pkg-config libgtk-3-dev libwebkit2gtk-4.1-dev \ + libayatana-appindicator3-dev adb fastboot curl wget git + +# Go 1.23 +wget https://go.dev/dl/go1.23.0.linux-amd64.tar.gz +sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz +echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bashrc +source ~/.bashrc + +# Node.js 20 +curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - +sudo apt install -y nodejs +sudo npm install -g pnpm + +# Wails CLI +go install github.com/wailsapp/wails/v2/cmd/wails@latest +``` + +### Build + +```bash +git clone https://github.com/jegly/ATK +cd ATK +go mod tidy +cd frontend && pnpm install && cd .. +wails build -tags webkit2_41 + +# Binary output +./build/bin/ATK +``` + +### Install system-wide + +```bash +sudo cp build/bin/ATK /usr/local/bin/atk +``` + +### Build .deb package + +```bash +# Install nfpm +go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest + +# Build binary first +wails build -tags webkit2_41 + +# Package as .deb +nfpm pkg --packager deb --target build/ +``` + +### Dev mode (hot reload) + +```bash +wails dev -tags webkit2_41 +``` + +--- + +## Licence + +ATK is licensed under the **GNU General Public License v3.0**. + +The debloater package database is sourced from +[Universal Android Debloater Next Generation](https://github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation) +(GPL-3.0, Universal-Debloater-Alliance). + +See [LICENSE](LICENSE) for full terms and third-party attributions. + +--- + +## Acknowledgements + +- [Universal Android Debloater Alliance](https://github.com/Universal-Debloater-Alliance) — package database +- [Wails](https://wails.io) — Go + Web framework +- [PixelFlasher](https://github.com/badabing2005/PixelFlasher) — Pixel flash sequence reference +- [Lucide](https://lucide.dev) — icons +- [shadcn/ui](https://ui.shadcn.com) — UI components diff --git a/app.go b/app.go new file mode 100644 index 0000000..292f73a --- /dev/null +++ b/app.go @@ -0,0 +1,93 @@ +package main + +import ( + "context" + "sync" +) + +// DeviceMode represents whether a device is in ADB or Fastboot mode +type DeviceMode string + +const ( + DeviceModeUnknown DeviceMode = "unknown" + DeviceModeADB DeviceMode = "adb" + DeviceModeFastboot DeviceMode = "fastboot" +) + +// Device represents a connected ADB device +type Device struct { + Serial string `json:"serial"` + Status string `json:"status"` +} + +// DeviceInfo holds detailed information about a connected device +type DeviceInfo struct { + Model string `json:"model"` + AndroidVersion string `json:"androidVersion"` + BuildNumber string `json:"buildNumber"` + BatteryLevel string `json:"batteryLevel"` + Serial string `json:"serial"` + IPAddress string `json:"ipAddress"` + RootStatus string `json:"rootStatus"` + Codename string `json:"codename"` + RamTotal string `json:"ramTotal"` + StorageInfo string `json:"storageInfo"` + Brand string `json:"brand"` + DeviceName string `json:"deviceName"` + SecurityPatch string `json:"securityPatch"` + Uptime string `json:"uptime"` + BootloaderStatus string `json:"bootloaderStatus"` + ScreenResolution string `json:"screenResolution"` + BasebandVersion string `json:"basebandVersion"` + KernelVersion string `json:"kernelVersion"` + CPUArch string `json:"cpuArch"` +} + +// FileEntry represents a file or directory on the device +type FileEntry struct { + Name string `json:"name"` + Type string `json:"type"` + Size string `json:"size"` + Permissions string `json:"permissions"` + Date string `json:"date"` + Time string `json:"time"` +} + +// PackageInfo represents an installed app package +type PackageInfo struct { + PackageName string `json:"packageName"` + IsEnabled bool `json:"isEnabled"` +} + +// AdbConfig holds user-configurable ADB settings +type AdbConfig struct { + AdbPath string `json:"adbPath"` + FastbootPath string `json:"fastbootPath"` +} + +// App is the main application struct +type App struct { + ctx context.Context + config AdbConfig + + // binary path cache + binaryCache map[string]string + cacheMutex sync.RWMutex + + // cancellation for long-running ops + currentCancel context.CancelFunc + opMutex sync.Mutex +} + +// NewApp creates a new App instance +func NewApp() *App { + return &App{ + binaryCache: make(map[string]string), + config: AdbConfig{}, + } +} + +// Startup is called when the app starts +func (a *App) Startup(ctx context.Context) { + a.ctx = ctx +} diff --git a/backend_appinspect.go b/backend_appinspect.go new file mode 100644 index 0000000..43a6f0a --- /dev/null +++ b/backend_appinspect.go @@ -0,0 +1,183 @@ +package main + +import ( + "fmt" + "strings" +) + +type AppInspection struct { + PackageName string `json:"packageName"` + VersionName string `json:"versionName"` + VersionCode string `json:"versionCode"` + TargetSDK string `json:"targetSdk"` + MinSDK string `json:"minSdk"` + InstallPath string `json:"installPath"` + DataDir string `json:"dataDir"` + Installer string `json:"installer"` + FirstInstall string `json:"firstInstall"` + LastUpdated string `json:"lastUpdated"` + IsSystem bool `json:"isSystem"` + IsEnabled bool `json:"isEnabled"` + IsDebuggable bool `json:"isDebuggable"` + UID string `json:"uid"` + Permissions []string `json:"permissions"` + Activities []string `json:"activities"` + Services []string `json:"services"` + Receivers []string `json:"receivers"` + Providers []string `json:"providers"` + NativeLibs []string `json:"nativeLibs"` + SharedLibs []string `json:"sharedLibs"` + CertSubject string `json:"certSubject"` + CertIssuer string `json:"certIssuer"` + CertExpiry string `json:"certExpiry"` + CertSHA256 string `json:"certSha256"` + ManifestDump string `json:"manifestDump"` +} + +// InspectApp returns deep information about an installed package. +func (a *App) InspectApp(packageName string) (AppInspection, error) { + if err := validatePackageName(packageName); err != nil { + return AppInspection{}, err + } + + result := AppInspection{PackageName: packageName} + + // Full package dump + dump, err := a.runAdbShellTimeout(30*1e9, "dumpsys", "package", packageName) + if err != nil { + return result, fmt.Errorf("failed to dump package: %w", err) + } + + result.ManifestDump = dump + + // Parse key fields from dump + for _, line := range strings.Split(dump, "\n") { + line = strings.TrimSpace(line) + switch { + case strings.HasPrefix(line, "versionName="): + result.VersionName = strings.TrimPrefix(line, "versionName=") + case strings.HasPrefix(line, "versionCode="): + parts := strings.Fields(line) + if len(parts) > 0 { + result.VersionCode = strings.TrimPrefix(parts[0], "versionCode=") + } + case strings.HasPrefix(line, "targetSdk="): + result.TargetSDK = strings.TrimPrefix(line, "targetSdk=") + case strings.HasPrefix(line, "minSdk="): + result.MinSDK = strings.TrimPrefix(line, "minSdk=") + case strings.HasPrefix(line, "codePath="): + result.InstallPath = strings.TrimPrefix(line, "codePath=") + case strings.HasPrefix(line, "dataDir="): + result.DataDir = strings.TrimPrefix(line, "dataDir=") + case strings.HasPrefix(line, "installerPackageName="): + result.Installer = strings.TrimPrefix(line, "installerPackageName=") + case strings.HasPrefix(line, "firstInstallTime="): + result.FirstInstall = strings.TrimPrefix(line, "firstInstallTime=") + case strings.HasPrefix(line, "lastUpdateTime="): + result.LastUpdated = strings.TrimPrefix(line, "lastUpdateTime=") + case strings.HasPrefix(line, "pkgFlags="): + flags := line + result.IsSystem = strings.Contains(flags, "SYSTEM") + result.IsDebuggable = strings.Contains(flags, "DEBUGGABLE") + case strings.HasPrefix(line, "userId="): + result.UID = strings.TrimPrefix(line, "userId=") + case strings.HasPrefix(line, "enabledState="): + result.IsEnabled = strings.Contains(line, "ENABLED") && !strings.Contains(line, "DISABLED") + } + } + + // Granted permissions + perms, _ := a.runAdbShell("dumpsys", "package", packageName) + inPerms := false + for _, line := range strings.Split(perms, "\n") { + trimmed := strings.TrimSpace(line) + if strings.Contains(trimmed, "granted=true") || strings.Contains(trimmed, "install permissions:") { + inPerms = true + } + if inPerms && strings.HasPrefix(trimmed, "android.permission.") { + perm := strings.Split(trimmed, ":")[0] + result.Permissions = append(result.Permissions, perm) + } + if inPerms && trimmed == "" { + inPerms = false + } + } + + // Activities, services, receivers, providers via pm dump + pmDump, _ := a.runAdbShell("pm", "dump", packageName) + section := "" + for _, line := range strings.Split(pmDump, "\n") { + trimmed := strings.TrimSpace(line) + switch { + case strings.Contains(trimmed, "Activity Resolver Table"): + section = "activities" + case strings.Contains(trimmed, "Service Resolver Table"): + section = "services" + case strings.Contains(trimmed, "Receiver Resolver Table"): + section = "receivers" + case strings.Contains(trimmed, "Provider Resolver Table"): + section = "providers" + case strings.Contains(trimmed, "Key Set Manager"): + section = "" + } + + if section != "" && strings.Contains(trimmed, packageName+"/") { + parts := strings.Fields(trimmed) + for _, p := range parts { + if strings.Contains(p, packageName+"/") { + className := strings.Split(p, "/")[1] + switch section { + case "activities": + result.Activities = appendUnique(result.Activities, className) + case "services": + result.Services = appendUnique(result.Services, className) + case "receivers": + result.Receivers = appendUnique(result.Receivers, className) + case "providers": + result.Providers = appendUnique(result.Providers, className) + } + } + } + } + } + + // Native libraries + apkPath := strings.TrimPrefix(strings.TrimSpace(result.InstallPath), "package:") + if apkPath != "" { + libOut, _ := a.runAdbShell("unzip", "-l", apkPath+"/base.apk") + for _, line := range strings.Split(libOut, "\n") { + if strings.Contains(line, "lib/") && strings.HasSuffix(line, ".so") { + parts := strings.Fields(line) + if len(parts) > 0 { + result.NativeLibs = appendUnique(result.NativeLibs, parts[len(parts)-1]) + } + } + } + } + + // Certificate info via apksigner or keytool + certOut, _ := a.runAdbShell("pm", "dump", packageName) + for _, line := range strings.Split(certOut, "\n") { + trimmed := strings.TrimSpace(line) + if strings.Contains(trimmed, "Signing certificates:") { + // next lines have cert info + } + if strings.HasPrefix(trimmed, "Subject:") { + result.CertSubject = strings.TrimPrefix(trimmed, "Subject: ") + } + if strings.HasPrefix(trimmed, "Issuer:") { + result.CertIssuer = strings.TrimPrefix(trimmed, "Issuer: ") + } + } + + return result, nil +} + +func appendUnique(slice []string, item string) []string { + for _, s := range slice { + if s == item { + return slice + } + } + return append(slice, item) +} diff --git a/backend_backup.go b/backend_backup.go new file mode 100644 index 0000000..1a4b96d --- /dev/null +++ b/backend_backup.go @@ -0,0 +1,121 @@ +package main + +import ( + "context" + "fmt" + "strings" + "time" +) + +type BackupOptions struct { + IncludeAPKs bool `json:"includeApks"` + IncludeShared bool `json:"includeShared"` + IncludeSystem bool `json:"includeSystem"` + Packages []string `json:"packages"` + AllApps bool `json:"allApps"` +} + +// StartBackup runs adb backup with the given options. +// The user will need to confirm on the device screen. +func (a *App) StartBackup(opts BackupOptions, localPath string) (string, error) { + if localPath == "" { + var err error + localPath, err = a.SelectSaveFile("backup.adb") + if err != nil || localPath == "" { + return "Backup cancelled", nil + } + } + + args := []string{"backup", "-f", localPath} + + if opts.IncludeAPKs { + args = append(args, "-apk") + } else { + args = append(args, "-noapk") + } + + if opts.IncludeShared { + args = append(args, "-shared") + } else { + args = append(args, "-noshared") + } + + if opts.IncludeSystem { + args = append(args, "-system") + } else { + args = append(args, "-nosystem") + } + + if opts.AllApps { + args = append(args, "-all") + } else if len(opts.Packages) > 0 { + args = append(args, opts.Packages...) + } + + ctx, cancel := a.beginCancellableOp(0) // no timeout — user cancellable + defer cancel() + + out, err := a.runCommandContext(ctx, "adb", args...) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + return "Backup cancelled", nil + } + return "", fmt.Errorf("backup failed: %w", err) + } + + return fmt.Sprintf("Backup saved to %s\n%s", localPath, out), nil +} + +// RestoreBackup restores from an .adb backup file. +func (a *App) RestoreBackup(localPath string) (string, error) { + if localPath == "" { + return "", fmt.Errorf("no backup file specified") + } + + ctx, cancel := a.beginCancellableOp(0) + defer cancel() + + out, err := a.runCommandContext(ctx, "adb", "restore", localPath) + if err != nil { + return "", fmt.Errorf("restore failed: %w", err) + } + + return "Restore initiated. Confirm on device.\n" + out, nil +} + +// SelectBackupFile opens a file picker for .adb backup files. +func (a *App) SelectBackupFile() (string, error) { + return a.SelectFileWithFilter("Select backup file", []string{"*.adb", "*.ab"}) +} + +// GetInstalledUserApps returns list of user-installed packages for backup selection. +func (a *App) GetInstalledUserApps() ([]PackageInfo, error) { + return a.ListPackages("user") +} + +// BackupSingleApp backs up a single app by package name. +func (a *App) BackupSingleApp(packageName string, includeAPK bool) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + + localPath, err := a.SelectSaveFile(packageName + ".adb") + if err != nil || localPath == "" { + return "Backup cancelled", nil + } + + apkFlag := "-noapk" + if includeAPK { + apkFlag = "-apk" + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) + defer cancel() + + out, err := a.runCommandContext(ctx, "adb", "backup", "-f", localPath, apkFlag, "-noshared", packageName) + if err != nil { + return "", fmt.Errorf("backup failed: %w", err) + } + + return fmt.Sprintf("App backup saved to %s\n%s", localPath, out), nil +} diff --git a/backend_cert.go b/backend_cert.go new file mode 100644 index 0000000..404e449 --- /dev/null +++ b/backend_cert.go @@ -0,0 +1,179 @@ +package main + +import ( + "fmt" + "strings" + "time" +) + +type CertInfo struct { + Filename string `json:"filename"` + Subject string `json:"subject"` + Issuer string `json:"issuer"` + Expiry string `json:"expiry"` + Fingerprint string `json:"fingerprint"` + IsUser bool `json:"isUser"` + IsSystem bool `json:"isSystem"` +} + +// ListSystemCerts returns all system CA certificates. +func (a *App) ListSystemCerts() ([]CertInfo, error) { + return a.listCerts("/system/etc/security/cacerts", false) +} + +// ListUserCerts returns user-installed CA certificates. +func (a *App) ListUserCerts() ([]CertInfo, error) { + return a.listCerts("/data/misc/user/0/cacerts-added", true) +} + +func (a *App) listCerts(path string, isUser bool) ([]CertInfo, error) { + out, err := a.runAdbShell("ls", path) + if err != nil || strings.TrimSpace(out) == "" { + return nil, nil + } + + var certs []CertInfo + for _, fname := range strings.Fields(out) { + fname = strings.TrimSpace(fname) + if fname == "" || strings.HasPrefix(fname, "ls:") { + continue + } + + fullPath := path + "/" + fname + certOut, err := a.runAdbShellTimeout(10*time.Second, "openssl", "x509", + "-in", fullPath, "-noout", "-subject", "-issuer", "-enddate", "-fingerprint") + + info := CertInfo{ + Filename: fname, + IsUser: isUser, + IsSystem: !isUser, + } + + if err == nil { + for _, line := range strings.Split(certOut, "\n") { + line = strings.TrimSpace(line) + switch { + case strings.HasPrefix(line, "subject="): + info.Subject = strings.TrimPrefix(line, "subject=") + case strings.HasPrefix(line, "issuer="): + info.Issuer = strings.TrimPrefix(line, "issuer=") + case strings.HasPrefix(line, "notAfter="): + info.Expiry = strings.TrimPrefix(line, "notAfter=") + case strings.HasPrefix(line, "SHA1 Fingerprint="): + info.Fingerprint = strings.TrimPrefix(line, "SHA1 Fingerprint=") + case strings.HasPrefix(line, "SHA256 Fingerprint="): + info.Fingerprint = strings.TrimPrefix(line, "SHA256 Fingerprint=") + } + } + } + + certs = append(certs, info) + } + + return certs, nil +} + +// InstallUserCert installs a PEM certificate as a user-trusted CA. +// localCertPath is the path to the cert on the host machine. +func (a *App) InstallUserCert(localCertPath string) (string, error) { + // Get the cert hash (used as filename by Android) + // Push the cert to a temp location first + remoteTmp := "/sdcard/tmp_cert.pem" + _, err := a.runCommand("adb", "push", localCertPath, remoteTmp) + if err != nil { + return "", fmt.Errorf("failed to push cert: %w", err) + } + + // Get the hash + hashOut, err := a.runAdbShell("openssl", "x509", "-inform", "PEM", + "-subject_hash_old", "-in", remoteTmp) + if err != nil { + return "", fmt.Errorf("failed to compute cert hash (is openssl on device?): %w", err) + } + + hash := strings.TrimSpace(strings.Split(hashOut, "\n")[0]) + if hash == "" { + return "", fmt.Errorf("could not compute certificate hash") + } + + destPath := "/data/misc/user/0/cacerts-added/" + hash + ".0" + + // Requires root + _, err = a.runAdbShell("su", "-c", + fmt.Sprintf("cp %s %s && chmod 644 %s", remoteTmp, destPath, destPath)) + if err != nil { + return "", fmt.Errorf("failed to install cert (root required): %w", err) + } + + // Cleanup + a.runAdbShell("rm", remoteTmp) + + return fmt.Sprintf("Certificate installed as %s.0 — you may need to reboot", hash), nil +} + +// RemoveUserCert removes a user-installed CA certificate by filename. +func (a *App) RemoveUserCert(filename string) (string, error) { + if strings.Contains(filename, "/") || strings.Contains(filename, "..") { + return "", fmt.Errorf("invalid certificate filename") + } + + destPath := "/data/misc/user/0/cacerts-added/" + filename + _, err := a.runAdbShell("su", "-c", "rm "+destPath) + if err != nil { + return "", fmt.Errorf("failed to remove cert (root required): %w", err) + } + + return "Certificate removed: " + filename, nil +} + +// SelectCertFile opens a file picker for PEM/CRT files. +func (a *App) SelectCertFile() (string, error) { + return a.SelectFileWithFilter("Select CA Certificate", []string{"*.pem", "*.crt", "*.cer"}) +} + +// CheckPinning checks if an app has certificate pinning configured. +// This is a heuristic check based on known pinning libraries and manifest flags. +func (a *App) CheckPinning(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + + results := []string{} + + // Check network security config + dump, err := a.runAdbShell("dumpsys", "package", packageName) + if err != nil { + return "", fmt.Errorf("failed to dump package: %w", err) + } + + if strings.Contains(dump, "networkSecurityConfig") { + results = append(results, "⚠ networkSecurityConfig present — may have custom trust anchors or pinning") + } + + // Check for known pinning libraries in the APK + apkPath, _ := a.runAdbShell("pm", "path", packageName) + apkPath = strings.TrimPrefix(strings.TrimSpace(apkPath), "package:") + + if apkPath != "" { + zipList, _ := a.runAdbShell("unzip", "-l", apkPath) + checks := map[string]string{ + "okhttp3": "OkHttp3 — likely has CertificatePinner", + "TrustKit": "TrustKit — SSL pinning library", + "conscrypt": "Conscrypt — custom SSL provider", + "PublicKeyPins": "PublicKeyPins — HPKP style pinning", + "pinning": "pinning — generic pinning reference", + "certificate_transparency": "Certificate Transparency enforced", + } + for keyword, desc := range checks { + if strings.Contains(strings.ToLower(zipList), strings.ToLower(keyword)) { + results = append(results, "⚠ "+desc) + } + } + } + + if len(results) == 0 { + return "No obvious pinning detected — but always verify with a proxy (Burp/mitmproxy)", nil + } + + return strings.Join(results, "\n"), nil +} diff --git a/backend_logcat.go b/backend_logcat.go new file mode 100644 index 0000000..457aeb7 --- /dev/null +++ b/backend_logcat.go @@ -0,0 +1,141 @@ +package main + +import ( + "bufio" + "context" + "fmt" + "os/exec" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/pkg/runtime" +) + +type LogcatLine struct { + Raw string `json:"raw"` + Level string `json:"level"` + Tag string `json:"tag"` + Message string `json:"message"` + PID string `json:"pid"` + Time string `json:"time"` +} + +var ( + logcatCancel context.CancelFunc + logcatMu sync.Mutex +) + +// StartLogcat begins streaming logcat to the frontend via events. +// filter: optional tag filter e.g. "ActivityManager:I *:S" +// buffer: "main", "radio", "events", "crash", or "all" +func (a *App) StartLogcat(filter string, buffer string) error { + logcatMu.Lock() + defer logcatMu.Unlock() + + // Stop any existing logcat + if logcatCancel != nil { + logcatCancel() + logcatCancel = nil + } + + adbPath, err := a.getBinaryPath("adb") + if err != nil { + return err + } + + args := []string{"logcat", "-v", "threadtime"} + + if buffer != "" && buffer != "main" { + if buffer == "all" { + args = append(args, "-b", "all") + } else { + args = append(args, "-b", buffer) + } + } + + if filter != "" { + args = append(args, strings.Fields(filter)...) + } + + ctx, cancel := context.WithCancel(context.Background()) + logcatCancel = cancel + + cmd := exec.CommandContext(ctx, adbPath, args...) + setCommandSysProcAttr(cmd) + + stdout, err := cmd.StdoutPipe() + if err != nil { + cancel() + return fmt.Errorf("failed to get stdout pipe: %w", err) + } + + if err := cmd.Start(); err != nil { + cancel() + return fmt.Errorf("failed to start logcat: %w", err) + } + + go func() { + defer cancel() + scanner := bufio.NewScanner(stdout) + scanner.Buffer(make([]byte, 1024*1024), 1024*1024) + for scanner.Scan() { + line := scanner.Text() + parsed := parseLogcatLine(line) + runtime.EventsEmit(a.ctx, "logcat:line", parsed) + } + runtime.EventsEmit(a.ctx, "logcat:stopped", nil) + cmd.Wait() + }() + + return nil +} + +// StopLogcat stops the running logcat stream. +func (a *App) StopLogcat() { + logcatMu.Lock() + defer logcatMu.Unlock() + if logcatCancel != nil { + logcatCancel() + logcatCancel = nil + } +} + +// ClearLogcat clears all logcat buffers. +func (a *App) ClearLogcat() error { + _, err := a.runCommand("adb", "logcat", "-c") + return err +} + +// parseLogcatLine parses a threadtime format logcat line: +// MM-DD HH:MM:SS.mmm PID TID LEVEL TAG: message +func parseLogcatLine(line string) LogcatLine { + result := LogcatLine{Raw: line} + + parts := strings.SplitN(line, " ", 7) + if len(parts) < 7 { + result.Message = line + return result + } + + result.Time = strings.TrimSpace(parts[0] + " " + parts[1]) + result.PID = strings.TrimSpace(parts[2]) + // parts[3] = TID + level := strings.TrimSpace(parts[4]) + if len(level) > 0 { + result.Level = level + } + tagAndMsg := strings.TrimSpace(parts[5]) + if idx := strings.Index(tagAndMsg, ":"); idx >= 0 { + result.Tag = strings.TrimSpace(tagAndMsg[:idx]) + if len(parts) > 6 { + result.Message = strings.TrimSpace(parts[6]) + } + } else { + result.Tag = tagAndMsg + if len(parts) > 6 { + result.Message = strings.TrimSpace(parts[6]) + } + } + + return result +} diff --git a/backend_props.go b/backend_props.go new file mode 100644 index 0000000..0fe0a6f --- /dev/null +++ b/backend_props.go @@ -0,0 +1,137 @@ +package main + +import ( + "fmt" + "sort" + "strings" +) + +type PropEntry struct { + Key string `json:"key"` + Value string `json:"value"` + Category string `json:"category"` +} + +// GetAllProps returns all system properties as structured entries. +func (a *App) GetAllProps() ([]PropEntry, error) { + out, err := a.runAdbShell("getprop") + if err != nil { + return nil, fmt.Errorf("failed to get props: %w", err) + } + + var props []PropEntry + for _, line := range strings.Split(out, "\n") { + line = strings.TrimSpace(line) + if !strings.HasPrefix(line, "[") { + continue + } + + // Format: [key]: [value] + line = strings.TrimPrefix(line, "[") + parts := strings.SplitN(line, "]: [", 2) + if len(parts) != 2 { + continue + } + + key := parts[0] + value := strings.TrimSuffix(parts[1], "]") + + props = append(props, PropEntry{ + Key: key, + Value: value, + Category: categorizeProp(key), + }) + } + + sort.Slice(props, func(i, j int) bool { + return props[i].Key < props[j].Key + }) + + return props, nil +} + +// SetProp sets a system property value. +// Note: many system props are read-only and require root to change. +func (a *App) SetProp(key, value string) (string, error) { + if key == "" { + return "", fmt.Errorf("key cannot be empty") + } + // Validate key characters + for _, ch := range key { + if ch == ';' || ch == '&' || ch == '|' || ch == '`' || ch == '$' || ch == '\n' { + return "", fmt.Errorf("invalid character in property key") + } + } + + // Try setprop first (works for some props without root) + _, err := a.runAdbShell("setprop", key, value) + if err != nil { + // Try with root + _, err2 := a.runAdbShell("su", "-c", fmt.Sprintf("setprop %s %s", key, value)) + if err2 != nil { + return "", fmt.Errorf("failed to set prop (may be read-only or need root): %w", err) + } + } + + // Verify + newVal, _ := a.runAdbShell("getprop", key) + return fmt.Sprintf("Set %s = %s", key, strings.TrimSpace(newVal)), nil +} + +// GetProp gets a single property value. +func (a *App) GetProp(key string) (string, error) { + if key == "" { + return "", fmt.Errorf("key cannot be empty") + } + out, err := a.runAdbShell("getprop", key) + if err != nil { + return "", err + } + return strings.TrimSpace(out), nil +} + +// categorizeProp assigns a category to a property based on its key prefix. +func categorizeProp(key string) string { + switch { + case strings.HasPrefix(key, "ro.build"): + return "Build" + case strings.HasPrefix(key, "ro.product"): + return "Product" + case strings.HasPrefix(key, "ro.boot"): + return "Boot" + case strings.HasPrefix(key, "ro.hardware"): + return "Hardware" + case strings.HasPrefix(key, "ro.crypto"): + return "Security" + case strings.HasPrefix(key, "ro.debuggable") || + strings.HasPrefix(key, "service.adb"): + return "Debug" + case strings.HasPrefix(key, "persist."): + return "Persist" + case strings.HasPrefix(key, "sys."): + return "System" + case strings.HasPrefix(key, "net.") || + strings.HasPrefix(key, "dhcp.") || + strings.HasPrefix(key, "wifi."): + return "Network" + case strings.HasPrefix(key, "gsm.") || + strings.HasPrefix(key, "ril.") || + strings.HasPrefix(key, "telephony."): + return "Telephony" + case strings.HasPrefix(key, "dalvik."): + return "Dalvik/ART" + case strings.HasPrefix(key, "init."): + return "Init" + case strings.HasPrefix(key, "dev."): + return "Device" + case strings.HasPrefix(key, "audio.") || + strings.HasPrefix(key, "media."): + return "Media" + case strings.HasPrefix(key, "camera."): + return "Camera" + case strings.HasPrefix(key, "bluetooth."): + return "Bluetooth" + default: + return "Other" + } +} diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000..41ea814 --- /dev/null +++ b/build/README.md @@ -0,0 +1,37 @@ +# Build Directory + +## Building the binary + +```bash +wails build -tags webkit2_41 +# Output: build/bin/ATK +``` + +## Building the .deb package + +Requires [nfpm](https://nfpm.goreleaser.com/): + +```bash +go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest +``` + +Then build the binary first, then package: + +```bash +wails build -tags webkit2_41 +nfpm pkg --packager deb --target build/ +# Output: build/atk_1.0.0_amd64.deb +``` + +Install the .deb: + +```bash +sudo dpkg -i build/atk_1.0.0_amd64.deb +# Then run: +atk +``` + +## App icon + +Replace `build/appicon.png` with a 256x256 PNG to customise the application icon. +The icon is used in the .deb package and the Linux app launcher. diff --git a/build/atk.desktop b/build/atk.desktop new file mode 100644 index 0000000..efd683d --- /dev/null +++ b/build/atk.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=ATK +GenericName=Android Toolkit +Comment=All-in-one ADB GUI for Android power users and bug hunters +Exec=/opt/atk/ATK +Icon=atk +Categories=Development;Utility; +Terminal=false +StartupWMClass=ATK +Keywords=android;adb;fastboot;debloat;logcat;flash; diff --git a/device_service.go b/device_service.go new file mode 100644 index 0000000..737c372 --- /dev/null +++ b/device_service.go @@ -0,0 +1,373 @@ +package main + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "sync" +) + +// GetDevices returns all connected ADB devices. +func (a *App) GetDevices() ([]Device, error) { + output, err := a.runCommand("adb", "devices") + if err != nil { + return nil, err + } + + var devices []Device + lines := strings.Split(output, "\n") + + // First line is "List of devices attached" header + for _, line := range lines[1:] { + line = strings.TrimSpace(line) + if line == "" { + continue + } + parts := strings.Fields(line) + if len(parts) >= 2 { + devices = append(devices, Device{ + Serial: parts[0], + Status: parts[1], + }) + } + } + + return devices, nil +} + +// getProp fetches a single Android system property. +// Uses shell getprop with the property name as a discrete argument - safe. +func (a *App) getProp(prop string) string { + // prop is passed as a discrete arg - no shell injection possible + output, err := a.runAdbShell("getprop", prop) + if err != nil { + return "N/A" + } + v := strings.TrimSpace(output) + if v == "" { + return "N/A" + } + return v +} + +// checkRootStatus checks if the device is rooted by attempting `su -c id`. +func (a *App) checkRootStatus() string { + // "su", "-c", "id" are all discrete args + output, err := a.runAdbShell("su", "-c", "id") + if err == nil && strings.TrimSpace(output) == "0" { + return "Rooted" + } + + // Try alternative: check if su binary exists + suCheck, err := a.runAdbShell("which", "su") + if err == nil && strings.TrimSpace(suCheck) != "" { + return "Rooted (su present)" + } + + return "Not rooted" +} + +// getIPAddress retrieves the device WiFi IP address. +func (a *App) getIPAddress() string { + // Use ip addr show wlan0 - args are discrete + output, err := a.runAdbShell("ip", "addr", "show", "wlan0") + if err == nil { + re := regexp.MustCompile(`inet (\d+\.\d+\.\d+\.\d+)/\d+`) + if m := re.FindStringSubmatch(output); len(m) > 1 { + return m[1] + } + } + + // Fallback: dhcp property + ip := a.getProp("dhcp.wlan0.ipaddress") + if ip != "N/A" && ip != "" { + return ip + } + + return "N/A" +} + +// getRamInfo returns total RAM as a formatted string. +func (a *App) getRamInfo() string { + // cat /proc/meminfo - path is a constant, safe discrete arg + output, err := a.runAdbShell("cat", "/proc/meminfo") + if err != nil { + return "N/A" + } + + re := regexp.MustCompile(`MemTotal:\s*(\d+)\s*kB`) + m := re.FindStringSubmatch(output) + if len(m) < 2 { + return "N/A" + } + + kb, err := strconv.ParseFloat(m[1], 64) + if err != nil { + return "N/A" + } + + return fmt.Sprintf("%.1f GB", kb/1024/1024) +} + +// getStorageInfo returns used/total storage for /data. +func (a *App) getStorageInfo() string { + // df with /data as discrete arg + output, err := a.runAdbShell("df", "/data") + if err != nil { + return "N/A" + } + + lines := strings.Split(output, "\n") + if len(lines) < 2 { + return "N/A" + } + + fields := strings.Fields(lines[1]) + if len(fields) < 4 { + return "N/A" + } + + totalKB, err1 := strconv.ParseFloat(fields[1], 64) + usedKB, err2 := strconv.ParseFloat(fields[2], 64) + if err1 != nil || err2 != nil { + return "N/A" + } + + return fmt.Sprintf("%.1f GB / %.1f GB", usedKB/1024/1024, totalKB/1024/1024) +} + +// getBatteryLevel returns the current battery percentage. +func (a *App) getBatteryLevel() string { + // dumpsys battery - tool and subcommand as discrete args + output, err := a.runAdbShell("dumpsys", "battery") + if err != nil { + return "N/A" + } + + re := regexp.MustCompile(`level:\s*(\d+)`) + m := re.FindStringSubmatch(output) + if len(m) > 1 { + return m[1] + "%" + } + return "N/A" +} + +// getScreenResolution returns the device screen resolution. +func (a *App) getScreenResolution() string { + // wm size - tool and subcommand as discrete args + output, err := a.runAdbShell("wm", "size") + if err != nil { + return "N/A" + } + + re := regexp.MustCompile(`Physical size:\s*(\d+x\d+)`) + m := re.FindStringSubmatch(output) + if len(m) > 1 { + return m[1] + } + return "N/A" +} + +// getUptime returns the device uptime in human-readable form. +func (a *App) getUptime() string { + // cat /proc/uptime - constant path, safe + output, err := a.runAdbShell("cat", "/proc/uptime") + if err != nil { + return "N/A" + } + + parts := strings.Fields(output) + if len(parts) == 0 { + return "N/A" + } + + seconds, err := strconv.ParseFloat(parts[0], 64) + if err != nil { + return "N/A" + } + + days := int(seconds) / 86400 + hours := (int(seconds) % 86400) / 3600 + mins := (int(seconds) % 3600) / 60 + + if days > 0 { + return fmt.Sprintf("%dd %dh %dm", days, hours, mins) + } + if hours > 0 { + return fmt.Sprintf("%dh %dm", hours, mins) + } + return fmt.Sprintf("%dm", mins) +} + +// getKernelVersion returns the Linux kernel version. +func (a *App) getKernelVersion() string { + // uname -r - tool and flag as discrete args + output, err := a.runAdbShell("uname", "-r") + if err != nil { + return "N/A" + } + return strings.TrimSpace(output) +} + +// getCPUArch returns the device CPU architecture. +func (a *App) getCPUArch() string { + return a.getProp("ro.product.cpu.abi") +} + +// GetDeviceInfo fetches all device information concurrently. +func (a *App) GetDeviceInfo() (DeviceInfo, error) { + var info DeviceInfo + var wg sync.WaitGroup + var mu sync.Mutex + + // Simple props fetched concurrently + propJobs := []struct { + prop string + setter func(string) + }{ + {"ro.product.model", func(v string) { info.Model = v }}, + {"ro.build.version.release", func(v string) { info.AndroidVersion = v }}, + {"ro.build.id", func(v string) { info.BuildNumber = v }}, + {"ro.product.device", func(v string) { info.Codename = v }}, + {"ro.product.brand", func(v string) { info.Brand = v }}, + {"ro.product.name", func(v string) { info.DeviceName = v }}, + {"ro.build.version.security_patch", func(v string) { info.SecurityPatch = v }}, + {"ro.bootloader", func(v string) { info.BootloaderStatus = v }}, + {"gsm.version.baseband", func(v string) { info.BasebandVersion = v }}, + {"ro.product.cpu.abi", func(v string) { info.CPUArch = v }}, + } + + for _, job := range propJobs { + wg.Add(1) + go func(prop string, setter func(string)) { + defer wg.Done() + val := a.getProp(prop) + mu.Lock() + setter(val) + mu.Unlock() + }(job.prop, job.setter) + } + + // Complex getters + complexJobs := []struct { + fn func() string + setter func(string) + }{ + {a.getIPAddress, func(v string) { info.IPAddress = v }}, + {a.checkRootStatus, func(v string) { info.RootStatus = v }}, + {a.getRamInfo, func(v string) { info.RamTotal = v }}, + {a.getStorageInfo, func(v string) { info.StorageInfo = v }}, + {a.getBatteryLevel, func(v string) { info.BatteryLevel = v }}, + {a.getScreenResolution, func(v string) { info.ScreenResolution = v }}, + {a.getUptime, func(v string) { info.Uptime = v }}, + {a.getKernelVersion, func(v string) { info.KernelVersion = v }}, + } + + for _, job := range complexJobs { + wg.Add(1) + go func(fn func() string, setter func(string)) { + defer wg.Done() + val := fn() + mu.Lock() + setter(val) + mu.Unlock() + }(job.fn, job.setter) + } + + // Serial number + wg.Add(1) + go func() { + defer wg.Done() + serial, err := a.runCommand("adb", "get-serialno") + mu.Lock() + if err == nil { + info.Serial = strings.TrimSpace(serial) + } else { + info.Serial = a.getProp("ro.serialno") + } + mu.Unlock() + }() + + wg.Wait() + + return info, nil +} + +// detectDeviceMode checks whether the device is in ADB or Fastboot mode. +func (a *App) detectDeviceMode() (DeviceMode, error) { + adbDevices, adbErr := a.GetDevices() + if adbErr == nil { + for _, d := range adbDevices { + switch strings.ToLower(strings.TrimSpace(d.Status)) { + case "device", "recovery", "sideload": + return DeviceModeADB, nil + } + } + } + + fbDevices, fbErr := a.GetFastbootDevices() + if fbErr == nil && len(fbDevices) > 0 { + return DeviceModeFastboot, nil + } + + if adbErr != nil && fbErr != nil { + return DeviceModeUnknown, fmt.Errorf("no device: adb: %v; fastboot: %v", adbErr, fbErr) + } + + return DeviceModeUnknown, nil +} + +// GetDeviceMode returns the current device connection mode as a string. +func (a *App) GetDeviceMode() (string, error) { + mode, err := a.detectDeviceMode() + return string(mode), err +} + +// Reboot reboots the device into the specified mode. +// mode can be: "" (normal), "recovery", "bootloader", "fastboot", "sideload" +func (a *App) Reboot(mode string) error { + mode = strings.TrimSpace(mode) + + // Validate mode against known values - no arbitrary strings + validModes := map[string]bool{ + "": true, + "recovery": true, + "bootloader": true, + "fastboot": true, + "sideload": true, + } + if !validModes[mode] { + return fmt.Errorf("invalid reboot mode: %q", mode) + } + + connectionMode, err := a.detectDeviceMode() + if err != nil { + return err + } + + switch connectionMode { + case DeviceModeADB: + args := []string{"reboot"} + if mode != "" { + args = append(args, mode) + } + _, err := a.runCommand("adb", args...) + return err + + case DeviceModeFastboot: + if mode == "bootloader" { + _, err := a.runCommand("fastboot", "reboot-bootloader") + return err + } + args := []string{"reboot"} + if mode != "" { + args = append(args, mode) + } + _, err := a.runCommand("fastboot", args...) + return err + + default: + return fmt.Errorf("no device connected in ADB or Fastboot mode") + } +} diff --git a/dialog_service.go b/dialog_service.go new file mode 100644 index 0000000..874494b --- /dev/null +++ b/dialog_service.go @@ -0,0 +1,86 @@ +package main + +import ( + "github.com/ncruces/zenity" +) + +// SelectFileForPush opens a native file picker for choosing a file to push. +func (a *App) SelectFileForPush() (string, error) { + path, err := zenity.SelectFile( + zenity.Title("Select file to push to device"), + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectFileForInstall opens a file picker filtered to APK files. +func (a *App) SelectFileForInstall() (string, error) { + path, err := zenity.SelectFile( + zenity.Title("Select APK to install"), + zenity.FileFilters{ + {Name: "APK files", Patterns: []string{"*.apk"}, CaseFold: true}, + {Name: "All files", Patterns: []string{"*"}}, + }, + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectFileForFlash opens a file picker for image files (for fastboot flash). +func (a *App) SelectFileForFlash() (string, error) { + path, err := zenity.SelectFile( + zenity.Title("Select image to flash"), + zenity.FileFilters{ + {Name: "Image files", Patterns: []string{"*.img", "*.zip", "*.bin"}, CaseFold: true}, + {Name: "All files", Patterns: []string{"*"}}, + }, + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectSaveFile opens a native save-as dialog. +func (a *App) SelectSaveFile(defaultName string) (string, error) { + path, err := zenity.SelectFileSave( + zenity.Title("Save as"), + zenity.Filename(defaultName), + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectDirectoryForPull opens a native directory picker. +func (a *App) SelectDirectoryForPull() (string, error) { + path, err := zenity.SelectFile( + zenity.Title("Select destination folder"), + zenity.Directory(), + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectFileWithFilter opens a file picker with custom file type filters. +func (a *App) SelectFileWithFilter(title string, patterns []string) (string, error) { + filters := []zenity.FileFilter{ + {Name: "Matching files", Patterns: patterns, CaseFold: true}, + {Name: "All files", Patterns: []string{"*"}}, + } + path, err := zenity.SelectFile( + zenity.Title(title), + zenity.FileFilters(filters), + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} diff --git a/executor.go b/executor.go new file mode 100644 index 0000000..873fe13 --- /dev/null +++ b/executor.go @@ -0,0 +1,328 @@ +package main + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" + "time" +) + +const DefaultCommandTimeout = 60 * time.Second + +// getBinaryPath resolves the path to a named binary (adb or fastboot). +// Priority order: +// 1. User-configured path in AdbConfig +// 2. System PATH (when user has adb installed via apt/sdk) +// 3. Local ./bin/linux/ directory (fallback) +// +// NEVER builds shell strings - always returns an absolute path +// suitable for use as the first argument to exec.Command. +func (a *App) getBinaryPath(name string) (string, error) { + // Check user config first + a.cacheMutex.RLock() + if cached, ok := a.binaryCache[name]; ok { + a.cacheMutex.RUnlock() + return cached, nil + } + a.cacheMutex.RUnlock() + + var candidates []string + + // 1. User-configured explicit path + switch name { + case "adb": + if a.config.AdbPath != "" { + candidates = append(candidates, a.config.AdbPath) + } + case "fastboot": + if a.config.FastbootPath != "" { + candidates = append(candidates, a.config.FastbootPath) + } + } + + // 2. System PATH - preferred because user installed it from a trusted source + if p, err := exec.LookPath(name); err == nil { + candidates = append(candidates, p) + } + + // 3. Local bin directory relative to executable + exePath, err := os.Executable() + if err == nil { + installDir := filepath.Dir(exePath) + candidates = append(candidates, + filepath.Join(installDir, "bin", name), + filepath.Join(installDir, "bin", "linux", name), + ) + } + + // 4. Local bin relative to working directory + candidates = append(candidates, + filepath.Join(".", "bin", name), + filepath.Join(".", "bin", "linux", name), + ) + + for _, candidate := range candidates { + if candidate == "" { + continue + } + info, err := os.Stat(candidate) + if err != nil || info.IsDir() { + continue + } + + abs, err := filepath.Abs(candidate) + if err != nil { + continue + } + + a.cacheMutex.Lock() + a.binaryCache[name] = abs + a.cacheMutex.Unlock() + + return abs, nil + } + + return "", fmt.Errorf( + "'%s' not found. Install with: sudo apt install adb fastboot\n"+ + "Or set a custom path in Settings.", + name, + ) +} + +// invalidateBinaryCache clears the cache so next call re-resolves paths. +// Called when user changes config paths. +func (a *App) invalidateBinaryCache() { + a.cacheMutex.Lock() + defer a.cacheMutex.Unlock() + a.binaryCache = make(map[string]string) +} + +// VerifyBinary returns the SHA-256 hash of the resolved binary so the user +// can verify it themselves against Google's published hashes. +// We deliberately do NOT hardcode expected hashes - versions change and +// we don't want to block legitimate upgrades. +func (a *App) VerifyBinary(name string) (string, error) { + path, err := a.getBinaryPath(name) + if err != nil { + return "", err + } + + f, err := os.Open(path) + if err != nil { + return "", fmt.Errorf("cannot open binary: %w", err) + } + defer f.Close() + + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + return "", fmt.Errorf("cannot hash binary: %w", err) + } + + hash := hex.EncodeToString(h.Sum(nil)) + return fmt.Sprintf("path: %s\nsha256: %s", path, hash), nil +} + +// runCommandContext executes a binary with the given arguments. +// SECURITY: args are NEVER joined into a shell string. Each arg is a discrete +// element passed directly to execve - no shell expansion, no injection possible. +func (a *App) runCommandContext(ctx context.Context, binary string, args ...string) (string, error) { + binaryPath, err := a.getBinaryPath(binary) + if err != nil { + return "", err + } + + cmd := exec.CommandContext(ctx, binaryPath, args...) + setCommandSysProcAttr(cmd) + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + if ctx.Err() == context.DeadlineExceeded { + return "", fmt.Errorf("command timed out after %s", DefaultCommandTimeout) + } + if ctx.Err() == context.Canceled { + return "", fmt.Errorf("cancelled") + } + + errOut := strings.TrimSpace(stderr.String()) + if errOut == "" { + errOut = err.Error() + } + + // Translate common ADB error messages to human-readable form + switch { + case strings.Contains(errOut, "device offline"): + return "", fmt.Errorf("device is offline — try reconnecting USB") + case strings.Contains(errOut, "unauthorized"): + return "", fmt.Errorf("unauthorized — accept the USB debugging prompt on your phone") + case strings.Contains(errOut, "no devices/emulators found"): + return "", fmt.Errorf("no device found — check USB connection and USB debugging is enabled") + } + + return "", fmt.Errorf("%s", errOut) + } + + return strings.TrimSpace(stdout.String()), nil +} + +// runCommand runs a command with the default 60s timeout. +func (a *App) runCommand(binary string, args ...string) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), DefaultCommandTimeout) + defer cancel() + return a.runCommandContext(ctx, binary, args...) +} + +// runCommandTimeout runs a command with a custom timeout. +func (a *App) runCommandTimeout(timeout time.Duration, binary string, args ...string) (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + return a.runCommandContext(ctx, binary, args...) +} + +// runAdbShell runs `adb shell ` where each arg is a discrete argument. +// SECURITY: Never use this with a pre-built shell string. Always pass individual args. +// Example: runAdbShell("ls", "-la", "/sdcard") NOT runAdbShell("ls -la /sdcard") +func (a *App) runAdbShell(args ...string) (string, error) { + shellArgs := append([]string{"shell"}, args...) + return a.runCommand("adb", shellArgs...) +} + +// runAdbShellTimeout is runAdbShell with a custom timeout. +func (a *App) runAdbShellTimeout(timeout time.Duration, args ...string) (string, error) { + shellArgs := append([]string{"shell"}, args...) + return a.runCommandTimeout(timeout, "adb", shellArgs...) +} + +// CheckSystemRequirements verifies adb and fastboot are accessible and working. +func (a *App) CheckSystemRequirements() (map[string]string, error) { + result := map[string]string{} + + adbPath, err := a.getBinaryPath("adb") + if err != nil { + return nil, fmt.Errorf("adb not found: %w", err) + } + + fbPath, err := a.getBinaryPath("fastboot") + if err != nil { + return nil, fmt.Errorf("fastboot not found: %w", err) + } + + // Run adb --version to confirm it works + adbVer, err := a.runCommand("adb", "version") + if err != nil { + return nil, fmt.Errorf("adb found at %s but failed to run: %w", adbPath, err) + } + + // Extract just the version line + for _, line := range strings.Split(adbVer, "\n") { + if strings.HasPrefix(line, "Android Debug Bridge") { + result["adb"] = strings.TrimSpace(line) + break + } + } + if result["adb"] == "" { + result["adb"] = adbPath + } + + result["adbPath"] = adbPath + result["fastbootPath"] = fbPath + + return result, nil +} + +// GetBinaryInfo returns path and SHA-256 for both binaries. +// Exposes this to the frontend so users can verify their own tooling. +func (a *App) GetBinaryInfo() (map[string]string, error) { + result := map[string]string{} + + for _, name := range []string{"adb", "fastboot"} { + info, err := a.VerifyBinary(name) + if err != nil { + result[name] = fmt.Sprintf("error: %s", err.Error()) + } else { + result[name] = info + } + } + + return result, nil +} + +// SetAdbPath allows the user to override the adb binary path. +func (a *App) SetAdbPath(path string) error { + info, err := os.Stat(path) + if err != nil { + return fmt.Errorf("path does not exist: %w", err) + } + if info.IsDir() { + return fmt.Errorf("path is a directory, expected a binary file") + } + a.config.AdbPath = path + a.invalidateBinaryCache() + return nil +} + +// SetFastbootPath allows the user to override the fastboot binary path. +func (a *App) SetFastbootPath(path string) error { + info, err := os.Stat(path) + if err != nil { + return fmt.Errorf("path does not exist: %w", err) + } + if info.IsDir() { + return fmt.Errorf("path is a directory, expected a binary file") + } + a.config.FastbootPath = path + a.invalidateBinaryCache() + return nil +} + +// CancelOperation cancels any currently running long operation. +func (a *App) CancelOperation() string { + a.opMutex.Lock() + defer a.opMutex.Unlock() + + if a.currentCancel != nil { + a.currentCancel() + a.currentCancel = nil + return "Operation cancelled." + } + return "No active operation to cancel." +} + +// beginCancellableOp sets up a cancellable context for a long operation. +// Caller must call the returned cancel func (defer it). +func (a *App) beginCancellableOp(timeout time.Duration) (context.Context, context.CancelFunc) { + a.opMutex.Lock() + defer a.opMutex.Unlock() + + // Cancel any previously running op + if a.currentCancel != nil { + a.currentCancel() + } + + var ctx context.Context + var cancel context.CancelFunc + if timeout > 0 { + ctx, cancel = context.WithTimeout(context.Background(), timeout) + } else { + ctx, cancel = context.WithCancel(context.Background()) + } + + a.currentCancel = cancel + return ctx, func() { + cancel() + a.opMutex.Lock() + if a.currentCancel != nil { + a.currentCancel = nil + } + a.opMutex.Unlock() + } +} diff --git a/file_service.go b/file_service.go new file mode 100644 index 0000000..15bcb3b --- /dev/null +++ b/file_service.go @@ -0,0 +1,263 @@ +package main + +import ( + "fmt" + "regexp" + "strings" + "time" +) + +// ListFiles lists files in the given remote path on the device. +// path is passed as a discrete argument - no shell injection. +func (a *App) ListFiles(path string) ([]FileEntry, error) { + if path == "" { + path = "/" + } + + // ls, -lA, and path are all discrete args - safe + output, err := a.runAdbShell("ls", "-lA", path) + if err != nil { + return nil, fmt.Errorf("failed to list %s: %w", path, err) + } + + return parseFileList(output), nil +} + +// parseFileList parses the output of `ls -lA` into FileEntry structs. +func parseFileList(output string) []FileEntry { + var files []FileEntry + spaceRe := regexp.MustCompile(`\s+`) + + for _, rawLine := range strings.Split(output, "\n") { + line := strings.TrimSpace(rawLine) + if line == "" || strings.HasPrefix(line, "total") { + continue + } + + parts := spaceRe.Split(line, 9) + if len(parts) < 6 { + continue + } + + permissions := parts[0] + fileType := "File" + size := "" + if len(parts) > 4 { + size = parts[4] + } + + if len(permissions) > 0 { + switch permissions[0] { + case 'd': + fileType = "Directory" + case 'l': + fileType = "Symlink" + size = "" // symlinks don't have meaningful sizes + } + } + + var name, date, modTime string + switch { + case len(parts) >= 8: + date = parts[5] + modTime = parts[6] + name = strings.Join(parts[7:], " ") + case len(parts) == 7: + date = parts[5] + name = parts[6] + default: + name = parts[len(parts)-1] + } + + // Strip symlink target from name + if fileType == "Symlink" { + if idx := strings.Index(name, " -> "); idx >= 0 { + name = name[:idx] + } + } + + files = append(files, FileEntry{ + Name: strings.TrimSpace(name), + Type: fileType, + Size: size, + Permissions: permissions, + Date: strings.TrimSpace(date), + Time: strings.TrimSpace(modTime), + }) + } + + return files +} + +// PushFile pushes a local file to the device. +// Both paths are passed as discrete arguments - no shell injection. +func (a *App) PushFile(localPath, remotePath string) (string, error) { + ctx, cancel := a.beginCancellableOp(30 * time.Minute) + defer cancel() + + output, err := a.runCommandContext(ctx, "adb", "push", localPath, remotePath) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + return "", fmt.Errorf("push cancelled") + } + return "", fmt.Errorf("push failed: %w", err) + } + return output, nil +} + +// PullFile pulls a file from the device to a local path. +// Both paths are passed as discrete arguments - no shell injection. +func (a *App) PullFile(remotePath, localPath string) (string, error) { + // No timeout for pulls - only user cancellation + ctx, cancel := a.beginCancellableOp(0) + defer cancel() + + // -a preserves timestamps + output, err := a.runCommandContext(ctx, "adb", "pull", "-a", remotePath, localPath) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + return "", fmt.Errorf("pull cancelled") + } + return "", fmt.Errorf("pull failed: %w", err) + } + return output, nil +} + +// CreateFolder creates a directory on the device. +// fullPath is passed as a discrete argument - safe. +func (a *App) CreateFolder(fullPath string) (string, error) { + if err := validateRemotePath(fullPath); err != nil { + return "", err + } + // mkdir, -p, and path are discrete args + _, err := a.runAdbShell("mkdir", "-p", fullPath) + if err != nil { + return "", fmt.Errorf("failed to create folder: %w", err) + } + return fmt.Sprintf("Created: %s", fullPath), nil +} + +// DeleteFile deletes a file or directory on the device. +// fullPath is passed as a discrete argument - safe. +func (a *App) DeleteFile(fullPath string) (string, error) { + if err := validateRemotePath(fullPath); err != nil { + return "", err + } + // rm, -rf, and path are discrete args + _, err := a.runAdbShell("rm", "-rf", fullPath) + if err != nil { + return "", fmt.Errorf("failed to delete: %w", err) + } + return fmt.Sprintf("Deleted: %s", fullPath), nil +} + +// RenameFile renames/moves a file on the device. +// Both paths are discrete arguments - safe. +func (a *App) RenameFile(oldPath, newPath string) (string, error) { + if err := validateRemotePath(oldPath); err != nil { + return "", fmt.Errorf("invalid source path: %w", err) + } + if err := validateRemotePath(newPath); err != nil { + return "", fmt.Errorf("invalid destination path: %w", err) + } + // mv, oldPath, newPath are discrete args + _, err := a.runAdbShell("mv", oldPath, newPath) + if err != nil { + return "", fmt.Errorf("failed to rename: %w", err) + } + return fmt.Sprintf("Renamed to: %s", newPath), nil +} + +// CopyFile copies a file on the device. +// Both paths are discrete arguments - safe. +func (a *App) CopyFile(srcPath, dstPath string) (string, error) { + if err := validateRemotePath(srcPath); err != nil { + return "", fmt.Errorf("invalid source path: %w", err) + } + if err := validateRemotePath(dstPath); err != nil { + return "", fmt.Errorf("invalid destination path: %w", err) + } + // cp, -r, srcPath, dstPath are all discrete args + _, err := a.runAdbShell("cp", "-r", srcPath, dstPath) + if err != nil { + return "", fmt.Errorf("failed to copy: %w", err) + } + return fmt.Sprintf("Copied to: %s", dstPath), nil +} + +// DeleteMultipleFiles deletes multiple files/directories. +func (a *App) DeleteMultipleFiles(fullPaths []string) (string, error) { + if len(fullPaths) == 0 { + return "", fmt.Errorf("no files selected") + } + + var successCount, failCount int + var errDetails strings.Builder + + for _, path := range fullPaths { + if _, err := a.DeleteFile(path); err != nil { + failCount++ + errDetails.WriteString(fmt.Sprintf("• %s: %v\n", path, err)) + } else { + successCount++ + } + } + + summary := fmt.Sprintf("Deleted %d item(s).", successCount) + if failCount > 0 { + summary += fmt.Sprintf(" Failed: %d\n%s", failCount, errDetails.String()) + } + return summary, nil +} + +// PullMultipleFiles pulls multiple files from the device to a user-chosen directory. +func (a *App) PullMultipleFiles(remotePaths []string) (string, error) { + if len(remotePaths) == 0 { + return "", fmt.Errorf("no files selected") + } + + localDir, err := a.SelectDirectoryForPull() + if err != nil { + return "", fmt.Errorf("folder dialog failed: %w", err) + } + if localDir == "" { + return "Export cancelled.", nil + } + + var successCount, failCount int + var errDetails strings.Builder + + for _, remotePath := range remotePaths { + _, err := a.PullFile(remotePath, localDir) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + errDetails.WriteString(fmt.Sprintf("• %s: cancelled\n", remotePath)) + failCount++ + break // user cancelled - stop the batch + } + failCount++ + errDetails.WriteString(fmt.Sprintf("• %s: %v\n", remotePath, err)) + } else { + successCount++ + } + } + + summary := fmt.Sprintf("Exported %d item(s) to %s.", successCount, localDir) + if failCount > 0 { + summary += fmt.Sprintf(" Failed: %d\n%s", failCount, errDetails.String()) + } + return summary, nil +} + +// validateRemotePath checks that a remote path is safe to use as an ADB argument. +// Rejects empty paths and the bare root "/" to prevent accidental rm -rf /. +func validateRemotePath(path string) error { + path = strings.TrimSpace(path) + if path == "" { + return fmt.Errorf("path cannot be empty") + } + if path == "/" { + return fmt.Errorf("refusing to operate on root filesystem path /") + } + return nil +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..991e73b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,15 @@ + + + + + + ATK — Android Toolkit + + + + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..10a2515 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,27 @@ +{ + "name": "atk-frontend", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "lucide-react": "^0.383.0", + "sonner": "^1.4.0" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@vitejs/plugin-react": "^4.2.0", + "typescript": "^5.3.0", + "vite": "^5.1.0", + "tailwindcss": "^3.4.0", + "autoprefixer": "^10.4.0", + "postcss": "^8.4.0" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..7396946 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,85 @@ +import { useState, useEffect } from 'react' +import { Toaster } from 'sonner' +import Sidebar from './components/layout/Sidebar' +import ViewDashboard from './components/views/ViewDashboard' +import ViewFiles from './components/views/ViewFiles' +import ViewPackages from './components/views/ViewPackages' +import ViewDebloater from './components/views/ViewDebloater' +import ViewShell from './components/views/ViewShell' +import ViewLogcat from './components/views/ViewLogcat' +import ViewAppInspect from './components/views/ViewAppInspect' +import ViewCerts from './components/views/ViewCerts' +import ViewBackup from './components/views/ViewBackup' +import ViewProps from './components/views/ViewProps' +import ViewFlasher from './components/views/ViewFlasher' +import ViewPixelFlasher from './components/views/ViewPixelFlasher' +import ViewUtilities from './components/views/ViewUtilities' +import ViewSettings from './components/views/ViewSettings' +import { CheckSystemRequirements } from './lib/wails' +import type { View } from './lib/types' + +export default function App() { + const [view, setView] = useState('dashboard') + const [ready, setReady] = useState(false) + const [initError, setInitError] = useState('') + + useEffect(() => { + CheckSystemRequirements() + .then(() => setReady(true)) + .catch((err: string) => { setInitError(err); setReady(true) }) + }, []) + + const renderView = () => { + switch (view) { + case 'dashboard': return + case 'files': return + case 'packages': return + case 'debloater': return + case 'shell': return + case 'logcat': return + case 'appinspect': return + case 'certs': return + case 'backup': return + case 'props': return + case 'flasher': return + case 'pixelflasher': return + case 'utilities': return + case 'settings': return + default: return + } + } + + if (!ready) return ( +
+
+
+

Initialising ATK...

+
+
+ ) + + return ( +
+ +
+ {initError && ( +
+ + {initError} +
+ )} +
{renderView()}
+
+ +
+ ) +} diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx new file mode 100644 index 0000000..68b50a2 --- /dev/null +++ b/frontend/src/components/layout/Sidebar.tsx @@ -0,0 +1,78 @@ +import { + LayoutDashboard, FolderOpen, Package, Terminal, + Zap, Wrench, Settings, Radio, Shield, Smartphone, + ScrollText, Search, Lock, Archive, SlidersHorizontal +} from 'lucide-react' +import type { View } from '../../lib/types' + +interface Props { + activeView: View + onViewChange: (v: View) => void +} + +const navItems: { view: View; icon: React.ReactNode; label: string; dividerBefore?: boolean }[] = [ + { view: 'dashboard', icon: , label: 'Dashboard' }, + { view: 'files', icon: , label: 'Files' }, + { view: 'packages', icon: , label: 'Packages' }, + { view: 'debloater', icon: , label: 'Debloater' }, + { view: 'shell', icon: , label: 'Shell' }, + { view: 'logcat', icon: , label: 'Logcat', dividerBefore: true }, + { view: 'appinspect', icon: , label: 'App Inspector' }, + { view: 'certs', icon: , label: 'Certificates' }, + { view: 'backup', icon: , label: 'Backup' }, + { view: 'props', icon: , label: 'Prop Editor' }, + { view: 'utilities', icon: , label: 'Utilities', dividerBefore: true }, + { view: 'flasher', icon: , label: 'Flasher' }, + { view: 'pixelflasher', icon: , label: 'Pixel Flash' }, +] + +export default function Sidebar({ activeView, onViewChange }: Props) { + return ( + + ) +} diff --git a/frontend/src/components/views/ViewAppInspect.tsx b/frontend/src/components/views/ViewAppInspect.tsx new file mode 100644 index 0000000..d7401a1 --- /dev/null +++ b/frontend/src/components/views/ViewAppInspect.tsx @@ -0,0 +1,278 @@ +import { useState } from 'react' +import { Search, Package, Shield, Activity, Server, Database, Cpu, FileCode, AlertTriangle } from 'lucide-react' +import { InspectApp, CheckPinning, ListPackages } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { AppInspection, PackageInfo } from '../../lib/types' + +export default function ViewAppInspect() { + const [search, setSearch] = useState('') + const [packages, setPackages] = useState([]) + const [pkgsLoaded, setPkgsLoaded] = useState(false) + const [loading, setLoading] = useState(false) + const [result, setResult] = useState(null) + const [pinning, setPinning] = useState('') + const [activeTab, setActiveTab] = useState('overview') + const [showManifest, setShowManifest] = useState(false) + + const loadPackages = async () => { + if (pkgsLoaded) return + try { + const pkgs = await ListPackages('all') + setPackages(pkgs || []) + setPkgsLoaded(true) + } catch {} + } + + const inspect = async (pkg: string) => { + if (!pkg.trim()) return + setLoading(true) + setResult(null) + setPinning('') + setActiveTab('overview') + try { + const data = await InspectApp(pkg.trim()) + setResult(data) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + const checkPinning = async () => { + if (!result) return + try { + const out = await CheckPinning(result.packageName) + setPinning(out) + } catch (e: any) { + notify.error(e) + } + } + + const filtered = packages.filter(p => + p.packageName.toLowerCase().includes(search.toLowerCase()) + ).slice(0, 20) + + const tabs = [ + { id: 'overview', label: 'Overview', icon: }, + { id: 'permissions', label: `Permissions (${result?.permissions?.length || 0})`, icon: }, + { id: 'components', label: 'Components', icon: }, + { id: 'libs', label: 'Native Libs', icon: }, + { id: 'cert', label: 'Signing Cert', icon: }, + { id: 'manifest', label: 'Full Dump', icon: }, + ] + + return ( +
+ {/* Left: package picker */} +
+
+

App Inspector

+
+ + setSearch(e.target.value)} + onFocus={loadPackages} + onKeyDown={e => e.key === 'Enter' && inspect(search)} + /> +
+ +
+ +
+ {filtered.map(p => ( + + ))} + {!pkgsLoaded && ( +

Type to search or focus to load package list

+ )} +
+
+ + {/* Right: inspection results */} +
+ {!result && !loading && ( +
+ +

Select a package to inspect

+
+ )} + + {loading && ( +
+
+
+ )} + + {result && ( + <> + {/* Package header */} +
+
+

{result.packageName}

+

+ v{result.versionName} (code {result.versionCode}) · SDK {result.minSdk}–{result.targetSdk} +

+
+ {result.isSystem && system} + {result.isDebuggable && debuggable} + {result.isEnabled + ? enabled + : disabled + } + UID {result.uid} +
+
+ +
+ + {/* Pinning result */} + {pinning && ( +
+
{pinning}
+
+ )} + + {/* Tabs */} +
+ {tabs.map(tab => ( + + ))} +
+ + {/* Tab content */} +
+ {activeTab === 'overview' && ( +
+ {[ + { label: 'Install path', value: result.installPath }, + { label: 'Data dir', value: result.dataDir }, + { label: 'Installed by', value: result.installer || 'Unknown' }, + { label: 'First installed', value: result.firstInstall }, + { label: 'Last updated', value: result.lastUpdated }, + { label: 'UID', value: result.uid }, + { label: 'Target SDK', value: result.targetSdk }, + { label: 'Min SDK', value: result.minSdk }, + ].map(({ label, value }) => ( +
+ {label} + {value || 'N/A'} +
+ ))} +
+ )} + + {activeTab === 'permissions' && ( +
+ {result.permissions?.length === 0 && ( +

No permissions detected

+ )} + {result.permissions?.map(p => ( +
+ + {p} +
+ ))} +
+ )} + + {activeTab === 'components' && ( +
+ {[ + { label: 'Activities', items: result.activities, icon: }, + { label: 'Services', items: result.services, icon: }, + { label: 'Receivers', items: result.receivers, icon: }, + { label: 'Providers', items: result.providers, icon: }, + ].map(({ label, items, icon }) => ( +
+

{label} ({items?.length || 0})

+ {!items?.length &&

None detected

} + {items?.map(item => ( +
+ {icon} + {item} +
+ ))} +
+ ))} +
+ )} + + {activeTab === 'libs' && ( +
+ {!result.nativeLibs?.length && ( +

No native libraries detected

+ )} + {result.nativeLibs?.map(lib => ( +
+ + {lib} +
+ ))} +
+ )} + + {activeTab === 'cert' && ( +
+ {[ + { label: 'Subject', value: result.certSubject }, + { label: 'Issuer', value: result.certIssuer }, + { label: 'Expires', value: result.certExpiry }, + { label: 'SHA-256', value: result.certSha256 }, + ].map(({ label, value }) => ( +
+

{label}

+

+ {value || 'Not available — run aapt or apksigner manually for cert details'} +

+
+ ))} +
+ )} + + {activeTab === 'manifest' && ( +
+ + {showManifest && ( +
+                      {result.manifestDump}
+                    
+ )} +
+ )} +
+ + )} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewBackup.tsx b/frontend/src/components/views/ViewBackup.tsx new file mode 100644 index 0000000..c320fa6 --- /dev/null +++ b/frontend/src/components/views/ViewBackup.tsx @@ -0,0 +1,225 @@ +import { useState } from 'react' +import { Archive, RotateCcw, AlertTriangle, Package, Check } from 'lucide-react' +import { StartBackup, RestoreBackup, SelectBackupFile, ListPackages } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { PackageInfo } from '../../lib/types' + +export default function ViewBackup() { + const [packages, setPackages] = useState([]) + const [pkgsLoaded, setPkgsLoaded] = useState(false) + const [selected, setSelected] = useState>(new Set()) + const [includeApks, setIncludeApks] = useState(true) + const [includeShared, setIncludeShared] = useState(false) + const [allApps, setAllApps] = useState(false) + const [backing, setBacking] = useState(false) + const [search, setSearch] = useState('') + const [result, setResult] = useState('') + + const loadPackages = async () => { + if (pkgsLoaded) return + try { + const pkgs = await ListPackages('user') + setPackages(pkgs || []) + setPkgsLoaded(true) + } catch (e: any) { + notify.error(e) + } + } + + const toggleSelect = (pkg: string) => setSelected(prev => { + const next = new Set(prev) + next.has(pkg) ? next.delete(pkg) : next.add(pkg) + return next + }) + + const selectAll = () => { + const visible = filtered.map(p => p.packageName) + if (selected.size === visible.length) { + setSelected(new Set()) + } else { + setSelected(new Set(visible)) + } + } + + const startBackup = async () => { + if (!allApps && selected.size === 0) { + notify.error('Select packages or enable "All Apps"') + return + } + + setBacking(true) + setResult('') + const id = notify.loading('Starting backup — confirm on device screen...') + try { + const out = await StartBackup({ + includeApks, + includeShared, + includeSystem: false, + packages: [...selected], + allApps, + }, '') + notify.dismiss(id) + notify.success('Backup complete') + setResult(out) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } finally { + setBacking(false) + } + } + + const restore = async () => { + const path = await SelectBackupFile() + if (!path) return + if (!confirm(`Restore from:\n${path}\n\nThis will restore data on the device. Confirm on device screen.`)) return + const id = notify.loading('Starting restore — confirm on device...') + try { + const out = await RestoreBackup(path) + notify.dismiss(id) + notify.success(out) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const filtered = packages.filter(p => + p.packageName.toLowerCase().includes(search.toLowerCase()) + ) + + return ( +
+ {/* Warning */} +
+ +
+

Android 12+ heavily restricts adb backup

+

Apps must opt-in via android:allowBackup="true" and the ALLOW_ADB_BACKUP flag. Many modern apps will not be backed up. For full backup, use a rooted device with Titanium Backup or Swift Backup.

+
+
+ +
+ {/* Backup config */} +
+

Backup Configuration

+ + {/* Options */} +
+ + + +
+ + {/* Package selection */} + {!allApps && ( +
+
+

Select specific apps

+ +
+ setSearch(e.target.value)} + onFocus={loadPackages} + /> +
+ {!pkgsLoaded && ( +

Focus search to load packages

+ )} + {filtered.map(p => ( + + ))} +
+ {selected.size > 0 && ( +

{selected.size} app(s) selected

+ )} +
+ )} + +
+ + +
+ + {result && ( +
+ {result} +
+ )} +
+ + {/* Info panel */} +
+

How adb backup works

+
+
+ +

Creates an encrypted .adb file on your host machine

+
+
+ +

You must confirm the backup on the device screen — it won't start without device-side confirmation

+
+
+ +

Apps that set allowBackup=false are silently skipped — you won't be told which ones

+
+
+ +

Android 12+ requires the ALLOW_ADB_BACKUP flag — most production apps won't have it

+
+
+ +

For bug hunting purposes, this is mainly useful for pulling app data from debuggable or rooted builds

+
+
+ +
+

Useful for bug hunting

+
+

• Back up a target app's data before testing so you can restore to a clean state

+

• Use with -apk to get both the APK and its data in one file

+

• Combine with ADB shell to inspect /data/data/com.package directly if rooted

+
+
+
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewCerts.tsx b/frontend/src/components/views/ViewCerts.tsx new file mode 100644 index 0000000..892ec4b --- /dev/null +++ b/frontend/src/components/views/ViewCerts.tsx @@ -0,0 +1,160 @@ +import { useState, useEffect } from 'react' +import { Shield, RefreshCw, Plus, Trash2, AlertTriangle, Check, Lock } from 'lucide-react' +import { ListSystemCerts, ListUserCerts, InstallUserCert, RemoveUserCert, SelectCertFile } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { CertInfo } from '../../lib/types' + +export default function ViewCerts() { + const [systemCerts, setSystemCerts] = useState([]) + const [userCerts, setUserCerts] = useState([]) + const [loading, setLoading] = useState(false) + const [activeTab, setActiveTab] = useState<'user' | 'system'>('user') + + const load = async () => { + setLoading(true) + try { + const [sys, usr] = await Promise.all([ListSystemCerts(), ListUserCerts()]) + setSystemCerts(sys || []) + setUserCerts(usr || []) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + useEffect(() => { load() }, []) + + const installCert = async () => { + try { + const path = await SelectCertFile() + if (!path) return + const id = notify.loading('Installing certificate...') + const out = await InstallUserCert(path) + notify.dismiss(id) + notify.success(out) + load() + } catch (e: any) { + notify.error(e) + } + } + + const removeCert = async (cert: CertInfo) => { + if (!confirm(`Remove certificate:\n${cert.subject || cert.filename}?`)) return + try { + const out = await RemoveUserCert(cert.filename) + notify.success(out) + load() + } catch (e: any) { + notify.error(e) + } + } + + const certs = activeTab === 'user' ? userCerts : systemCerts + + return ( +
+ {/* Header */} +
+ + + {userCerts.length} user certs · {systemCerts.length} system certs + +
+ + +
+ + {/* Burp/MITM info banner */} +
+
+ +
+

HTTPS Interception Setup (Burp Suite / mitmproxy)

+

1. Export your proxy CA cert as DER/PEM 2. Click "Install User CA" above 3. Set device proxy to your machine IP 4. For Android 7+ apps with pinning — use Magisk TrustUserCerts module or patch the APK

+
+
+
+ + {/* Tabs */} +
+ {(['user', 'system'] as const).map(tab => ( + + ))} +
+ + {/* Warning for user certs */} + {activeTab === 'user' && ( +
+ +

+ Android 7+ restricts user certs — apps targeting API 24+ won't trust them by default. + Use TrustUserCerts Magisk module or recompile the app's network security config to include user certs. +

+
+ )} + + {/* Cert list */} +
+ {loading && ( +
+
+
+ )} + + {!loading && certs.length === 0 && ( +
+ +

+ {activeTab === 'user' ? 'No user-installed certificates' : 'No system certificates found'} +

+
+ )} + + {certs.map(cert => ( +
+ +
+
+ + {cert.subject || cert.filename} + + {cert.isUser && user} + {cert.isSystem && system} +
+ {cert.issuer &&

Issuer: {cert.issuer}

} + {cert.expiry &&

Expires: {cert.expiry}

} + {cert.fingerprint && ( +

{cert.fingerprint}

+ )} +

{cert.filename}

+
+ {cert.isUser && ( + + )} +
+ ))} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewDashboard.tsx b/frontend/src/components/views/ViewDashboard.tsx new file mode 100644 index 0000000..f85b7cd --- /dev/null +++ b/frontend/src/components/views/ViewDashboard.tsx @@ -0,0 +1,248 @@ +import { useState, useEffect, useCallback } from 'react' +import { RefreshCw, Wifi, WifiOff, RotateCcw, Shield, Cpu, Battery, HardDrive, Monitor } from 'lucide-react' +import { + GetDevices, GetDeviceInfo, EnableWirelessAdb, + ConnectWirelessAdb, DisconnectWirelessAdb, Reboot +} from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { Device, DeviceInfo } from '../../lib/types' + +export default function ViewDashboard() { + const [devices, setDevices] = useState([]) + const [info, setInfo] = useState(null) + const [loading, setLoading] = useState(false) + const [infoLoading, setInfoLoading] = useState(false) + const [wirelessIp, setWirelessIp] = useState('') + const [wirelessPort, setWirelessPort] = useState('5555') + + const refreshDevices = useCallback(async () => { + setLoading(true) + try { + const devs = await GetDevices() + setDevices(devs || []) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + }, []) + + const loadDeviceInfo = useCallback(async () => { + setInfoLoading(true) + setInfo(null) + try { + const i = await GetDeviceInfo() + setInfo(i) + } catch (e: any) { + notify.error(e) + } finally { + setInfoLoading(false) + } + }, []) + + useEffect(() => { + refreshDevices() + }, [refreshDevices]) + + const handleEnableWireless = async () => { + const id = notify.loading('Enabling wireless ADB...') + try { + const out = await EnableWirelessAdb(wirelessPort) + notify.dismiss(id) + notify.success(out || 'Wireless ADB enabled') + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleConnect = async () => { + if (!wirelessIp) { notify.error('Enter an IP address'); return } + const id = notify.loading(`Connecting to ${wirelessIp}:${wirelessPort}...`) + try { + const out = await ConnectWirelessAdb(wirelessIp, wirelessPort) + notify.dismiss(id) + notify.success(out) + refreshDevices() + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleDisconnect = async () => { + if (!wirelessIp) { notify.error('Enter an IP address'); return } + const id = notify.loading('Disconnecting...') + try { + const out = await DisconnectWirelessAdb(wirelessIp, wirelessPort) + notify.dismiss(id) + notify.success(out) + refreshDevices() + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleReboot = async (mode: string) => { + const label = mode || 'system' + const id = notify.loading(`Rebooting to ${label}...`) + try { + await Reboot(mode) + notify.dismiss(id) + notify.success(`Reboot to ${label} initiated`) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const connectedDevices = devices.filter(d => d.status === 'device') + + return ( +
+ {/* Header */} +
+

Dashboard

+ +
+ +
+ {/* Device List */} +
+

Connected Devices

+ {devices.length === 0 ? ( +
+

No devices detected

+

Connect a device with USB debugging enabled

+
+ ) : ( +
+ {devices.map(d => ( +
+
+

{d.serial}

+

{d.status}

+
+ +
+ ))} +
+ )} + + {connectedDevices.length > 0 && ( + + )} +
+ + {/* Device Info */} +
+

Device Information

+ {!info && !infoLoading && ( +
+

Select a device and click "Load Device Info"

+
+ )} + {infoLoading && ( +
+
+

Fetching device details...

+
+ )} + {info && ( +
+ {[ + { label: 'Model', value: `${info.brand} ${info.model}` }, + { label: 'Codename', value: info.codename }, + { label: 'Android', value: info.androidVersion }, + { label: 'Build', value: info.buildNumber }, + { label: 'Serial', value: info.serial, mono: true }, + { label: 'CPU Arch', value: info.cpuArch }, + { label: 'RAM', value: info.ramTotal, icon: }, + { label: 'Storage', value: info.storageInfo, icon: }, + { label: 'Battery', value: info.batteryLevel, icon: }, + { label: 'Screen', value: info.screenResolution,icon: }, + { label: 'IP Address', value: info.ipAddress }, + { label: 'Uptime', value: info.uptime }, + { label: 'Root', value: info.rootStatus, icon: }, + { label: 'Bootloader', value: info.bootloaderStatus }, + { label: 'Security Patch', value: info.securityPatch }, + { label: 'Kernel', value: info.kernelVersion, mono: true }, + { label: 'Baseband', value: info.basebandVersion, mono: true }, + ].map(({ label, value, mono, icon }) => ( +
+ {label} + + {icon && {icon}} + {value || 'N/A'} + +
+ ))} +
+ )} +
+
+ +
+ {/* Wireless ADB */} +
+

Wireless ADB

+
+
+ setWirelessIp(e.target.value)} + /> + setWirelessPort(e.target.value)} + /> +
+
+ + + +
+
+
+ + {/* Reboot */} +
+

Reboot Options

+
+ {[ + { label: 'System', mode: '', cls: 'btn-ghost' }, + { label: 'Recovery', mode: 'recovery', cls: 'btn-warn' }, + { label: 'Bootloader', mode: 'bootloader', cls: 'btn-warn' }, + { label: 'Fastboot', mode: 'fastboot', cls: 'btn-ghost' }, + ].map(({ label, mode, cls }) => ( + + ))} +
+
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewDebloater.tsx b/frontend/src/components/views/ViewDebloater.tsx new file mode 100644 index 0000000..7d72181 --- /dev/null +++ b/frontend/src/components/views/ViewDebloater.tsx @@ -0,0 +1,314 @@ +import { useState, useEffect, useMemo } from 'react' +import { Shield, RefreshCw, Search, Trash2, PowerOff, AlertTriangle, Check, X, ChevronDown, ChevronRight } from 'lucide-react' +import { ListPackages, DisableMultiplePackages, UninstallMultiplePackages } from '../../lib/wails' +import { notify } from '../../lib/notify' +import { DEBLOAT_CATEGORIES } from '../../lib/debloat_db' +import type { Safety } from '../../lib/debloat_db' +import type { PackageInfo } from '../../lib/types' + +const SAFETY_CONFIG: Record = { + safe: { label: 'Safe', cls: 'badge-green', icon: }, + caution: { label: 'Caution', cls: 'badge-yellow', icon: }, + keep: { label: 'Keep', cls: 'badge-red', icon: }, +} + +export default function ViewDebloater() { + const [installed, setInstalled] = useState>(new Set()) + const [loading, setLoading] = useState(false) + const [selected, setSelected] = useState>(new Set()) + const [search, setSearch] = useState('') + const [safetyFilter, setSafety] = useState('all') + const [mfrFilter, setMfrFilter] = useState('all') + const [openCats, setOpenCats] = useState>(new Set()) + const [operating, setOperating] = useState(false) + const [showNotInstalled, setShowNotInstalled] = useState(false) + + const loadInstalled = async () => { + setLoading(true) + setInstalled(new Set()) + setSelected(new Set()) + try { + const pkgs = await ListPackages('all') + const names = new Set((pkgs || []).map((p: PackageInfo) => p.packageName)) + setInstalled(names) + // Auto-open categories that have installed packages + const withInstalled = new Set() + DEBLOAT_CATEGORIES.forEach(cat => { + if (cat.packages.some(p => names.has(p.pkg))) withInstalled.add(cat.name) + }) + setOpenCats(withInstalled) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + useEffect(() => { loadInstalled() }, []) + + const manufacturers = useMemo(() => ['all', ...DEBLOAT_CATEGORIES.map(c => c.name)], []) + + const visibleCategories = useMemo(() => { + return DEBLOAT_CATEGORIES + .filter(cat => mfrFilter === 'all' || cat.name === mfrFilter) + .map(cat => ({ + ...cat, + packages: cat.packages.filter(p => { + if (safetyFilter !== 'all' && p.safety !== safetyFilter) return false + if (!showNotInstalled && !installed.has(p.pkg)) return false + if (search) { + const q = search.toLowerCase() + return p.pkg.toLowerCase().includes(q) || p.label.toLowerCase().includes(q) || p.description.toLowerCase().includes(q) + } + return true + }) + })) + .filter(cat => cat.packages.length > 0) + }, [search, safetyFilter, mfrFilter, installed, showNotInstalled]) + + const totalInstalled = useMemo(() => + DEBLOAT_CATEGORIES.reduce((n, cat) => n + cat.packages.filter(p => installed.has(p.pkg)).length, 0), + [installed] + ) + + const toggleCat = (name: string) => setOpenCats(prev => { + const next = new Set(prev) + next.has(name) ? next.delete(name) : next.add(name) + return next + }) + + const toggleSelect = (pkg: string) => setSelected(prev => { + const next = new Set(prev) + next.has(pkg) ? next.delete(pkg) : next.add(pkg) + return next + }) + + const selectAllVisible = () => { + const selectable = visibleCategories + .flatMap(c => c.packages) + .filter(p => installed.has(p.pkg) && p.safety !== 'keep') + .map(p => p.pkg) + if (selected.size === selectable.length) { + setSelected(new Set()) + } else { + setSelected(new Set(selectable)) + } + } + + const batchOp = async (label: string, op: (pkgs: string[]) => Promise, confirm_msg: string) => { + if (selected.size === 0) { notify.error('Select packages first'); return } + if (!confirm(confirm_msg)) return + setOperating(true) + const id = notify.loading(`${label} ${selected.size} package(s)...`) + try { + const out = await op([...selected]) + notify.dismiss(id) + notify.success(out) + setSelected(new Set()) + loadInstalled() + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } finally { + setOperating(false) + } + } + + return ( +
+ {/* Toolbar */} +
+ + + {loading ? 'Scanning device...' : `${totalInstalled} of ${DEBLOAT_CATEGORIES.reduce((n,c)=>n+c.packages.length,0)} packages found on device`} + +
+ + {/* Manufacturer filter */} + + + {/* Safety filter */} +
+ {(['all', 'safe', 'caution', 'keep'] as const).map(f => ( + + ))} +
+ + + +
+ + setSearch(e.target.value)} + /> +
+ + +
+ + {/* Warning */} +
+ +

+ Always prefer Disable over Uninstall. Never remove packages marked Keep — they will break your device. Source: Universal Android Debloater (UAD-ng), 2157 packages. +

+
+ + {/* Action bar */} + {selected.size > 0 && ( +
+ {selected.size} selected +
+ + + +
+ )} + + {/* Package list */} +
+ {loading && ( +
+
+
+ )} + {!loading && visibleCategories.length === 0 && ( +
+ +

No packages match current filters

+ {!showNotInstalled && totalInstalled === 0 && ( +

Try clicking "Scan" to detect installed packages

+ )} +
+ )} + + {!loading && visibleCategories.map(cat => { + const installedCount = cat.packages.filter(p => installed.has(p.pkg)).length + const isOpen = openCats.has(cat.name) + + return ( +
+ {/* Category header */} + + + {/* Packages */} + {isOpen && cat.packages.map(p => { + const isInst = installed.has(p.pkg) + const isSel = selected.has(p.pkg) + const safety = SAFETY_CONFIG[p.safety] + + return ( +
isInst && p.safety !== 'keep' && toggleSelect(p.pkg)} + > + toggleSelect(p.pkg)} + className="accent-accent-green mt-0.5 shrink-0" + onClick={e => e.stopPropagation()} + /> +
+
+ {p.label} + + {safety.icon} {safety.label} + + {!isInst && not on device} + {p.deps && p.deps.length > 0 && ( + has deps + )} + {p.neededBy && p.neededBy.length > 0 && ( + needed by others + )} +
+

{p.pkg}

+

{p.description}

+
+
+ ) + })} +
+ ) + })} +
+ + {/* Status bar */} +
+ {totalInstalled} debloat candidates on device · {DEBLOAT_CATEGORIES.reduce((n,c)=>n+c.packages.length,0)} total in database + +
+
+ ) +} diff --git a/frontend/src/components/views/ViewFiles.tsx b/frontend/src/components/views/ViewFiles.tsx new file mode 100644 index 0000000..3b0a0db --- /dev/null +++ b/frontend/src/components/views/ViewFiles.tsx @@ -0,0 +1,322 @@ +import { useState, useEffect, useCallback } from 'react' +import { + FolderOpen, File, ArrowLeft, RefreshCw, Upload, + Download, Trash2, FolderPlus, Edit3, Copy +} from 'lucide-react' +import { + ListFiles, PushFile, PullMultipleFiles, DeleteMultipleFiles, + CreateFolder, RenameFile, CopyFile, SelectFileForPush, CancelOperation +} from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { FileEntry } from '../../lib/types' + +export default function ViewFiles() { + const [path, setPath] = useState('/sdcard') + const [pathInput, setPathInput] = useState('/sdcard') + const [files, setFiles] = useState([]) + const [loading, setLoading] = useState(false) + const [selected, setSelected] = useState>(new Set()) + const [renaming, setRenaming] = useState(null) + const [renameValue, setRenameValue] = useState('') + const [newFolder, setNewFolder] = useState(false) + const [newFolderName, setNewFolderName] = useState('') + + const loadFiles = useCallback(async (p: string) => { + setLoading(true) + setSelected(new Set()) + try { + const result = await ListFiles(p) + setFiles(result || []) + } catch (e: any) { + notify.error(e) + setFiles([]) + } finally { + setLoading(false) + } + }, []) + + useEffect(() => { loadFiles(path) }, [path, loadFiles]) + + const navigate = (entry: FileEntry) => { + if (entry.type === 'Directory') { + const next = path.endsWith('/') ? path + entry.name : path + '/' + entry.name + setPath(next) + setPathInput(next) + } + } + + const goUp = () => { + const parts = path.split('/').filter(Boolean) + if (parts.length === 0) return + parts.pop() + const next = '/' + parts.join('/') + setPath(next || '/') + setPathInput(next || '/') + } + + const navigatePath = () => { + setPath(pathInput) + loadFiles(pathInput) + } + + const toggleSelect = (name: string) => { + setSelected(prev => { + const next = new Set(prev) + next.has(name) ? next.delete(name) : next.add(name) + return next + }) + } + + const selectAll = () => { + if (selected.size === files.length) { + setSelected(new Set()) + } else { + setSelected(new Set(files.map(f => f.name))) + } + } + + const handlePush = async () => { + const local = await SelectFileForPush() + if (!local) return + const id = notify.loading('Pushing file...') + try { + const out = await PushFile(local, path) + notify.dismiss(id) + notify.success(out || 'File pushed') + loadFiles(path) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handlePull = async () => { + if (selected.size === 0) { notify.error('Select files to pull'); return } + const paths = [...selected].map(name => + path.endsWith('/') ? path + name : path + '/' + name + ) + const id = notify.loading(`Pulling ${paths.length} item(s)...`) + try { + const out = await PullMultipleFiles(paths) + notify.dismiss(id) + notify.success(out) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleDelete = async () => { + if (selected.size === 0) { notify.error('Select files to delete'); return } + const paths = [...selected].map(name => + path.endsWith('/') ? path + name : path + '/' + name + ) + if (!confirm(`Delete ${paths.length} item(s)?`)) return + const id = notify.loading('Deleting...') + try { + const out = await DeleteMultipleFiles(paths) + notify.dismiss(id) + notify.success(out) + loadFiles(path) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleCreateFolder = async () => { + if (!newFolderName.trim()) return + const fullPath = path.endsWith('/') ? path + newFolderName : path + '/' + newFolderName + try { + await CreateFolder(fullPath) + notify.success('Folder created') + setNewFolder(false) + setNewFolderName('') + loadFiles(path) + } catch (e: any) { + notify.error(e) + } + } + + const startRename = (name: string) => { + setRenaming(name) + setRenameValue(name) + } + + const handleRename = async () => { + if (!renaming || !renameValue.trim() || renameValue === renaming) { + setRenaming(null) + return + } + const oldPath = path.endsWith('/') ? path + renaming : path + '/' + renaming + const newPath = path.endsWith('/') ? path + renameValue : path + '/' + renameValue + try { + await RenameFile(oldPath, newPath) + notify.success('Renamed') + setRenaming(null) + loadFiles(path) + } catch (e: any) { + notify.error(e) + } + } + + const formatSize = (size: string) => { + const n = parseInt(size) + if (isNaN(n)) return size + if (n < 1024) return `${n} B` + if (n < 1048576) return `${(n / 1024).toFixed(1)} KB` + return `${(n / 1048576).toFixed(1)} MB` + } + + return ( +
+ {/* Toolbar */} +
+ + setPathInput(e.target.value)} + onKeyDown={e => e.key === 'Enter' && navigatePath()} + placeholder="/sdcard" + /> + + +
+ + + + + + {loading && ( + + )} +
+ + {/* New folder input */} + {newFolder && ( +
+ + setNewFolderName(e.target.value)} + onKeyDown={e => { + if (e.key === 'Enter') handleCreateFolder() + if (e.key === 'Escape') { setNewFolder(false); setNewFolderName('') } + }} + /> + + +
+ )} + + {/* File list header */} +
+ 0} + onChange={selectAll} + className="accent-accent-green" + /> + Name + Size + Permissions + Modified +
+ + {/* Files */} +
+ {loading && files.length === 0 && ( +
+
+
+ )} + {!loading && files.length === 0 && ( +
+

Empty directory

+
+ )} + {files.map(f => ( +
+ toggleSelect(f.name)} + className="accent-accent-green" + /> + + {/* Name */} +
+ {f.type === 'Directory' + ? + : + } + {renaming === f.name ? ( + setRenameValue(e.target.value)} + onBlur={handleRename} + onKeyDown={e => { + if (e.key === 'Enter') handleRename() + if (e.key === 'Escape') setRenaming(null) + }} + /> + ) : ( + navigate(f)} + > + {f.name} + + )} + +
+ + + {f.type === 'Directory' ? '—' : formatSize(f.size)} + + {f.permissions} + {f.date} {f.time} +
+ ))} +
+ + {/* Status bar */} +
+ {path} + {files.length} items{selected.size > 0 ? `, ${selected.size} selected` : ''} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewFlasher.tsx b/frontend/src/components/views/ViewFlasher.tsx new file mode 100644 index 0000000..0d0ca05 --- /dev/null +++ b/frontend/src/components/views/ViewFlasher.tsx @@ -0,0 +1,195 @@ +import { useState, useCallback } from 'react' +import { Zap, RefreshCw, AlertTriangle } from 'lucide-react' +import { GetFastbootDevices, FlashPartition, FastbootGetVar, SelectFileForFlash, SideloadPackage, SelectFileForInstall } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { Device } from '../../lib/types' + +const PARTITIONS = [ + 'boot', 'recovery', 'system', 'vendor', 'userdata', + 'dtbo', 'vbmeta', 'super', 'product', 'odm', 'radio' +] + +export default function ViewFlasher() { + const [devices, setDevices] = useState([]) + const [loadingDevices, setLoadingDevices] = useState(false) + const [partition, setPartition] = useState('boot') + const [selectedFile, setSelectedFile] = useState('') + const [flashing, setFlashing] = useState(false) + const [getvarKey, setGetvarKey] = useState('all') + const [getvarResult, setGetvarResult] = useState('') + + const refreshDevices = useCallback(async () => { + setLoadingDevices(true) + try { + const devs = await GetFastbootDevices() + setDevices(devs || []) + } catch (e: any) { + notify.error(e) + setDevices([]) + } finally { + setLoadingDevices(false) + } + }, []) + + const handleSelectFile = async () => { + const path = await SelectFileForFlash() + if (path) setSelectedFile(path) + } + + const handleFlash = async () => { + if (!selectedFile) { notify.error('Select an image file first'); return } + if (!confirm(`Flash ${selectedFile} to ${partition}?\n\nThis will overwrite the ${partition} partition. Make sure you know what you're doing.`)) return + + setFlashing(true) + const id = notify.loading(`Flashing ${partition}...`) + try { + const out = await FlashPartition(partition, selectedFile) + notify.dismiss(id) + notify.success(out || `${partition} flashed successfully`) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } finally { + setFlashing(false) + } + } + + const handleGetvar = async () => { + try { + const out = await FastbootGetVar(getvarKey) + setGetvarResult(out) + } catch (e: any) { + setGetvarResult(String(e)) + } + } + + const handleSideload = async () => { + const path = await SelectFileForInstall() + if (!path) return + if (!confirm('Sideload requires device to be in sideload mode (adb sideload). Continue?')) return + const id = notify.loading('Sideloading...') + try { + const out = await SideloadPackage(path) + notify.dismiss(id) + notify.success(out || 'Sideload complete') + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + return ( +
+

Flasher

+ + {/* Warning */} +
+ +
+

Fastboot operations are destructive and irreversible.

+

Wrong partition or wrong image = bricked device. Only partition names in the safe list are permitted. Make sure your device bootloader is unlocked before flashing.

+
+
+ +
+ {/* Fastboot devices */} +
+
+

Fastboot Devices

+ +
+ {devices.length === 0 ? ( +

+ No fastboot devices. Boot device to bootloader with:
+ adb reboot bootloader +

+ ) : ( +
+ {devices.map(d => ( +
+ {d.serial} + {d.status} +
+ ))} +
+ )} +
+ + {/* Flash partition */} +
+

Flash Partition

+
+
+ + +
+
+ +
+ + +
+
+ + {devices.length === 0 && ( +

Connect a device in fastboot mode to flash

+ )} +
+
+ + {/* Getvar */} +
+

Fastboot Getvar

+
+ setGetvarKey(e.target.value)} + placeholder="all" + /> + +
+ {getvarResult && ( +
+              {getvarResult}
+            
+ )} +
+ + {/* Sideload */} +
+

ADB Sideload

+

+ Sideload a ZIP (OTA update) to a device in sideload mode. Boot to recovery then select "Apply update from ADB". +

+ +
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewLogcat.tsx b/frontend/src/components/views/ViewLogcat.tsx new file mode 100644 index 0000000..dc13eb2 --- /dev/null +++ b/frontend/src/components/views/ViewLogcat.tsx @@ -0,0 +1,293 @@ +import { useState, useEffect, useRef, useCallback } from 'react' +import { Play, Square, Trash2, Download, Filter, ChevronDown } from 'lucide-react' +import { StartLogcat, StopLogcat, ClearLogcat } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { LogcatLine } from '../../lib/types' + +// @ts-ignore +const { EventsOn, EventsOff } = window['runtime'] || {} + +const LEVEL_COLORS: Record = { + V: 'text-text-muted', + D: 'text-blue-400', + I: 'text-accent-green', + W: 'text-warn', + E: 'text-danger', + F: 'text-red-300', + S: 'text-text-muted', +} + +const LEVEL_BG: Record = { + E: 'bg-danger/5', + F: 'bg-red-900/20', + W: 'bg-warn/5', +} + +const BUFFERS = ['main', 'radio', 'events', 'crash', 'all'] +const MAX_LINES = 5000 + +export default function ViewLogcat() { + const [lines, setLines] = useState([]) + const [running, setRunning] = useState(false) + const [filter, setFilter] = useState('') + const [tagFilter, setTagFilter] = useState('') + const [levelFilter, setLevelFilter] = useState([]) + const [buffer, setBuffer] = useState('main') + const [autoScroll, setAutoScroll] = useState(true) + const [search, setSearch] = useState('') + const [showFilters, setShowFilters] = useState(false) + const bottomRef = useRef(null) + const containerRef = useRef(null) + + // Wails runtime event bridge + const useWailsEvent = (event: string, handler: (data: any) => void) => { + useEffect(() => { + // @ts-ignore + const cleanup = window['runtime']?.EventsOn?.(event, handler) + return () => { + // @ts-ignore + window['runtime']?.EventsOff?.(event) + cleanup?.() + } + }, [event, handler]) + } + + const handleLine = useCallback((line: LogcatLine) => { + setLines(prev => { + const next = [...prev, line] + return next.length > MAX_LINES ? next.slice(next.length - MAX_LINES) : next + }) + }, []) + + const handleStopped = useCallback(() => { + setRunning(false) + }, []) + + useEffect(() => { + // @ts-ignore + window['runtime']?.EventsOn?.('logcat:line', handleLine) + // @ts-ignore + window['runtime']?.EventsOn?.('logcat:stopped', handleStopped) + return () => { + // @ts-ignore + window['runtime']?.EventsOff?.('logcat:line') + // @ts-ignore + window['runtime']?.EventsOff?.('logcat:stopped') + } + }, [handleLine, handleStopped]) + + useEffect(() => { + if (autoScroll && bottomRef.current) { + bottomRef.current.scrollIntoView({ behavior: 'smooth' }) + } + }, [lines, autoScroll]) + + const handleScroll = () => { + if (!containerRef.current) return + const { scrollTop, scrollHeight, clientHeight } = containerRef.current + const atBottom = scrollHeight - scrollTop - clientHeight < 100 + setAutoScroll(atBottom) + } + + const start = async () => { + try { + setLines([]) + await StartLogcat(filter, buffer) + setRunning(true) + } catch (e: any) { + notify.error(e) + } + } + + const stop = () => { + StopLogcat() + setRunning(false) + } + + const clear = async () => { + try { + await ClearLogcat() + setLines([]) + notify.success('Logcat cleared') + } catch (e: any) { + notify.error(e) + } + } + + const saveLog = () => { + const text = lines.map(l => l.raw).join('\n') + const blob = new Blob([text], { type: 'text/plain' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `logcat_${Date.now()}.txt` + a.click() + URL.revokeObjectURL(url) + } + + const filteredLines = lines.filter(line => { + if (levelFilter.length > 0 && !levelFilter.includes(line.level)) return false + if (tagFilter && !line.tag.toLowerCase().includes(tagFilter.toLowerCase())) return false + if (search && !line.raw.toLowerCase().includes(search.toLowerCase())) return false + return true + }) + + const toggleLevel = (level: string) => { + setLevelFilter(prev => + prev.includes(level) ? prev.filter(l => l !== level) : [...prev, level] + ) + } + + return ( +
+ {/* Toolbar */} +
+ {/* Buffer selector */} +
+ +
+ + {/* Start/Stop */} + {!running ? ( + + ) : ( + + )} + + + + + +
+ + {/* Search */} + setSearch(e.target.value)} + /> + + + +
+ + {/* Status */} +
+ {running && } + {filteredLines.length} lines{search || tagFilter || levelFilter.length > 0 ? ' (filtered)' : ''} + +
+
+ + {/* Filter panel */} + {showFilters && ( +
+ {/* Level filter */} +
+ Level: + {['V', 'D', 'I', 'W', 'E', 'F'].map(level => ( + + ))} +
+ + {/* Tag filter */} +
+ Tag: + setTagFilter(e.target.value)} + /> +
+ + {/* ADB filter string */} +
+ ADB filter: + setFilter(e.target.value)} + disabled={running} + /> +
+ + {(levelFilter.length > 0 || tagFilter || search) && ( + + )} +
+ )} + + {/* Log output */} +
+ {filteredLines.length === 0 && ( +
+ {running ? 'Waiting for log output...' : 'Press Start to begin streaming logcat'} +
+ )} + {filteredLines.map((line, i) => ( +
+ {line.time} + {line.pid} + + {line.level} + + {line.tag} + + {line.message || line.raw} + +
+ ))} +
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewPackages.tsx b/frontend/src/components/views/ViewPackages.tsx new file mode 100644 index 0000000..83e6ec8 --- /dev/null +++ b/frontend/src/components/views/ViewPackages.tsx @@ -0,0 +1,256 @@ +import { useState, useCallback, useMemo } from 'react' +import { Package, RefreshCw, Search, Download, Trash2, Power, PowerOff, X } from 'lucide-react' +import { + ListPackages, UninstallMultiplePackages, DisableMultiplePackages, + EnableMultiplePackages, PullApk, ClearData, ForceStopPackage, + SelectFileForInstall, InstallPackage +} from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { PackageInfo } from '../../lib/types' + +type Filter = 'all' | 'user' | 'system' + +export default function ViewPackages() { + const [packages, setPackages] = useState([]) + const [loading, setLoading] = useState(false) + const [filter, setFilter] = useState('user') + const [search, setSearch] = useState('') + const [selected, setSelected] = useState>(new Set()) + const [activeCtx, setActiveCtx] = useState(null) + + const load = useCallback(async (f: Filter) => { + setLoading(true) + setSelected(new Set()) + setPackages([]) + try { + const pkgs = await ListPackages(f) + setPackages(pkgs || []) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + }, []) + + const filtered = useMemo(() => + packages + .filter(p => p.packageName.toLowerCase().includes(search.toLowerCase())) + .sort((a, b) => a.packageName.localeCompare(b.packageName)), + [packages, search] + ) + + const toggleSelect = (pkg: string) => { + setSelected(prev => { + const next = new Set(prev) + next.has(pkg) ? next.delete(pkg) : next.add(pkg) + return next + }) + } + + const selectAll = () => { + if (selected.size === filtered.length) { + setSelected(new Set()) + } else { + setSelected(new Set(filtered.map(p => p.packageName))) + } + } + + const batchOp = async (label: string, op: (pkgs: string[]) => Promise) => { + if (selected.size === 0) { notify.error('Select packages first'); return } + const id = notify.loading(`${label} ${selected.size} package(s)...`) + try { + const out = await op([...selected]) + notify.dismiss(id) + notify.success(out) + load(filter) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handleInstall = async () => { + const path = await SelectFileForInstall() + if (!path) return + const id = notify.loading('Installing APK...') + try { + const out = await InstallPackage(path) + notify.dismiss(id) + notify.success(out || 'Installed successfully') + load(filter) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const handlePullApk = async (pkg: string) => { + const id = notify.loading(`Pulling APK for ${pkg}...`) + try { + const out = await PullApk(pkg) + notify.dismiss(id) + notify.success(out) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + setActiveCtx(null) + } + + const handleClearData = async (pkg: string) => { + if (!confirm(`Clear data for ${pkg}?`)) return + try { + const out = await ClearData(pkg) + notify.success(out) + } catch (e: any) { + notify.error(e) + } + setActiveCtx(null) + } + + const handleForceStop = async (pkg: string) => { + try { + const out = await ForceStopPackage(pkg) + notify.success(out) + } catch (e: any) { + notify.error(e) + } + setActiveCtx(null) + } + + return ( +
+ {/* Toolbar */} +
+ {/* Filter tabs */} +
+ {(['user', 'system', 'all'] as Filter[]).map(f => ( + + ))} +
+ + + +
+ + setSearch(e.target.value)} + /> +
+ +
+ + + + {selected.size > 0 && ( + <> + + + + + )} +
+ + {/* Package list header */} +
+ 0 && selected.size === filtered.length} + onChange={selectAll} + className="accent-accent-green" + /> + Package + State + Actions +
+ + {/* Package list */} +
+ {loading && ( +
+
+
+ )} + {!loading && packages.length === 0 && ( +
+ +

Click "Load" to fetch packages

+
+ )} + {filtered.map(pkg => ( +
+ toggleSelect(pkg.packageName)} + className="accent-accent-green" + /> + {pkg.packageName} + + + {pkg.isEnabled ? 'enabled' : 'disabled'} + + +
+ + {activeCtx === pkg.packageName && ( +
+ + + +
+ )} +
+
+ ))} +
+ + {/* Status bar */} +
+ {filtered.length} packages{search ? ` matching "${search}"` : ''} + {selected.size > 0 && {selected.size} selected} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewPixelFlasher.tsx b/frontend/src/components/views/ViewPixelFlasher.tsx new file mode 100644 index 0000000..8dd80d7 --- /dev/null +++ b/frontend/src/components/views/ViewPixelFlasher.tsx @@ -0,0 +1,582 @@ +import { useState, useRef } from 'react' +import { Zap, AlertTriangle, FolderOpen, Check, X, RefreshCw, ChevronDown, ChevronRight } from 'lucide-react' +import { GetFastbootDevices, Reboot } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { Device } from '../../lib/types' + +type StepStatus = 'waiting' | 'running' | 'done' | 'error' | 'skipped' + +interface FlashStep { + id: string + label: string + description: string + status: StepStatus + output?: string +} + +interface FlashOptions { + wipeData: boolean + disableVerity: boolean + disableVerification: boolean + force: boolean + flashBothSlots: boolean +} + +const DEFAULT_OPTS: FlashOptions = { + wipeData: true, + disableVerity: false, + disableVerification: false, + force: false, + flashBothSlots: false, +} + +// Parse flash-all.sh lines into structured steps +interface ParsedStep { + type: 'flash' | 'reboot' | 'update' | 'sleep' + partition?: string + file?: string + wipe?: boolean +} + +function parseFlashAllSh(content: string): ParsedStep[] { + const steps: ParsedStep[] = [] + for (const raw of content.split('\n')) { + const line = raw.trim() + if (!line || line.startsWith('#') || line.startsWith('#!/')) continue + if (!line.startsWith('fastboot')) continue + const parts = line.split(/\s+/) + if (parts[1] === 'flash' && parts[2] && parts[3]) { + steps.push({ type: 'flash', partition: parts[2], file: parts[3] }) + } else if (parts[1] === 'reboot-bootloader') { + steps.push({ type: 'reboot' }) + } else if (parts[1] === '-w' && parts[2] === 'update') { + steps.push({ type: 'update', wipe: true, file: parts[3] }) + } else if (parts[1] === 'update') { + steps.push({ type: 'update', wipe: false, file: parts[2] }) + } + } + return steps +} + +function buildSteps(parsed: ParsedStep[], opts: FlashOptions): FlashStep[] { + const steps: FlashStep[] = [] + let rebootCount = 0 + + for (const p of parsed) { + if (p.type === 'flash') { + const flags: string[] = [] + if (opts.disableVerity) flags.push('--disable-verity') + if (opts.disableVerification) flags.push('--disable-verification') + if (opts.force) flags.push('--force') + if (opts.flashBothSlots) flags.push('--slot all') + const flagStr = flags.length ? flags.join(' ') + ' ' : '' + steps.push({ + id: `flash_${p.partition}_${steps.length}`, + label: `Flash ${p.partition}`, + description: `fastboot ${flagStr}flash ${p.partition} ${p.file}`, + status: 'waiting', + }) + } else if (p.type === 'reboot') { + rebootCount++ + steps.push({ + id: `reboot_${rebootCount}`, + label: 'Reboot to bootloader', + description: 'fastboot reboot-bootloader', + status: 'waiting', + }) + } else if (p.type === 'update') { + const flags: string[] = [] + if (opts.disableVerity) flags.push('--disable-verity') + if (opts.disableVerification) flags.push('--disable-verification') + if (opts.force) flags.push('--force') + const wipeFlag = opts.wipeData ? '-w ' : '' + const flagStr = flags.length ? flags.join(' ') + ' ' : '' + steps.push({ + id: 'update_image', + label: opts.wipeData ? 'Flash image zip (wipe data)' : 'Flash image zip', + description: `fastboot ${flagStr}${wipeFlag}update ${p.file}`, + status: 'waiting', + }) + } + } + + steps.push({ + id: 'reboot_system', + label: 'Reboot to system', + description: 'fastboot reboot', + status: 'waiting', + }) + + return steps +} + +export default function ViewPixelFlasher() { + const [devices, setDevices] = useState([]) + const [loadingDevices, setLoading] = useState(false) + const [factoryZip, setFactoryZip] = useState('') + const [opts, setOpts] = useState(DEFAULT_OPTS) + const [parsedSteps, setParsedSteps] = useState([]) + const [steps, setSteps] = useState([]) + const [flashing, setFlashing] = useState(false) + const [done, setDone] = useState(false) + const [showAdvanced, setShowAdvanced] = useState(false) + const [log, setLog] = useState([]) + const logRef = useRef(null) + + const addLog = (msg: string) => { + setLog(prev => [...prev, `${new Date().toLocaleTimeString()} ${msg}`]) + setTimeout(() => logRef.current?.scrollTo(0, logRef.current.scrollHeight), 50) + } + + const updateStep = (id: string, status: StepStatus, output?: string) => + setSteps(prev => prev.map(s => s.id === id ? { ...s, status, output } : s)) + + const refreshDevices = async () => { + setLoading(true) + try { + const devs = await GetFastbootDevices() + setDevices(devs || []) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + const handleSelectZip = async () => { + try { + // @ts-ignore + const path: string = await window['go']['main']['App']['SelectFileForFlash']() + if (!path) return + setFactoryZip(path) + setSteps([]) + setParsedSteps([]) + setLog([]) + setDone(false) + // Read flash-all.sh from inside the zip using Go backend + try { + // @ts-ignore + const content: string = await window['go']['main']['App']['ReadFileFromZip'](path, 'flash-all.sh') + if (content) { + const parsed = parseFlashAllSh(content) + setParsedSteps(parsed) + setSteps(buildSteps(parsed, opts)) + addLog(`Parsed flash-all.sh: ${parsed.length} steps found`) + } else { + addLog('Warning: flash-all.sh not found in zip — is this a valid Pixel factory image?') + } + } catch { + addLog('Could not read flash-all.sh from zip. Make sure this is an extracted factory image folder or valid zip.') + } + } catch (e: any) { + notify.error('Could not open file dialog') + } + } + + const updateOpts = (newOpts: FlashOptions) => { + setOpts(newOpts) + if (parsedSteps.length > 0) { + setSteps(buildSteps(parsedSteps, newOpts)) + } + } + + const runFastboot = async (args: string): Promise => { + // @ts-ignore + return await window['go']['main']['App']['RunAdbHostCommand']('fastboot ' + args) as string + } + + const sleep = (ms: number) => new Promise(r => setTimeout(r, ms)) + + const waitForFastboot = async (timeoutMs = 45000): Promise => { + const start = Date.now() + while (Date.now() - start < timeoutMs) { + try { + const devs = await GetFastbootDevices() + if (devs && devs.length > 0) return true + } catch {} + await sleep(2000) + } + return false + } + + const startFlash = async () => { + if (!factoryZip) { notify.error('Select a factory image zip first'); return } + if (devices.length === 0) { notify.error('No fastboot device detected — boot to bootloader first'); return } + if (parsedSteps.length === 0) { notify.error('No flash steps parsed — check the factory image zip'); return } + + const flags: string[] = [] + if (opts.disableVerity) flags.push('--disable-verity') + if (opts.disableVerification) flags.push('--disable-verification') + if (opts.force) flags.push('--force') + if (opts.flashBothSlots) flags.push('--slot all') + const flagSummary = flags.length ? flags.join(' ') : 'none' + + if (!confirm( + `Flash Pixel factory image?\n\n` + + `File: ${factoryZip}\n` + + `Wipe userdata: ${opts.wipeData ? 'YES — all data erased' : 'No'}\n` + + `Extra flags: ${flagSummary}\n\n` + + `This is irreversible. Confirm you have the correct image for your device.` + )) return + + const freshSteps = buildSteps(parsedSteps, opts) + setSteps(freshSteps) + setLog([]) + setFlashing(true) + setDone(false) + + // Extract zip directory for file references + const zipDir = factoryZip.substring(0, factoryZip.lastIndexOf('/')) + + try { + for (const step of freshSteps) { + updateStep(step.id, 'running') + addLog(`→ ${step.description}`) + + if (step.id === 'reboot_system') { + try { + await runFastboot('reboot') + addLog('Device rebooting to system...') + updateStep(step.id, 'done') + } catch (e: any) { + updateStep(step.id, 'error', String(e)) + addLog(`ERROR: ${e}`) + } + continue + } + + if (step.id.startsWith('reboot_')) { + try { + await runFastboot('reboot-bootloader') + addLog('Waiting for device to return to fastboot...') + await sleep(5000) + const back = await waitForFastboot() + if (!back) throw new Error('Device did not return to fastboot within 45s') + addLog('Device back in fastboot') + updateStep(step.id, 'done') + } catch (e: any) { + updateStep(step.id, 'error', String(e)) + addLog(`ERROR: ${e}`) + setFlashing(false) + return + } + continue + } + + if (step.id === 'update_image') { + // fastboot update uses the image-*.zip inside the factory zip + // The file path in flash-all.sh is relative — resolve against zip dir + const parsed = parsedSteps.find(p => p.type === 'update') + const imageZipName = parsed?.file || '' + const imageZipPath = `${zipDir}/${imageZipName}` + const flags2: string[] = [] + if (opts.disableVerity) flags2.push('--disable-verity') + if (opts.disableVerification) flags2.push('--disable-verification') + if (opts.force) flags2.push('--force') + const wipeFlag = opts.wipeData ? '-w ' : '' + const flagStr = flags2.length ? flags2.join(' ') + ' ' : '' + const cmd = `${flagStr}${wipeFlag}update ${imageZipPath}` + try { + const out = await runFastboot(cmd) + addLog(out || 'Image flashed') + updateStep(step.id, 'done', out) + } catch (e: any) { + updateStep(step.id, 'error', String(e)) + addLog(`ERROR: ${e}`) + setFlashing(false) + return + } + continue + } + + // Regular flash step + if (step.id.startsWith('flash_')) { + const parsed = parsedSteps.find(p => p.type === 'flash' && + step.label === `Flash ${p.partition}`) + const fileName = parsed?.file || '' + const filePath = `${zipDir}/${fileName}` + const flags2: string[] = [] + if (opts.disableVerity) flags2.push('--disable-verity') + if (opts.disableVerification) flags2.push('--disable-verification') + if (opts.force) flags2.push('--force') + if (opts.flashBothSlots) flags2.push('--slot all') + const flagStr = flags2.length ? flags2.join(' ') + ' ' : '' + const partition = parsed?.partition || '' + const cmd = `${flagStr}flash ${partition} ${filePath}` + try { + const out = await runFastboot(cmd) + addLog(out || `${partition} flashed`) + updateStep(step.id, 'done', out) + } catch (e: any) { + // Some partitions may not exist on all devices — skip with warning + addLog(`WARN: ${partition}: ${e} — skipping`) + updateStep(step.id, 'skipped', String(e)) + } + continue + } + } + + addLog('✓ Flash complete!') + setDone(true) + notify.success('Flash complete — device is rebooting') + } catch (e: any) { + addLog(`FATAL: ${e}`) + notify.error(`Flash failed: ${e}`) + } finally { + setFlashing(false) + } + } + + const statusIcon = (s: StepStatus) => { + switch (s) { + case 'done': return + case 'error': return + case 'skipped': return + case 'running': return
+ default: return
+ } + } + + return ( +
+

Pixel Factory Flash

+ + {/* Warning */} +
+ +
+

This will completely overwrite your device firmware.

+

+ Download the correct factory image for your Pixel from{' '} + developers.google.com/android/images. + Extract the outer zip first — then select the inner factory zip (e.g.{' '} + cheetah-ap2a.240905.003-factory-*.zip). + Bootloader must be unlocked. +

+
+
+ +
+ {/* Left: config */} +
+ {/* Device */} +
+
+

Fastboot Device

+ +
+ {devices.length === 0 ? ( +

+ No device in fastboot — run: adb reboot bootloader +

+ ) : ( +
+ {devices[0].serial} — {devices[0].status} +
+ )} +
+ + {/* Factory image */} +
+

Factory Image Zip

+

+ Extract the outer zip from Google, then select the inner device-build-factory-*.zip +

+
+ + +
+ {parsedSteps.length > 0 && ( +

+ flash-all.sh parsed — {parsedSteps.length} steps detected +

+ )} +
+ + {/* Flash options */} +
+

Flash Options

+ + + + {/* Advanced toggle */} + + + {showAdvanced && ( +
+ + + + + + + +
+ )} + + {/* Command preview */} + {parsedSteps.length > 0 && ( +
+

Command preview:

+ {(() => { + const flags: string[] = [] + if (opts.disableVerity) flags.push('--disable-verity') + if (opts.disableVerification) flags.push('--disable-verification') + if (opts.force) flags.push('--force') + const flagStr = flags.length ? flags.join(' ') + ' ' : '' + const wipe = opts.wipeData ? '-w ' : '' + return ( +

+ fastboot {flagStr}flash bootloader bootloader-*.img
+ fastboot reboot-bootloader
+ fastboot {flagStr}flash radio radio-*.img
+ fastboot reboot-bootloader
+ fastboot {flagStr}{wipe}update image-*.zip +

+ ) + })()} +
+ )} + + + + {done && ( +
+ Flash complete — device rebooting +
+ )} +
+
+ + {/* Right: steps + log */} +
+ {/* Steps */} +
+

+ Flash Steps {steps.length > 0 ? `(${steps.length})` : '— select a factory zip to populate'} +

+ {steps.length === 0 && ( +

+ Select a factory image zip to see the flash sequence +

+ )} +
+ {steps.map(step => ( +
+
{statusIcon(step.status)}
+
+

+ {step.label} +

+

{step.description}

+ {step.output && step.status === 'error' && ( +

{step.output}

+ )} +
+
+ ))} +
+
+ + {/* Log */} + {log.length > 0 && ( +
+

Flash Log

+
+ {log.map((line, i) => ( +
+ {line} +
+ ))} +
+
+ )} +
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewProps.tsx b/frontend/src/components/views/ViewProps.tsx new file mode 100644 index 0000000..56e987d --- /dev/null +++ b/frontend/src/components/views/ViewProps.tsx @@ -0,0 +1,241 @@ +import { useState, useEffect, useMemo } from 'react' +import { RefreshCw, Search, Edit3, Check, X, ChevronDown, ChevronRight } from 'lucide-react' +import { GetAllProps, SetProp } from '../../lib/wails' +import { notify } from '../../lib/notify' +import type { PropEntry } from '../../lib/types' + +export default function ViewProps() { + const [props, setProps] = useState([]) + const [loading, setLoading] = useState(false) + const [search, setSearch] = useState('') + const [catFilter, setCatFilter] = useState('All') + const [editing, setEditing] = useState(null) + const [editValue, setEditValue] = useState('') + const [openCats, setOpenCats] = useState>(new Set(['Build', 'Product', 'Boot'])) + + const load = async () => { + setLoading(true) + try { + const data = await GetAllProps() + setProps(data || []) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + useEffect(() => { load() }, []) + + const categories = useMemo(() => { + const cats = [...new Set(props.map(p => p.category))].sort() + return ['All', ...cats] + }, [props]) + + const filtered = useMemo(() => + props.filter(p => { + if (catFilter !== 'All' && p.category !== catFilter) return false + if (search) { + const q = search.toLowerCase() + return p.key.toLowerCase().includes(q) || p.value.toLowerCase().includes(q) + } + return true + }), + [props, search, catFilter] + ) + + const grouped = useMemo(() => { + const groups: Record = {} + for (const p of filtered) { + if (!groups[p.category]) groups[p.category] = [] + groups[p.category].push(p) + } + return groups + }, [filtered]) + + const toggleCat = (cat: string) => setOpenCats(prev => { + const next = new Set(prev) + next.has(cat) ? next.delete(cat) : next.add(cat) + return next + }) + + const startEdit = (prop: PropEntry) => { + setEditing(prop.key) + setEditValue(prop.value) + } + + const saveEdit = async (key: string) => { + if (!editing) return + const id = notify.loading(`Setting ${key}...`) + try { + const out = await SetProp(key, editValue) + notify.dismiss(id) + notify.success(out) + setEditing(null) + // Update local state immediately + setProps(prev => prev.map(p => p.key === key ? { ...p, value: editValue } : p)) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + } + + const cancelEdit = () => { + setEditing(null) + setEditValue('') + } + + return ( +
+ {/* Toolbar */} +
+
+ + setSearch(e.target.value)} + /> +
+ + + + + + + {filtered.length} / {props.length} props + +
+ + {/* Props list */} +
+ {loading && props.length === 0 && ( +
+
+
+ )} + + {!loading && props.length === 0 && ( +
+ Connect a device and click Refresh +
+ )} + + {catFilter === 'All' + ? Object.entries(grouped).map(([cat, catProps]) => ( +
+ + + {openCats.has(cat) && catProps.map(p => ( + + ))} +
+ )) + : filtered.map(p => ( + + )) + } +
+
+ ) +} + +interface PropRowProps { + prop: PropEntry + editing: boolean + editValue: string + onEdit: (p: PropEntry) => void + onSave: (key: string) => void + onCancel: () => void + onEditValueChange: (v: string) => void +} + +function PropRow({ prop, editing, editValue, onEdit, onSave, onCancel, onEditValueChange }: PropRowProps) { + const isReadOnly = prop.key.startsWith('ro.') + + return ( +
+
+ + {prop.key} + + {editing ? ( + onEditValueChange(e.target.value)} + onKeyDown={e => { + if (e.key === 'Enter') onSave(prop.key) + if (e.key === 'Escape') onCancel() + }} + /> + ) : ( + + {prop.value || '(empty)'} + + )} +
+ +
+ {isReadOnly && ro} + {editing ? ( + <> + + + + ) : ( + + )} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewSettings.tsx b/frontend/src/components/views/ViewSettings.tsx new file mode 100644 index 0000000..7dcb6fd --- /dev/null +++ b/frontend/src/components/views/ViewSettings.tsx @@ -0,0 +1,142 @@ +import { useState, useEffect } from 'react' +import { Shield, RefreshCw, Check, AlertTriangle } from 'lucide-react' +import { GetBinaryInfo, SetAdbPath, SetFastbootPath } from '../../lib/wails' +import { notify } from '../../lib/notify' + +export default function ViewSettings() { + const [binaryInfo, setBinaryInfo] = useState>({}) + const [loading, setLoading] = useState(false) + const [adbPath, setAdbPath] = useState('') + const [fastbootPath, setFastbootPath] = useState('') + + const loadBinaryInfo = async () => { + setLoading(true) + try { + const info = await GetBinaryInfo() + setBinaryInfo(info) + } catch (e: any) { + notify.error(e) + } finally { + setLoading(false) + } + } + + useEffect(() => { loadBinaryInfo() }, []) + + const handleSetAdb = async () => { + try { + await SetAdbPath(adbPath) + notify.success('ADB path updated') + loadBinaryInfo() + } catch (e: any) { + notify.error(e) + } + } + + const handleSetFastboot = async () => { + try { + await SetFastbootPath(fastbootPath) + notify.success('Fastboot path updated') + loadBinaryInfo() + } catch (e: any) { + notify.error(e) + } + } + + return ( +
+

Settings

+ + {/* Binary trust section */} +
+
+
+ +

Binary Verification

+
+ +
+ +
+

+ ATK uses YOUR system ADB/Fastboot — no bundled binaries +

+

+ By default ATK uses whatever adb and fastboot are on your PATH (installed via apt install adb fastboot or Android SDK). You can verify the SHA-256 hashes below against Google's published platform-tools checksums. +

+
+ + {/* Binary info display */} + {Object.entries(binaryInfo).map(([name, info]) => ( +
+

{name}

+
+              {info}
+            
+
+ ))} + +
+

+ + Verify SHA-256 against Google's official platform-tools: +

+

https://developer.android.com/tools/releases/platform-tools

+
+
+ + {/* Custom binary paths */} +
+

Custom Binary Paths

+

+ Override the auto-detected binary paths. Leave empty to use system PATH. Changes take effect immediately. +

+ +
+
+ +
+ setAdbPath(e.target.value)} + /> + +
+
+ +
+ +
+ setFastbootPath(e.target.value)} + /> + +
+
+
+
+ + {/* About */} +
+

About

+
+

ATK (Android Toolkit) — an all-in-one ADB GUI for Android power users and bug hunters

+

All commands use discrete argument passing — no shell string building, no injection vectors

+

Built with Wails v2 (Go + React) · github.com/jegly/ATK

+
+
+
+ ) +} diff --git a/frontend/src/components/views/ViewShell.tsx b/frontend/src/components/views/ViewShell.tsx new file mode 100644 index 0000000..ac0dd9c --- /dev/null +++ b/frontend/src/components/views/ViewShell.tsx @@ -0,0 +1,150 @@ +import { useState, useRef, useEffect } from 'react' +import { Terminal, Trash2, ChevronRight } from 'lucide-react' +import { RunShellCommand, RunAdbHostCommand } from '../../lib/wails' + +interface HistoryEntry { + cmd: string + output: string + error?: boolean + mode: 'shell' | 'adb' +} + +export default function ViewShell() { + const [history, setHistory] = useState([ + { cmd: '', output: 'ADBKit Shell — commands run via adb shell (no pipes/redirects — args are split directly, no shell injection)\nSwitch to "adb" mode to run adb host commands (e.g. adb devices, adb logcat)', mode: 'shell' } + ]) + const [input, setInput] = useState('') + const [mode, setMode] = useState<'shell' | 'adb'>('shell') + const [loading, setLoading] = useState(false) + const [cmdHistory, setCmdHistory] = useState([]) + const [historyIdx, setHistoryIdx] = useState(-1) + const bottomRef = useRef(null) + const inputRef = useRef(null) + + useEffect(() => { + bottomRef.current?.scrollIntoView({ behavior: 'smooth' }) + }, [history]) + + const run = async () => { + const cmd = input.trim() + if (!cmd) return + + setCmdHistory(prev => [cmd, ...prev.slice(0, 99)]) + setHistoryIdx(-1) + setInput('') + setLoading(true) + + try { + let output: string + if (mode === 'shell') { + output = await RunShellCommand(cmd) + } else { + output = await RunAdbHostCommand(cmd) + } + setHistory(prev => [...prev, { cmd, output: output || '(no output)', mode }]) + } catch (e: any) { + setHistory(prev => [...prev, { cmd, output: String(e), error: true, mode }]) + } finally { + setLoading(false) + } + } + + const onKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + run() + return + } + if (e.key === 'ArrowUp') { + e.preventDefault() + const next = Math.min(historyIdx + 1, cmdHistory.length - 1) + setHistoryIdx(next) + setInput(cmdHistory[next] || '') + } + if (e.key === 'ArrowDown') { + e.preventDefault() + const next = Math.max(historyIdx - 1, -1) + setHistoryIdx(next) + setInput(next === -1 ? '' : cmdHistory[next]) + } + } + + return ( +
+ {/* Toolbar */} +
+ + Mode: +
+ {(['shell', 'adb'] as const).map(m => ( + + ))} +
+
+ +
+ + {/* Output */} +
inputRef.current?.focus()} + > + {history.map((entry, i) => ( +
+ {entry.cmd && ( +
+ [{entry.mode}]$ + {entry.cmd} +
+ )} +
+              {entry.output}
+            
+
+ ))} + {loading && ( +
+ + Running... +
+ )} +
+
+ + {/* Input */} +
+ [{mode}]$ + + setInput(e.target.value)} + onKeyDown={onKeyDown} + disabled={loading} + /> + {loading && ( +
+ )} +
+
+ ) +} diff --git a/frontend/src/components/views/ViewUtilities.tsx b/frontend/src/components/views/ViewUtilities.tsx new file mode 100644 index 0000000..5e5d1ad --- /dev/null +++ b/frontend/src/components/views/ViewUtilities.tsx @@ -0,0 +1,1041 @@ +import { useState } from 'react' +import { FileText, Wrench, ChevronDown, ChevronRight, Play, Copy, Check } from 'lucide-react' +import { Reboot, RunAdbHostCommand } from '../../lib/wails' +import { notify } from '../../lib/notify' + +interface Command { + label: string + cmd: string + needsInput?: { placeholder: string; token: string }[] +} + +interface Category { + name: string + commands: Command[] +} + +const CATEGORIES: Category[] = [ + // ───────────────────────────────────────────── + { + name: 'Device Info', + commands: [ + { label: 'All system properties', cmd: 'shell getprop' }, + { label: 'Android version', cmd: 'shell getprop ro.build.version.release' }, + { label: 'Android SDK level', cmd: 'shell getprop ro.build.version.sdk' }, + { label: 'Device model', cmd: 'shell getprop ro.product.model' }, + { label: 'Device brand', cmd: 'shell getprop ro.product.brand' }, + { label: 'Device codename', cmd: 'shell getprop ro.product.device' }, + { label: 'Build fingerprint', cmd: 'shell getprop ro.build.fingerprint' }, + { label: 'Build ID', cmd: 'shell getprop ro.build.id' }, + { label: 'Build description', cmd: 'shell getprop ro.build.description' }, + { label: 'Build tags', cmd: 'shell getprop ro.build.tags' }, + { label: 'Build type (user/userdebug/eng)', cmd: 'shell getprop ro.build.type' }, + { label: 'Security patch level', cmd: 'shell getprop ro.build.version.security_patch' }, + { label: 'Bootloader version', cmd: 'shell getprop ro.bootloader' }, + { label: 'Baseband / radio version', cmd: 'shell getprop gsm.version.baseband' }, + { label: 'Hardware revision', cmd: 'shell getprop ro.hardware' }, + { label: 'CPU ABI', cmd: 'shell getprop ro.product.cpu.abi' }, + { label: 'CPU ABI list (all)', cmd: 'shell getprop ro.product.cpu.abilist' }, + { label: 'Device serial number', cmd: 'get-serialno' }, + { label: 'Current device state', cmd: 'get-state' }, + { label: 'Connected devices', cmd: 'devices' }, + { label: 'Connected devices (verbose)', cmd: 'devices -l' }, + { label: 'Kernel version', cmd: 'shell cat /proc/version' }, + { label: 'Kernel command line', cmd: 'shell cat /proc/cmdline' }, + { label: 'System uptime', cmd: 'shell cat /proc/uptime' }, + { label: 'Load average', cmd: 'shell cat /proc/loadavg' }, + { label: 'CPU info', cmd: 'shell cat /proc/cpuinfo' }, + { label: 'Memory info', cmd: 'shell cat /proc/meminfo' }, + { label: 'CPU statistics', cmd: 'shell cat /proc/stat' }, + { label: 'Partition table', cmd: 'shell cat /proc/partitions' }, + { label: 'Supported filesystems', cmd: 'shell cat /proc/filesystems' }, + { label: 'Scheduler debug info', cmd: 'shell cat /proc/sched_debug' }, + { label: 'Interrupt counts', cmd: 'shell cat /proc/interrupts' }, + { label: 'Registered devices', cmd: 'shell cat /proc/devices' }, + { label: 'Control groups info', cmd: 'shell cat /proc/cgroups' }, + { label: 'Current shell process status', cmd: 'shell cat /proc/self/status' }, + { label: 'Memory zones (zoneinfo)', cmd: 'shell cat /proc/zoneinfo' }, + { label: 'Kernel slab allocator', cmd: 'shell cat /proc/slabinfo' }, + { label: 'Kernel wakelocks (root)', cmd: 'shell cat /proc/wakelocks' }, + { label: 'Kernel modules loaded', cmd: 'shell lsmod' }, + { label: 'Device tree (dtb) info', cmd: 'shell ls /proc/device-tree' }, + { label: 'ADB version', cmd: 'version' }, + { label: 'SELinux enforce status', cmd: 'shell getenforce' }, + { label: 'SELinux policy version', cmd: 'shell cat /sys/fs/selinux/policyvers' }, + { label: 'uname -a (full kernel info)', cmd: 'shell uname -a' }, + { label: 'Android ID', cmd: 'shell settings get secure android_id' }, + { label: 'Timezone', cmd: 'shell getprop persist.sys.timezone' }, + { label: 'Language locale', cmd: 'shell getprop persist.sys.locale' }, + { label: 'Screen density (DPI)', cmd: 'shell getprop ro.sf.lcd_density' }, + { label: 'Encryption state', cmd: 'shell getprop ro.crypto.state' }, + { label: 'Encryption type', cmd: 'shell getprop ro.crypto.type' }, + { label: 'Verified boot state', cmd: 'shell getprop ro.boot.verifiedbootstate' }, + { label: 'Flash locked state', cmd: 'shell getprop ro.boot.flash.locked' }, + { label: 'vbmeta device state', cmd: 'shell getprop ro.boot.vbmeta.device_state' }, + { label: 'Active slot (A/B)', cmd: 'shell getprop ro.boot.slot_suffix' }, + { label: 'Dynamic partitions enabled', cmd: 'shell getprop ro.boot.dynamic_partitions' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Processes & Memory', + commands: [ + { label: 'All running processes', cmd: 'shell ps -A' }, + { label: 'Processes with threads', cmd: 'shell ps -AT' }, + { label: 'Process tree', cmd: 'shell ps -A --forest' }, + { label: 'Live CPU & memory (top)', cmd: 'shell top -n 1' }, + { label: 'Top sorted by CPU', cmd: 'shell top -n 1 -s cpu' }, + { label: 'Top sorted by memory', cmd: 'shell top -n 1 -s rss' }, + { label: 'Memory details (meminfo)', cmd: 'shell dumpsys meminfo' }, + { label: 'CPU usage snapshot', cmd: 'shell dumpsys cpuinfo' }, + { label: 'Process statistics', cmd: 'shell dumpsys procstats' }, + { label: 'Process stats last 3 hours', cmd: 'shell dumpsys procstats --hours 3' }, + { label: 'Process stats last 24 hours', cmd: 'shell dumpsys procstats --hours 24' }, + { label: 'Detailed process info (activity)', cmd: 'shell dumpsys activity processes' }, + { label: 'Virtual memory statistics', cmd: 'shell vmstat' }, + { label: 'I/O statistics', cmd: 'shell iostat' }, + { label: 'List open files (root)', cmd: 'shell lsof' }, + { label: 'OOM killer log', cmd: 'shell dmesg | grep -i oom' }, + { label: 'Low memory killer log', cmd: 'shell dmesg | grep -i lowmemorykiller' }, + { label: 'Zygote PID', cmd: 'shell pidof zygote' }, + { label: 'System server PID', cmd: 'shell pidof system_server' }, + { label: 'strace on PID (requires root)', + cmd: 'shell strace -p ', + needsInput: [{ placeholder: '1234', token: '' }] }, + { label: 'Kill process by PID (requires root)', + cmd: 'shell kill -9 ', + needsInput: [{ placeholder: '1234', token: '' }] }, + { label: 'Memory map for PID', + cmd: 'shell cat /proc//maps', + needsInput: [{ placeholder: '1234', token: '' }] }, + { label: 'File descriptors for PID', + cmd: 'shell ls -la /proc//fd', + needsInput: [{ placeholder: '1234', token: '' }] }, + { label: 'CPU frequencies (all cores)', cmd: 'shell cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq' }, + { label: 'CPU governor', cmd: 'shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' }, + { label: 'Available CPU governors', cmd: 'shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors' }, + { label: 'Max CPU frequency', cmd: 'shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq' }, + { label: 'Min CPU frequency', cmd: 'shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Battery & Power', + commands: [ + { label: 'Battery state', cmd: 'shell dumpsys battery' }, + { label: 'Battery usage stats', cmd: 'shell dumpsys batterystats' }, + { label: 'Full battery history', cmd: 'shell dumpsys batterystats --history' }, + { label: 'Battery history (last charge)', cmd: 'shell dumpsys batterystats --charged' }, + { label: 'Battery checkin format', cmd: 'shell dumpsys batterystats --checkin' }, + { label: 'Reset battery stats', cmd: 'shell dumpsys batterystats --reset' }, + { label: 'Power manager & doze state', cmd: 'shell dumpsys power' }, + { label: 'Doze / idle mode state', cmd: 'shell dumpsys deviceidle' }, + { label: 'Force doze mode on', cmd: 'shell dumpsys deviceidle force-idle' }, + { label: 'Force doze mode off', cmd: 'shell dumpsys deviceidle unforce' }, + { label: 'Step into doze (light)', cmd: 'shell dumpsys deviceidle step light' }, + { label: 'Step into doze (deep)', cmd: 'shell dumpsys deviceidle step deep' }, + { label: 'Pending alarms', cmd: 'shell dumpsys alarm' }, + { label: 'Scheduled jobs', cmd: 'shell dumpsys jobscheduler' }, + { label: 'Job history', cmd: 'shell dumpsys jobscheduler history' }, + { label: 'Thermal throttling state', cmd: 'shell dumpsys thermalservice' }, + { label: 'Hardware sensors & temps', cmd: 'shell dumpsys hardware_properties' }, + { label: 'All thermal zones', cmd: 'shell cat /sys/class/thermal/thermal_zone*/temp' }, + { label: 'Thermal zone types', cmd: 'shell cat /sys/class/thermal/thermal_zone*/type' }, + { label: 'Battery raw info (/sys)', cmd: 'shell cat /sys/class/power_supply/battery/uevent' }, + { label: 'Battery capacity (%)', cmd: 'shell cat /sys/class/power_supply/battery/capacity' }, + { label: 'Battery status', cmd: 'shell cat /sys/class/power_supply/battery/status' }, + { label: 'Battery voltage (µV)', cmd: 'shell cat /sys/class/power_supply/battery/voltage_now' }, + { label: 'Battery current (µA)', cmd: 'shell cat /sys/class/power_supply/battery/current_now' }, + { label: 'Battery temperature', cmd: 'shell cat /sys/class/power_supply/battery/temp' }, + { label: 'Battery health', cmd: 'shell cat /sys/class/power_supply/battery/health' }, + { label: 'Battery charge counter (µAh)', cmd: 'shell cat /sys/class/power_supply/battery/charge_counter' }, + { label: 'USB power supply info', cmd: 'shell cat /sys/class/power_supply/usb/uevent' }, + { label: 'AC power supply info', cmd: 'shell cat /sys/class/power_supply/ac/uevent' }, + { label: 'Wakelocks (kernel)', cmd: 'shell cat /sys/kernel/debug/wakeup_sources' }, + { label: 'Active wakelocks', cmd: 'shell cat /proc/wakelocks' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Network & Connectivity', + commands: [ + { label: 'Full network state', cmd: 'shell dumpsys connectivity' }, + { label: 'Wi-Fi state & networks', cmd: 'shell dumpsys wifi' }, + { label: 'Wi-Fi scanner results', cmd: 'shell dumpsys wifiscanner' }, + { label: 'Detailed traffic stats', cmd: 'shell dumpsys netstats' }, + { label: 'Signal & telephony info', cmd: 'shell dumpsys telephony.registry' }, + { label: 'Tethering / hotspot state', cmd: 'shell dumpsys tethering' }, + { label: 'Ethernet service state', cmd: 'shell dumpsys ethernet' }, + { label: 'Connectivity metrics', cmd: 'shell dumpsys connectivity_metrics' }, + { label: 'Network policy rules', cmd: 'shell dumpsys netpolicy' }, + { label: 'Network management service', cmd: 'shell dumpsys network_management' }, + { label: 'UWB subsystem state', cmd: 'shell dumpsys uwb' }, + { label: 'Carrier configuration', cmd: 'shell dumpsys carrier_config' }, + { label: 'NFC state', cmd: 'shell dumpsys nfc' }, + { label: 'Bluetooth state', cmd: 'shell dumpsys bluetooth_manager' }, + { label: 'Bluetooth adapter info', cmd: 'shell dumpsys bluetooth' }, + { label: 'IP addresses (all interfaces)', cmd: 'shell ip addr show' }, + { label: 'IP addresses (wlan0)', cmd: 'shell ip addr show wlan0' }, + { label: 'Routing table', cmd: 'shell ip route show' }, + { label: 'IPv6 routing table', cmd: 'shell ip -6 route show' }, + { label: 'IP rules', cmd: 'shell ip rule show' }, + { label: 'ARP table', cmd: 'shell ip neigh show' }, + { label: 'ARP table (arp)', cmd: 'shell arp -n' }, + { label: 'Open sockets with PIDs (ss)', cmd: 'shell ss -tulpn' }, + { label: 'All sockets (ss)', cmd: 'shell ss -a' }, + { label: 'Listening ports (netstat)', cmd: 'shell netstat -tuln' }, + { label: 'All connections (netstat)', cmd: 'shell netstat -an' }, + { label: 'Network interfaces (ifconfig)', cmd: 'shell ifconfig' }, + { label: 'Firewall rules IPv4 (root)', cmd: 'shell iptables -L -v -n' }, + { label: 'Firewall rules IPv6 (root)', cmd: 'shell ip6tables -L -v -n' }, + { label: 'iptables NAT table (root)', cmd: 'shell iptables -t nat -L -v -n' }, + { label: 'Ping test to 8.8.8.8', cmd: 'shell ping -c 4 8.8.8.8' }, + { label: 'Ping test to 1.1.1.1', cmd: 'shell ping -c 4 1.1.1.1' }, + { label: 'Traceroute to 8.8.8.8', cmd: 'shell traceroute 8.8.8.8' }, + { label: 'DNS lookup (nslookup)', cmd: 'shell nslookup google.com' }, + { label: 'DNS lookup (getent)', cmd: 'shell getent hosts google.com' }, + { label: 'resolv.conf', cmd: 'shell cat /etc/resolv.conf' }, + { label: 'TCP connections (/proc)', cmd: 'shell cat /proc/net/tcp' }, + { label: 'TCP6 connections (/proc)', cmd: 'shell cat /proc/net/tcp6' }, + { label: 'UDP connections (/proc)', cmd: 'shell cat /proc/net/udp' }, + { label: 'Network device stats (/proc)', cmd: 'shell cat /proc/net/dev' }, + { label: 'Wireless info (/proc)', cmd: 'shell cat /proc/net/wireless' }, + { label: 'ARP cache (/proc)', cmd: 'shell cat /proc/net/arp' }, + { label: 'Network interface stats (/sys)', cmd: 'shell cat /sys/class/net/wlan0/statistics/rx_bytes' }, + { label: 'TX bytes (wlan0)', cmd: 'shell cat /sys/class/net/wlan0/statistics/tx_bytes' }, + { label: 'Disable mobile data', cmd: 'shell svc data disable' }, + { label: 'Enable mobile data', cmd: 'shell svc data enable' }, + { label: 'Disable Wi-Fi', cmd: 'shell svc wifi disable' }, + { label: 'Enable Wi-Fi', cmd: 'shell svc wifi enable' }, + { label: 'Disable NFC', cmd: 'shell svc nfc disable' }, + { label: 'Enable NFC', cmd: 'shell svc nfc enable' }, + { label: 'Disable Bluetooth', cmd: 'shell svc bluetooth disable' }, + { label: 'Enable Bluetooth', cmd: 'shell svc bluetooth enable' }, + { label: 'Telephony commands', cmd: 'shell cmd phone' }, + { label: 'List all network interfaces', cmd: 'shell ls /sys/class/net' }, + { label: 'Wi-Fi SSID currently connected', cmd: 'shell dumpsys wifi | grep -i mWifiInfo' }, + { label: 'IMSI (root required)', cmd: 'shell service call iphonesubinfo 7' }, + { label: 'SIM operator name', cmd: 'shell getprop gsm.sim.operator.alpha' }, + { label: 'SIM state', cmd: 'shell getprop gsm.sim.state' }, + { label: 'Mobile network type', cmd: 'shell getprop gsm.network.type' }, + { label: 'Phone number', cmd: 'shell service call iphonesubinfo 11' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Permissions & Security', + commands: [ + { label: 'All app operations & permissions', cmd: 'shell dumpsys appops' }, + { label: 'Accessibility services', cmd: 'shell dumpsys accessibility' }, + { label: 'Keystore state', cmd: 'shell dumpsys keystore' }, + { label: 'Security manager state', cmd: 'shell dumpsys security' }, + { label: 'OEM lock state', cmd: 'shell dumpsys oemlock' }, + { label: 'Device policy manager', cmd: 'shell dumpsys device_policy' }, + { label: 'User accounts & profiles', cmd: 'shell dumpsys user' }, + { label: 'User restrictions', cmd: 'shell dumpsys restrictions' }, + { label: 'Role manager state', cmd: 'shell dumpsys role' }, + { label: 'Trust agents', cmd: 'shell dumpsys trust' }, + { label: 'SELinux enforce status', cmd: 'shell getenforce' }, + { label: 'SELinux set to enforcing', cmd: 'shell setenforce 1' }, + { label: 'SELinux set to permissive', cmd: 'shell setenforce 0' }, + { label: 'SELinux audit log', cmd: 'shell dmesg | grep avc' }, + { label: 'SELinux denials in logcat', cmd: 'logcat -d | grep avc' }, + { label: 'All permissions declared', cmd: 'shell dumpsys package permissions' }, + { label: 'All permission groups', cmd: 'shell pm list permission-groups' }, + { label: 'All permissions', cmd: 'shell pm list permissions' }, + { label: 'Dangerous permissions only', cmd: 'shell pm list permissions -d' }, + { label: 'Groups permissions', cmd: 'shell pm list permissions -g' }, + { label: 'SafetyNet / Play Integrity check', cmd: 'shell am start -a android.intent.action.VIEW -d https://www.google.com/safebrowsing' }, + { label: 'Verify boot state (vbmeta)', cmd: 'shell getprop ro.boot.verifiedbootstate' }, + { label: 'Check if rooted (su)', cmd: 'shell which su' }, + { label: 'Check Magisk presence', cmd: 'shell ls /data/adb/magisk' }, + { label: 'Trusted CA certificates', cmd: 'shell ls /system/etc/security/cacerts' }, + { label: 'User-installed CA certificates', cmd: 'shell ls /data/misc/user/0/cacerts-added' }, + { label: 'Keystore keys (root)', cmd: 'shell ls /data/misc/keystore' }, + { label: 'Audit log (root)', cmd: 'shell cat /data/misc/audit/audit.log' }, + { + label: 'App permissions (specific package)', + cmd: 'shell dumpsys appops get ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'List permissions for package', + cmd: 'shell pm list permissions -p ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Grant permission to app', + cmd: 'shell pm grant ', + needsInput: [ + { placeholder: 'com.example.app', token: '' }, + { placeholder: 'android.permission.CAMERA', token: '' }, + ], + }, + { + label: 'Revoke permission from app', + cmd: 'shell pm revoke ', + needsInput: [ + { placeholder: 'com.example.app', token: '' }, + { placeholder: 'android.permission.CAMERA', token: '' }, + ], + }, + { + label: 'Reset all permissions for app', + cmd: 'shell pm reset-permissions ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Package Manager', + commands: [ + { label: 'All packages', cmd: 'shell pm list packages' }, + { label: 'System packages only', cmd: 'shell pm list packages -s' }, + { label: 'User / third-party packages', cmd: 'shell pm list packages -3' }, + { label: 'Disabled packages', cmd: 'shell pm list packages -d' }, + { label: 'Enabled packages', cmd: 'shell pm list packages -e' }, + { label: 'Packages with APK path', cmd: 'shell pm list packages -f' }, + { label: 'Packages with installer source', cmd: 'shell pm list packages -i' }, + { label: 'Packages with UID', cmd: 'shell pm list packages -U' }, + { label: 'All package manager info', cmd: 'shell dumpsys package' }, + { label: 'App usage stats', cmd: 'shell dumpsys usage' }, + { label: 'App shortcuts', cmd: 'shell dumpsys shortcut' }, + { label: 'Activity stack list', cmd: 'shell am stack list' }, + { label: 'Get device configuration', cmd: 'shell am get-config' }, + { label: 'List features', cmd: 'shell pm list features' }, + { label: 'List libraries', cmd: 'shell pm list libraries' }, + { label: 'List instrumentation', cmd: 'shell pm list instrumentation' }, + { label: 'List users', cmd: 'shell pm list users' }, + { + label: 'APK path for package', + cmd: 'shell pm path ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Full dump for package', + cmd: 'shell pm dump ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Force stop app', + cmd: 'shell am force-stop ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Kill app (background)', + cmd: 'shell am kill ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Launch activity', + cmd: 'shell am start -n /', + needsInput: [ + { placeholder: 'com.example.app', token: '' }, + { placeholder: '.MainActivity', token: '' }, + ], + }, + { + label: 'Launch app (main intent)', + cmd: 'shell monkey -p -c android.intent.category.LAUNCHER 1', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Clear app data', + cmd: 'shell pm clear ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Send broadcast intent', + cmd: 'shell am broadcast -a ', + needsInput: [{ placeholder: 'android.intent.action.VIEW', token: '' }], + }, + { + label: 'Trim memory (MODERATE)', + cmd: 'shell am send-trim-memory MODERATE', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Trim memory (COMPLETE)', + cmd: 'shell am send-trim-memory COMPLETE', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Get UID for package', + cmd: 'shell cat /data/system/packages.xml | grep ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Monkey stress test (1000 events)', + cmd: 'shell monkey -p 1000', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Activities & Services', + commands: [ + { label: 'Activities & services (all)', cmd: 'shell dumpsys activity' }, + { label: 'Running services', cmd: 'shell dumpsys activity services' }, + { label: 'Broadcast receivers', cmd: 'shell dumpsys activity broadcasts' }, + { label: 'Recent intents', cmd: 'shell dumpsys activity intents' }, + { label: 'Recent tasks', cmd: 'shell dumpsys activity recents' }, + { label: 'Activity top (foreground)', cmd: 'shell dumpsys activity top' }, + { label: 'Activity starter history', cmd: 'shell dumpsys activity starter' }, + { label: 'Window manager state', cmd: 'shell dumpsys window' }, + { label: 'Visible windows only', cmd: 'shell dumpsys window windows | grep -E name=' }, + { label: 'Window display info', cmd: 'shell dumpsys window displays' }, + { label: 'Display config', cmd: 'shell dumpsys display' }, + { label: 'Input events', cmd: 'shell dumpsys input' }, + { label: 'Input method (IME) state', cmd: 'shell dumpsys input_method' }, + { label: 'Notification listeners', cmd: 'shell dumpsys notification' }, + { label: 'Clipboard state', cmd: 'shell dumpsys clipboard' }, + { label: 'Voice interaction service', cmd: 'shell dumpsys voiceinteraction' }, + { label: 'Text services (spellcheck)', cmd: 'shell dumpsys textservices' }, + { label: 'Text classification service', cmd: 'shell dumpsys textclassification' }, + { label: 'Wallpaper manager', cmd: 'shell dumpsys wallpaper' }, + { label: 'Lock screen state', cmd: 'shell dumpsys window | grep -i mDreamingLockscreen' }, + { label: 'Screen on/off state', cmd: 'shell dumpsys power | grep mWakefulness' }, + { label: 'Turn screen on', cmd: 'shell input keyevent 26' }, + { label: 'Dismiss keyguard', cmd: 'shell wm dismiss-keyguard' }, + { label: 'Take screenshot to /sdcard', cmd: 'shell screencap /sdcard/screenshot.png' }, + { label: 'Screen record 10s to /sdcard', cmd: 'shell screenrecord --time-limit 10 /sdcard/record.mp4' }, + { label: 'Simulate back button', cmd: 'shell input keyevent 4' }, + { label: 'Simulate home button', cmd: 'shell input keyevent 3' }, + { label: 'Simulate menu button', cmd: 'shell input keyevent 82' }, + { label: 'Simulate power button', cmd: 'shell input keyevent 26' }, + { label: 'Simulate volume up', cmd: 'shell input keyevent 24' }, + { label: 'Simulate volume down', cmd: 'shell input keyevent 25' }, + { label: 'Swipe up (unlock gesture)', cmd: 'shell input swipe 540 1600 540 800 300' }, + { label: 'Screen resolution', cmd: 'shell wm size' }, + { label: 'Screen density', cmd: 'shell wm density' }, + { label: 'Reset screen resolution', cmd: 'shell wm size reset' }, + { label: 'Reset screen density', cmd: 'shell wm density reset' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Sensors & Media', + commands: [ + { label: 'All sensors state', cmd: 'shell dumpsys sensorservice' }, + { label: 'Sensor fusion state', cmd: 'shell dumpsys sensorservice | grep -A5 fusion' }, + { label: 'Camera & microphone usage', cmd: 'shell dumpsys media.camera' }, + { label: 'Audio routing & mic usage', cmd: 'shell dumpsys media.audio_policy' }, + { label: 'Audio streams & buffers', cmd: 'shell dumpsys media.audio_flinger' }, + { label: 'Media player state', cmd: 'shell dumpsys media.player' }, + { label: 'Media metrics', cmd: 'shell dumpsys media.metrics' }, + { label: 'Media extractor', cmd: 'shell dumpsys media.extractor' }, + { label: 'Graphics rendering stats', cmd: 'shell dumpsys gfxinfo' }, + { label: 'Surface compositor state', cmd: 'shell dumpsys surfaceflinger' }, + { label: 'Surface compositor framerate', cmd: 'shell dumpsys surfaceflinger | grep -i fps' }, + { label: 'SurfaceFlinger layers', cmd: 'shell dumpsys surfaceflinger --list' }, + { label: 'Vibrator service', cmd: 'shell dumpsys vibrator' }, + { label: 'Test vibration (500ms)', cmd: 'shell cmd vibrator vibrate 500' }, + { label: 'Location services state', cmd: 'shell dumpsys location' }, + { label: 'Location providers', cmd: 'shell dumpsys location | grep -i provider' }, + { label: 'GPS state', cmd: 'shell dumpsys location | grep -i gps' }, + { label: 'Country detector', cmd: 'shell dumpsys country_detector' }, + { label: 'Fingerprint service', cmd: 'shell dumpsys fingerprint' }, + { label: 'Face unlock service', cmd: 'shell dumpsys face' }, + { label: 'Biometric service', cmd: 'shell dumpsys biometric' }, + { + label: 'Graphics stats for app', + cmd: 'shell dumpsys gfxinfo ', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + { + label: 'Reset gfxinfo for app', + cmd: 'shell dumpsys gfxinfo reset', + needsInput: [{ placeholder: 'com.example.app', token: '' }], + }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Logs & Diagnostics', + commands: [ + { label: 'Logcat dump (last 200 lines)', cmd: 'logcat -d -t 200' }, + { label: 'Logcat dump (last 500 lines)', cmd: 'logcat -d -t 500' }, + { label: 'Radio / cellular logs', cmd: 'logcat -b radio -d -t 200' }, + { label: 'System events logs', cmd: 'logcat -b events -d -t 200' }, + { label: 'Crash logs', cmd: 'logcat -b crash -d -t 200' }, + { label: 'Errors only (*:E)', cmd: 'logcat -d *:E' }, + { label: 'Warnings and above (*:W)', cmd: 'logcat -d *:W' }, + { label: 'Clear logcat buffer', cmd: 'logcat -c' }, + { label: 'Logcat buffer sizes', cmd: 'logcat -g' }, + { label: 'Kernel logs (dmesg)', cmd: 'shell dmesg' }, + { label: 'Kernel logs (dmesg, last boot)', cmd: 'shell dmesg --follow-new' }, + { label: 'Kernel errors only (dmesg)', cmd: 'shell dmesg -l err' }, + { label: 'System crash logs (dropbox)', cmd: 'shell dumpsys dropbox' }, + { label: 'Dropbox entries list', cmd: 'shell dumpsys dropbox --list' }, + { label: 'Performance stats', cmd: 'shell dumpsys perfstats' }, + { label: 'Disk stats', cmd: 'shell dumpsys diskstats' }, + { label: 'Storage daemon info', cmd: 'shell dumpsys storaged' }, + { label: 'OTA update engine state', cmd: 'shell dumpsys update_engine' }, + { label: 'Mount state', cmd: 'shell dumpsys mount' }, + { label: 'Backup manager state', cmd: 'shell dumpsys backup' }, + { label: 'Accounts on device', cmd: 'shell dumpsys account' }, + { label: 'Atrace category list', cmd: 'shell atrace --list_categories' }, + { label: 'Atrace 10s (gfx input view wm)', cmd: 'shell atrace -c -b 4096 gfx input view wm am --duration 10' }, + { label: 'Last ANR trace', cmd: 'shell cat /data/anr/anr_latest.txt' }, + { label: 'List ANR traces', cmd: 'shell ls -la /data/anr/' }, + { label: 'List tombstones (native crashes)', cmd: 'shell ls -la /data/tombstones/' }, + { label: 'Last tombstone', cmd: 'shell cat /data/tombstones/tombstone_00' }, + { label: 'System log (/var/log)', cmd: 'shell ls /var/log' }, + { label: 'Last panic log', cmd: 'shell cat /sys/fs/pstore/console-ramoops-0' }, + { label: 'Ramoops (last reboot log)', cmd: 'shell ls /sys/fs/pstore/' }, + { label: 'StrictMode violations in logcat', cmd: 'logcat -d | grep StrictMode' }, + { label: 'OOM kills in logcat', cmd: 'logcat -d | grep -i "low on memory"' }, + { + label: 'Logcat filter by tag', + cmd: 'logcat -d -s ', + needsInput: [{ placeholder: 'ActivityManager', token: '' }], + }, + { + label: 'Logcat filter by package (pid)', + cmd: 'logcat -d --pid=', + needsInput: [{ placeholder: '1234', token: '' }], + }, + { + label: 'Dropbox entry detail', + cmd: 'shell dumpsys dropbox --print ', + needsInput: [{ placeholder: 'system_app_anr', token: '' }], + }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'File System', + commands: [ + { label: 'List /sdcard', cmd: 'shell ls -la /sdcard' }, + { label: 'List /data app directories', cmd: 'shell ls -la /data/app' }, + { label: 'List /data/data (app data)', cmd: 'shell ls -la /data/data' }, + { label: 'List /system/app', cmd: 'shell ls -la /system/app' }, + { label: 'List /system/priv-app', cmd: 'shell ls -la /system/priv-app' }, + { label: 'List /vendor/app', cmd: 'shell ls -la /vendor/app' }, + { label: 'List /product/app', cmd: 'shell ls -la /product/app' }, + { label: 'List /apex', cmd: 'shell ls -la /apex' }, + { label: 'List /data/adb (Magisk)', cmd: 'shell ls -la /data/adb' }, + { label: 'Storage free space (df)', cmd: 'shell df -h' }, + { label: 'File system metadata /system', cmd: 'shell stat /system' }, + { label: 'Hash check build.prop', cmd: 'shell md5sum /system/build.prop' }, + { label: 'Read build.prop', cmd: 'shell cat /system/build.prop' }, + { label: 'Read default.prop', cmd: 'shell cat /default.prop' }, + { label: 'Read /proc/mounts', cmd: 'shell cat /proc/mounts' }, + { label: 'Find files in /data (depth 3)', cmd: 'shell find /data -type f -maxdepth 3' }, + { label: 'Find SUID binaries (root)', cmd: 'shell find / -perm -4000 -type f 2>/dev/null' }, + { label: 'Find world-writable files /data', cmd: 'shell find /data -perm -o+w -type f 2>/dev/null' }, + { label: 'Disk usage /data', cmd: 'shell du -sh /data/*' }, + { label: 'Disk usage /sdcard', cmd: 'shell du -sh /sdcard/*' }, + { label: 'Mount points', cmd: 'shell mount' }, + { label: 'Block devices', cmd: 'shell ls -la /dev/block' }, + { label: 'Block device by-name links', cmd: 'shell ls -la /dev/block/bootdevice/by-name' }, + { label: 'Check if /system is remounted rw', cmd: 'shell mount | grep system' }, + { label: 'Inode usage', cmd: 'shell df -i' }, + { label: 'File type of path', + cmd: 'shell file ', + needsInput: [{ placeholder: '/sdcard/file.bin', token: '' }] }, + { label: 'MD5 checksum of file', + cmd: 'shell md5sum ', + needsInput: [{ placeholder: '/sdcard/file.apk', token: '' }] }, + { label: 'SHA256 checksum of file', + cmd: 'shell sha256sum ', + needsInput: [{ placeholder: '/sdcard/file.apk', token: '' }] }, + { label: 'Hex dump of file (first 256 bytes)', + cmd: 'shell xxd -l 256 ', + needsInput: [{ placeholder: '/sdcard/file.bin', token: '' }] }, + { label: 'Strings in binary', + cmd: 'shell strings ', + needsInput: [{ placeholder: '/system/bin/app_process', token: '' }] }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Settings & Config', + commands: [ + { label: 'System settings list', cmd: 'shell settings list system' }, + { label: 'Secure settings list', cmd: 'shell settings list secure' }, + { label: 'Global settings list', cmd: 'shell settings list global' }, + { label: 'Get airplane mode', cmd: 'shell settings get global airplane_mode_on' }, + { label: 'Enable airplane mode', cmd: 'shell settings put global airplane_mode_on 1' }, + { label: 'Disable airplane mode', cmd: 'shell settings put global airplane_mode_on 0' }, + { label: 'Get screen timeout (ms)', cmd: 'shell settings get system screen_off_timeout' }, + { label: 'Set screen timeout to 10min', cmd: 'shell settings put system screen_off_timeout 600000' }, + { label: 'Get auto-brightness', cmd: 'shell settings get system screen_brightness_mode' }, + { label: 'Get screen brightness', cmd: 'shell settings get system screen_brightness' }, + { label: 'Set screen brightness (0-255)', cmd: 'shell settings put system screen_brightness 128' }, + { label: 'Get stay-awake setting', cmd: 'shell settings get global stay_on_while_plugged_in' }, + { label: 'Keep awake while charging', cmd: 'shell settings put global stay_on_while_plugged_in 3' }, + { label: 'Get install unknown sources', cmd: 'shell settings get secure install_non_market_apps' }, + { label: 'Enable install unknown sources', cmd: 'shell settings put secure install_non_market_apps 1' }, + { label: 'Get development settings enabled', cmd: 'shell settings get global development_settings_enabled' }, + { label: 'Get USB debugging enabled', cmd: 'shell settings get global adb_enabled' }, + { label: 'Get animation scale (window)', cmd: 'shell settings get global window_animation_scale' }, + { label: 'Disable animations (all)', cmd: 'shell settings put global window_animation_scale 0; shell settings put global transition_animation_scale 0; shell settings put global animator_duration_scale 0' }, + { label: 'Enable animations (restore)', cmd: 'shell settings put global window_animation_scale 1; shell settings put global transition_animation_scale 1; shell settings put global animator_duration_scale 1' }, + { label: 'Get font scale', cmd: 'shell settings get system font_scale' }, + { label: 'Get USB config mode', cmd: 'shell getprop sys.usb.config' }, + { label: 'Set USB to MTP mode', cmd: 'shell setprop sys.usb.config mtp,adb' }, + { label: 'Show device policy info', cmd: 'shell dpm list-owners' }, + { label: 'Remove device owner (root)', cmd: 'shell dpm remove-active-admin com.example/.AdminReceiver' }, + { + label: 'Get setting value', + cmd: 'shell settings get global ', + needsInput: [{ placeholder: 'wifi_on', token: '' }], + }, + { + label: 'Put global setting', + cmd: 'shell settings put global ', + needsInput: [ + { placeholder: 'wifi_on', token: '' }, + { placeholder: '1', token: '' }, + ], + }, + { + label: 'Put secure setting', + cmd: 'shell settings put secure ', + needsInput: [ + { placeholder: 'android_id', token: '' }, + { placeholder: 'value', token: '' }, + ], + }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Fastboot', + commands: [ + { label: 'List fastboot devices', cmd: 'fastboot devices' }, + { label: 'Get all device variables', cmd: 'fastboot getvar all' }, + { label: 'Get product name', cmd: 'fastboot getvar product' }, + { label: 'Get bootloader version', cmd: 'fastboot getvar version-bootloader' }, + { label: 'Get baseband version', cmd: 'fastboot getvar version-baseband' }, + { label: 'Get current slot (A/B)', cmd: 'fastboot getvar current-slot' }, + { label: 'Get slot-count', cmd: 'fastboot getvar slot-count' }, + { label: 'Get slot-successful (a)', cmd: 'fastboot getvar slot-successful:a' }, + { label: 'Get slot-successful (b)', cmd: 'fastboot getvar slot-successful:b' }, + { label: 'Get slot-unbootable (a)', cmd: 'fastboot getvar slot-unbootable:a' }, + { label: 'Get slot-unbootable (b)', cmd: 'fastboot getvar slot-unbootable:b' }, + { label: 'Get is-logical (super)', cmd: 'fastboot getvar is-logical:super' }, + { label: 'Get max-download-size', cmd: 'fastboot getvar max-download-size' }, + { label: 'Get unlocked state', cmd: 'fastboot getvar unlocked' }, + { label: 'Get unlock ability', cmd: 'fastboot flashing get_unlock_ability' }, + { label: 'Unlock bootloader', cmd: 'fastboot flashing unlock' }, + { label: 'Lock bootloader', cmd: 'fastboot flashing lock' }, + { label: 'Unlock critical partitions', cmd: 'fastboot flashing unlock_critical' }, + { label: 'Lock critical partitions', cmd: 'fastboot flashing lock_critical' }, + { label: 'OEM unlock', cmd: 'fastboot oem unlock' }, + { label: 'OEM lock', cmd: 'fastboot oem lock' }, + { label: 'OEM device-info', cmd: 'fastboot oem device-info' }, + { label: 'OEM esim_erase', cmd: 'fastboot oem esim_erase' }, + { label: 'OEM esim_erase_factory', cmd: 'fastboot oem esim_erase_factory' }, + { label: 'OEM get-identifier-token', cmd: 'fastboot oem get-identifier-token' }, + { label: 'OEM off-mode-charge 0', cmd: 'fastboot oem off-mode-charge 0' }, + { label: 'OEM off-mode-charge 1', cmd: 'fastboot oem off-mode-charge 1' }, + { label: 'OEM enable uart (Pixel)', cmd: 'fastboot oem uart enable' }, + { label: 'OEM disable uart (Pixel)', cmd: 'fastboot oem uart disable' }, + { label: 'Reboot device', cmd: 'fastboot reboot' }, + { label: 'Reboot to bootloader', cmd: 'fastboot reboot-bootloader' }, + { label: 'Reboot to fastbootd (userspace)', cmd: 'fastboot reboot fastboot' }, + { label: 'Reboot to recovery', cmd: 'fastboot reboot recovery' }, + { label: 'Set active slot A', cmd: 'fastboot --set-active=a' }, + { label: 'Set active slot B', cmd: 'fastboot --set-active=b' }, + { label: 'Erase userdata partition', cmd: 'fastboot erase userdata' }, + { label: 'Erase cache partition', cmd: 'fastboot erase cache' }, + { label: 'Format userdata (ext4)', cmd: 'fastboot format:ext4 userdata' }, + { label: 'Wipe userdata (-w)', cmd: 'fastboot -w' }, + { label: 'List logical partitions (fastbootd)', cmd: 'fastboot getvar is-logical:system' }, + { label: 'Create logical partition', + cmd: 'fastboot create-logical-partition ', + needsInput: [ + { placeholder: 'system_ext', token: '' }, + { placeholder: '1073741824', token: '' }, + ] }, + { label: 'Delete logical partition', + cmd: 'fastboot delete-logical-partition ', + needsInput: [{ placeholder: 'system_ext', token: '' }] }, + { label: 'Resize logical partition', + cmd: 'fastboot resize-logical-partition ', + needsInput: [ + { placeholder: 'system', token: '' }, + { placeholder: '2147483648', token: '' }, + ] }, + { label: 'Flash boot image', + cmd: 'fastboot flash boot ', + needsInput: [{ placeholder: '/path/to/boot.img', token: '' }] }, + { label: 'Flash boot image (--force)', + cmd: 'fastboot --force flash boot ', + needsInput: [{ placeholder: '/path/to/boot.img', token: '' }] }, + { label: 'Flash recovery image', + cmd: 'fastboot flash recovery ', + needsInput: [{ placeholder: '/path/to/recovery.img', token: '' }] }, + { label: 'Flash vbmeta (disable verity)', + cmd: 'fastboot --disable-verity --disable-verification flash vbmeta ', + needsInput: [{ placeholder: '/path/to/vbmeta.img', token: '' }] }, + { label: 'Boot image (one-time, no flash)', + cmd: 'fastboot boot ', + needsInput: [{ placeholder: '/path/to/boot.img', token: '' }] }, + { label: 'Update from zip (with wipe)', cmd: 'fastboot -w update ', + needsInput: [{ placeholder: '/path/to/image.zip', token: '' }] }, + { label: 'Fastboot verbose mode', cmd: 'fastboot --verbose getvar all' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Root & Magisk', + commands: [ + { label: 'Check if rooted (su)', cmd: 'shell which su' }, + { label: 'Check su binary location', cmd: 'shell find / -name su -type f 2>/dev/null' }, + { label: 'Run id as root', cmd: 'shell su -c id' }, + { label: 'Check Magisk app installed', cmd: 'shell pm list packages | grep magisk' }, + { label: 'Magisk version', cmd: 'shell magisk -v' }, + { label: 'Magisk version code', cmd: 'shell magisk -V' }, + { label: 'Magisk daemon status', cmd: 'shell magisk --daemon' }, + { label: 'List Magisk modules', cmd: 'shell ls /data/adb/modules' }, + { label: 'List Magisk modules (details)', cmd: 'shell ls -la /data/adb/modules' }, + { label: 'Read module properties', + cmd: 'shell cat /data/adb/modules//module.prop', + needsInput: [{ placeholder: 'module_name', token: '' }] }, + { label: 'Disable Magisk module', + cmd: 'shell touch /data/adb/modules//disable', + needsInput: [{ placeholder: 'module_name', token: '' }] }, + { label: 'Enable Magisk module', + cmd: 'shell rm /data/adb/modules//disable', + needsInput: [{ placeholder: 'module_name', token: '' }] }, + { label: 'Check KernelSU presence', cmd: 'shell which ksud' }, + { label: 'KernelSU version', cmd: 'shell ksud --version' }, + { label: 'Check APatch presence', cmd: 'shell ls /data/adb/ap' }, + { label: 'Root all apps (Magisk)', cmd: 'shell magisk --sqlite "UPDATE policies SET policy=2 WHERE 1"' }, + { label: 'Magisk hide list', cmd: 'shell magisk --sqlite "SELECT * FROM hidelist"' }, + { label: 'Zygisk enabled check', cmd: 'shell magisk --sqlite "SELECT value FROM settings WHERE key=\'zygisk\'"' }, + { label: 'List Magisk deny list', cmd: 'shell magisk --denylist ls' }, + { label: 'Mount /system as rw (root)', cmd: 'shell su -c "mount -o remount,rw /system"' }, + { label: 'Mount /vendor as rw (root)', cmd: 'shell su -c "mount -o remount,rw /vendor"' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Instrumentation & Testing', + commands: [ + { label: 'List instrumentations', cmd: 'shell pm list instrumentation' }, + { label: 'Run UI automator tests', + cmd: 'shell am instrument -w /androidx.test.runner.AndroidJUnitRunner', + needsInput: [{ placeholder: 'com.example.test', token: '' }] }, + { label: 'Monkey random events (1000)', + cmd: 'shell monkey -p --throttle 100 1000', + needsInput: [{ placeholder: 'com.example.app', token: '' }] }, + { label: 'Monkey with seed', + cmd: 'shell monkey -p -s 12345 1000', + needsInput: [{ placeholder: 'com.example.app', token: '' }] }, + { label: 'Tap at coordinates', + cmd: 'shell input tap ', + needsInput: [ + { placeholder: '540', token: '' }, + { placeholder: '960', token: '' }, + ] }, + { label: 'Long press at coordinates', + cmd: 'shell input swipe 1000', + needsInput: [ + { placeholder: '540', token: '' }, + { placeholder: '960', token: '' }, + ] }, + { label: 'Type text', + cmd: 'shell input text ', + needsInput: [{ placeholder: 'hello_world', token: '' }] }, + { label: 'Open URL in browser', + cmd: 'shell am start -a android.intent.action.VIEW -d ', + needsInput: [{ placeholder: 'https://example.com', token: '' }] }, + { label: 'Open app settings page', + cmd: 'shell am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:', + needsInput: [{ placeholder: 'com.example.app', token: '' }] }, + { label: 'Simulate incoming call', + cmd: 'shell am start -a android.intent.action.CALL -d tel:', + needsInput: [{ placeholder: '+1234567890', token: '' }] }, + { label: 'Simulate SMS received', + cmd: 'shell am broadcast -a android.provider.Telephony.SMS_RECEIVED' }, + { label: 'Trigger low battery broadcast', + cmd: 'shell am broadcast -a android.intent.action.BATTERY_LOW' }, + { label: 'Trigger power connected broadcast', + cmd: 'shell am broadcast -a android.intent.action.ACTION_POWER_CONNECTED' }, + { label: 'Trigger boot completed broadcast', + cmd: 'shell am broadcast -a android.intent.action.BOOT_COMPLETED' }, + { label: 'Trigger screen on broadcast', + cmd: 'shell am broadcast -a android.intent.action.SCREEN_ON' }, + { label: 'StrictMode violations in logcat', cmd: 'logcat -d | grep StrictMode' }, + { label: 'Systrace (10s gfx)', + cmd: 'shell systrace gfx -t 10 -o /sdcard/trace.html' }, + { label: 'Perfetto trace (5s)', + cmd: 'shell perfetto --out /sdcard/trace.pftrace --time 5s' }, + ], + }, + + // ───────────────────────────────────────────── + { + name: 'Reboot', + commands: [ + { label: 'Reboot to system', cmd: 'reboot' }, + { label: 'Reboot to recovery', cmd: 'reboot recovery' }, + { label: 'Reboot to bootloader', cmd: 'reboot bootloader' }, + { label: 'Reboot to fastboot', cmd: 'reboot fastboot' }, + { label: 'Reboot to sideload', cmd: 'reboot sideload' }, + { label: 'Soft reboot (kill zygote)', cmd: 'shell setprop ctl.restart zygote' }, + { label: 'Remount system (root)', cmd: 'remount' }, + ], + }, +] + +export default function ViewUtilities() { + const [output, setOutput] = useState('') + const [outputLabel, setOutputLabel] = useState('') + const [running, setRunning] = useState(false) + const [openCats, setOpenCats] = useState>(new Set(['Device Info'])) + const [inputs, setInputs] = useState>({}) + const [copied, setCopied] = useState(false) + const [activeCmd, setActiveCmd] = useState(null) + const [search, setSearch] = useState('') + + const totalCmds = CATEGORIES.reduce((a, c) => a + c.commands.length, 0) + + const filteredCategories = CATEGORIES.map(cat => ({ + ...cat, + commands: search + ? cat.commands.filter(c => + c.label.toLowerCase().includes(search.toLowerCase()) || + c.cmd.toLowerCase().includes(search.toLowerCase())) + : cat.commands, + })).filter(cat => cat.commands.length > 0) + + const toggleCat = (name: string) => { + setOpenCats(prev => { + const next = new Set(prev) + next.has(name) ? next.delete(name) : next.add(name) + return next + }) + } + + const expandAll = () => setOpenCats(new Set(CATEGORIES.map(c => c.name))) + const collapseAll = () => setOpenCats(new Set()) + + const resolveCmd = (cmd: Command): string | null => { + let resolved = cmd.cmd + if (cmd.needsInput) { + for (const field of cmd.needsInput) { + const val = (inputs[field.token] || '').trim() + if (!val) return null + resolved = resolved.replace(field.token, val) + } + } + return resolved + } + + const runCommand = async (cmd: Command) => { + if (cmd.needsInput) { + const allFilled = cmd.needsInput.every(f => (inputs[f.token] || '').trim()) + if (!allFilled) { setActiveCmd(cmd); return } + } + + // Reboot commands go through the proper Reboot() call + if (cmd.cmd.startsWith('reboot')) { + const mode = cmd.cmd.replace('reboot', '').trim() + if (mode && !confirm(`Reboot to ${cmd.label}?`)) return + const id = notify.loading('Rebooting...') + try { + await Reboot(mode) + notify.dismiss(id) + notify.success(`${cmd.label} initiated`) + } catch (e: any) { + notify.dismiss(id) + notify.error(e) + } + return + } + + const resolved = resolveCmd(cmd) + if (!resolved) { setActiveCmd(cmd); return } + + setRunning(true) + setOutputLabel(cmd.label) + setOutput('') + + try { + const out = await RunAdbHostCommand(resolved) + setOutput(out || '(no output)') + } catch (e: any) { + setOutput(`Error: ${String(e)}`) + } finally { + setRunning(false) + setActiveCmd(null) + } + } + + const copyOutput = () => { + navigator.clipboard.writeText(output) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + + return ( +
+ {/* Left: command browser */} +
+
+
+
+

Command Library

+

{totalCmds} commands · {CATEGORIES.length} categories

+
+
+ + +
+
+ { + setSearch(e.target.value) + if (e.target.value) expandAll() + }} + /> +
+ +
+ {filteredCategories.map(cat => ( +
+ + + {openCats.has(cat.name) && ( +
+ {cat.commands.map(cmd => ( +
runCommand(cmd)} + > +
+
+

{cmd.label}

+ {cmd.needsInput && ( + args + )} +
+

+ {cmd.cmd} +

+
+ +
+ ))} +
+ )} +
+ ))} +
+
+ + {/* Right: output */} +
+ {/* Arg prompt */} + {activeCmd?.needsInput && ( +
+

{activeCmd.label}

+

{activeCmd.cmd}

+
+ {activeCmd.needsInput.map(field => ( +
+ {field.token} + setInputs(prev => ({ ...prev, [field.token]: e.target.value }))} + onKeyDown={e => e.key === 'Enter' && runCommand(activeCmd)} + /> +
+ ))} + + +
+
+ )} + + {/* Output header */} +
+
+ + + {outputLabel || 'Output — click any command to run it'} + + {running && ( +
+ )} +
+ {output && ( + + )} +
+ + {/* Output */} +
+ {!output && !running && ( +
+ +

Select a command from the panel

+

Commands marked args prompt for input before running

+
+ )} + {output && ( +
+              {output}
+            
+ )} +
+ + {/* Status bar */} + {output && ( +
+ {outputLabel} + {output.split('\n').length} lines · {output.length} chars +
+ )} +
+
+ ) +} diff --git a/frontend/src/lib/debloat_db.ts b/frontend/src/lib/debloat_db.ts new file mode 100644 index 0000000..13290f4 --- /dev/null +++ b/frontend/src/lib/debloat_db.ts @@ -0,0 +1,2249 @@ +// Auto-generated from UAD package list (Universal Android Debloater) +// Source: github.com/Universal-Debloater-Alliance/universal-android-debloater-next-generation +// 2157 packages across 14 manufacturers and categories + +export type Safety = 'safe' | 'caution' | 'keep' + +export interface DebloatPackage { + pkg: string + label: string + description: string + safety: Safety + deps?: string[] + neededBy?: string[] +} + +export interface Category { + name: string + packages: DebloatPackage[] +} + +export const DEBLOAT_CATEGORIES: Category[] = [ + { + name: "Google", + packages: [ + { pkg: "com.android.systemui.plugin.globalactions.wallet", label: "Wallet", description: "Apk file name: QuickAccessWallet", safety: "safe" }, + { pkg: "com.google.android.apps.assistant", label: "Assistant", description: "Google Assistant Go (https://play.google.com/store/apps/details?id=com.google.android.apps.assistant)", safety: "safe" }, + { pkg: "com.google.android.apps.searchlite", label: "Searchlite", description: "Google Go (https://play.google.com/store/apps/details?id=com.google.android.apps.searchlite)", safety: "safe" }, + { pkg: "com.google.android.as", label: "As", description: "Android System Intelligence (previously Device Personalization Services) (https://play.google.com/store/app...", safety: "safe" }, + { pkg: "com.google.mainline.telemetry", label: "Telemetry", description: "Contains data on which versions of modules are installed. Google Play uses this data to determine if update...", safety: "keep" }, + { pkg: "com.android.hotwordenrollment.xgoogle", label: "Xgoogle", description: "\"OK Google\" detection service.", safety: "safe" }, + { pkg: "com.android.partnerbrowsercustomizations.chromeHomepage", label: "Chromehomepage", description: "Horrible stuff for Google Chrome. This package bypass your DNS settings (for letting pass Google ads)", safety: "safe" }, + { pkg: "com.android.chrome", label: "Chrome", description: "Google Chrome (https://play.google.com/store/apps/details?id=com.android.chrome)", safety: "safe" }, + { pkg: "com.chrome.beta", label: "Beta", description: "Google Chrome Beta (https://play.google.com/store/apps/details?id=com.chrome.beta)", safety: "safe" }, + { pkg: "com.chrome.canary", label: "Canary", description: "Google Chrome Canary (Nightly build) (https://play.google.com/store/apps/details?id=com.chrome.canary)", safety: "safe" }, + { pkg: "com.chrome.dev", label: "Dev", description: "Google Chrome (developer)\t(https://play.google.com/store/apps/details?id=com.chrome.dev)", safety: "safe" }, + { pkg: "com.google.android.apps.access.wifi.consumer", label: "Consumer", description: "Google Wifi app (https://play.google.com/store/apps/details?id=com.google.android.apps.access.wifi.consumer)", safety: "safe" }, + { pkg: "com.google.android.apps.adm", label: "Adm", description: "Google Find my device app (https://play.google.com/store/apps/details?id=com.google.android.apps.adm)", safety: "safe" }, + { pkg: "com.google.android.apps.ads.publisher", label: "Publisher", description: "Google Adsense app (https://play.google.com/store/apps/details?id=com.google.android.apps.ads.publisher)", safety: "safe" }, + { pkg: "com.google.android.apps.adwords", label: "Adwords", description: "Google Ads app (https://play.google.com/store/apps/details?id=com.google.android.apps.adwords)", safety: "safe" }, + { pkg: "com.google.android.apps.authenticator2", label: "Authenticator2", description: "Google authentificator app (https://play.google.com/store/apps/details?id=com.google.android.apps.authentic...", safety: "safe" }, + { pkg: "com.google.android.apps.blogger", label: "Blogger", description: "Google blogger app (https://play.google.com/store/apps/details?id=com.google.android.apps.blogger)", safety: "safe" }, + { pkg: "com.google.android.apps.books", label: "Books", description: "Google Play Books (https://play.google.com/store/apps/details?id=com.google.android.apps.books)", safety: "safe" }, + { pkg: "com.google.android.apps.chromecast.app", label: "App", description: "Google Home (https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app)", safety: "safe" }, + { pkg: "com.google.android.apps.cloudprint", label: "Cloudprint", description: "Cloud print (https://play.google.com/store/apps/details?id=com.google.android.apps.cloudprint)", safety: "safe" }, + { pkg: "com.google.android.apps.cultural", label: "Cultural", description: "Google Arts & Culture (https://play.google.com/store/apps/details?id=com.google.android.apps.cultural)", safety: "safe" }, + { pkg: "com.google.android.apps.currents", label: "Currents", description: "Google Currents (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.docs", label: "Docs", description: "Google Drive (https://play.google.com/store/apps/details?id=com.google.android.apps.docs)", safety: "safe" }, + { pkg: "com.google.android.apps.docs.editors.docs", label: "Docs", description: "Google Docs (https://play.google.com/store/apps/details?id=com.google.android.apps.docs.editors.docs)", safety: "safe" }, + { pkg: "com.google.android.apps.docs.editors.sheets", label: "Sheets", description: "Google Sheets (https://play.google.com/store/apps/details?id=com.google.android.apps.docs.editors.sheets)", safety: "safe" }, + { pkg: "com.google.android.apps.docs.editors.slides", label: "Slides", description: "Google Slides (https://play.google.com/store/apps/details?id=com.google.android.apps.docs.editors.slides)", safety: "safe" }, + { pkg: "com.google.android.apps.dynamite", label: "Dynamite", description: "Hangout chat (discontinued) (https://play.google.com/store/apps/details?id=com.google.android.apps.dynamite)", safety: "safe" }, + { pkg: "com.google.android.apps.enterprise.cpanel", label: "Cpanel", description: "Google Admin (https://play.google.com/store/apps/details?id=com.google.android.apps.enterprise.cpanel)", safety: "safe" }, + { pkg: "com.google.android.apps.enterprise.dmagent", label: "Dmagent", description: "Google apps device policy (https://play.google.com/store/apps/details?id=com.google.android.apps.enterprise...", safety: "safe" }, + { pkg: "com.google.android.apps.fireball", label: "Fireball", description: "Google Allo (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.fitness", label: "Fitness", description: "Google Fit (https://play.google.com/store/apps/details?id=com.google.android.apps.fitness)", safety: "safe" }, + { pkg: "com.google.android.apps.freighter", label: "Freighter", description: "Google Datally (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.giant", label: "Giant", description: "Google Analytics (https://play.google.com/store/apps/details?id=com.google.android.apps.giant)", safety: "safe" }, + { pkg: "com.google.android.apps.googleassistant", label: "Googleassistant", description: "Google Assistant (https://play.google.com/store/apps/details?id=com.google.android.apps.googleassistant)", safety: "safe" }, + { pkg: "com.google.android.apps.handwriting.ime", label: "Ime", description: "Google Handwriting Input (https://play.google.com/store/apps/details?id=com.google.android.apps.handwriting...", safety: "safe" }, + { pkg: "com.google.android.apps.hangoutsdialer", label: "Hangoutsdialer", description: "Google Hangout Dialer (https://play.google.com/store/apps/details?id=com.google.android.apps.hangoutsdialer)", safety: "safe" }, + { pkg: "com.google.android.apps.kids.familylink", label: "Familylink", description: "Google Family Link (https://play.google.com/store/apps/details?id=com.google.android.apps.kids.familylink)", safety: "safe" }, + { pkg: "com.google.android.apps.kids.familylinkhelper", label: "Familylinkhelper", description: "Google Family Link for children & teens (https://play.google.com/store/apps/details?id=com.google.android.a...", safety: "safe" }, + { pkg: "com.google.android.apps.m4b", label: "M4B", description: "Google My Maps (https://play.google.com/store/apps/details?id=com.google.android.apps.m4b)", safety: "safe" }, + { pkg: "com.google.android.apps.magazines", label: "Magazines", description: "Google News (https://play.google.com/store/apps/details?id=com.google.android.apps.magazines)", safety: "safe" }, + { pkg: "com.google.android.apps.mapslite", label: "Mapslite", description: "Google Maps Go (lite web app of Maps) (https://play.google.com/store/apps/details?id=com.google.android.app...", safety: "safe" }, + { pkg: "com.google.android.apps.meetings", label: "Meetings", description: "Hangout Meet (discontinued) (https://play.google.com/store/apps/details?id=com.google.android.apps.meetings)", safety: "safe" }, + { pkg: "com.google.android.apps.messaging", label: "Messaging", description: "Google Messages (SMS+RCS) (https://play.google.com/store/apps/details?id=com.google.android.apps.messaging)", safety: "safe" }, + { pkg: "com.google.android.apps.nbu.files", label: "Files", description: "Files by Google (https://play.google.com/store/apps/details?id=com.google.android.apps.nbu.files)", safety: "safe" }, + { pkg: "com.google.android.apps.paidtasks", label: "Paidtasks", description: "Google Opinion Rewards (https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks)", safety: "safe" }, + { pkg: "com.google.android.apps.pdfviewer", label: "Pdfviewer", description: "Google PDF Viewer", safety: "caution" }, + { pkg: "com.google.android.apps.photos", label: "Photos", description: "Google Photos (https://play.google.com/store/apps/details?id=com.google.android.apps.photos)", safety: "safe" }, + { pkg: "com.google.android.apps.photos.scanner", label: "Scanner", description: "Google PhotoScan (https://play.google.com/store/apps/details?id=com.google.android.apps.photos.scanner)", safety: "safe" }, + { pkg: "com.google.android.apps.plus", label: "Plus", description: "Google+ (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.podcasts", label: "Podcasts", description: "Google Podcasts (https://play.google.com/store/apps/details?id=com.google.android.apps.podcasts)", safety: "safe" }, + { pkg: "com.google.android.apps.restore", label: "Restore", description: "The backup restore wizard used for pulling Android system backups from your Google account.", safety: "safe" }, + { pkg: "com.google.android.apps.recorder", label: "Recorder", description: "Google (audio)Recorder (https://play.google.com/store/apps/details?id=com.google.android.apps.recorder)", safety: "safe" }, + { pkg: "com.google.android.apps.setupwizard.searchselector", label: "Searchselector", description: "Search engine selector", safety: "safe" }, + { pkg: "com.google.android.apps.santatracker", label: "Santatracker", description: "Google Santa Tracker (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.subscriptions.red", label: "Red", description: "Google One (https://play.google.com/store/apps/details?id=com.google.android.apps.subscriptions.red)", safety: "safe" }, + { pkg: "com.google.android.apps.tachyon", label: "Tachyon", description: "Google Duo (Video Calls) (https://play.google.com/store/apps/details?id=com.google.android.apps.tachyon)", safety: "safe" }, + { pkg: "com.google.android.apps.tasks", label: "Tasks", description: "Google Task (TODO list) (https://play.google.com/store/apps/details?id=com.google.android.apps.tasks)", safety: "safe" }, + { pkg: "com.google.android.apps.translate", label: "Translate", description: "Google Translate (https://play.google.com/store/apps/details?id=com.google.android.apps.translate)", safety: "safe" }, + { pkg: "com.google.android.apps.travel.onthego", label: "Onthego", description: "Google Trip (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.uploader", label: "Uploader", description: "Picasa Uploader (discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.vega", label: "Vega", description: "Google My Business (https://play.google.com/store/apps/details?id=com.google.android.apps.vega)", safety: "safe" }, + { pkg: "com.google.android.apps.walletnfcrel", label: "Walletnfcrel", description: "Google Pay (https://play.google.com/store/apps/details?id=com.google.android.apps.walletnfcrel)", safety: "safe" }, + { pkg: "com.google.android.apps.wallpaper", label: "Wallpaper", description: "Google Wallpapers (https://play.google.com/store/apps/details?id=com.google.android.apps.wallpaper)", safety: "safe" }, + { pkg: "com.google.android.apps.wellbeing", label: "Wellbeing", description: "Digital Wellbeing (https://play.google.com/store/apps/details?id=com.google.android.apps.wellbeing)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.creator", label: "Creator", description: "YouTube Studio (https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.creator)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.gaming", label: "Gaming", description: "YouTube Gaming -(discontinued in March 2019, features integrated in main youtube app)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.kids", label: "Kids", description: "YouTube Kids (https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.kids)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.music", label: "Music", description: "YouTube Music (https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.vr", label: "Vr", description: "YouTube VR (https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.vr)", safety: "safe" }, + { pkg: "com.google.android.backuptransport", label: "Backuptransport", description: "Allows Android apps to back up their data on Google servers.", safety: "caution" }, + { pkg: "com.google.android.calculator", label: "Calculator", description: "Google Calculator (https://play.google.com/store/apps/details?id=com.google.android.calculator)", safety: "safe" }, + { pkg: "com.google.android.calendar", label: "Calendar", description: "Google Calendar (https://play.google.com/store/apps/details?id=com.google.android.calendar)", safety: "safe" }, + { pkg: "com.google.android.configupdater", label: "Configupdater", description: "ConfigUpdater", safety: "caution" }, + { pkg: "com.google.android.deskclock", label: "Deskclock", description: "Google clock app (https://play.google.com/store/apps/details?id=com.google.android.deskclock)", safety: "safe" }, + { pkg: "com.google.android.feedback", label: "Feedback", description: "This is the package that sends crash-report feedback to the Play Store? The crash pop-up still happens with...", safety: "safe" }, + { pkg: "com.google.android.googlequicksearchbox", label: "Googlequicksearchbox", description: "Google Search box (https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox)", safety: "safe" }, + { pkg: "com.google.android.instantapps.supervisor", label: "Supervisor", description: "Lets you try new games directly on Google Play.", safety: "safe" }, + { pkg: "com.google.android.keep", label: "Keep", description: "Google Keep (https://play.google.com/store/apps/details?id=com.google.android.keep)", safety: "safe" }, + { pkg: "com.google.android.markup", label: "Markup", description: "Google Markup app made for modifying pictures, shipped by default on every Pie+ device.", safety: "safe" }, + { pkg: "com.google.android.marvin.talkback", label: "Talkback", description: "Android Accessibility Suite (https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback)", safety: "safe" }, + { pkg: "com.google.android.music", label: "Music", description: "Google Play Music (discontinued) (https://play.google.com/store/apps/details?id=com.google.android.music)", safety: "safe" }, + { pkg: "com.google.android.onetimeinitializer", label: "Onetimeinitializer", description: "Provides first time setup, safe to remove.", safety: "safe" }, + { pkg: "com.google.android.play.games", label: "Games", description: "Google Play Games (https://play.google.com/store/apps/details?id=com.google.android.play.games)", safety: "safe" }, + { pkg: "com.google.android.printservice.recommendation", label: "Recommendation", description: "I think this has to do with recommending a printservice app you can get from the Play store.", safety: "safe" }, + { pkg: "com.google.android.projection.gearhead", label: "Gearhead", description: "Android Auto (https://play.google.com/store/apps/details?id=com.google.android.projection.gearhead)", safety: "safe" }, + { pkg: "com.google.android.pixel.setupwizard", label: "Setupwizard", description: "It's the basic configuration setup guides you through the basics of setting up Google features on your device.", safety: "safe" }, + { pkg: "com.google.android.soundpicker", label: "Soundpicker", description: "Google Sounds. Removable if you already have another media select service.", safety: "safe" }, + { pkg: "com.google.android.street", label: "Street", description: "Google Street View (https://play.google.com/store/apps/details?id=com.google.android.street)", safety: "safe" }, + { pkg: "com.google.android.syncadapters.bookmarks", label: "Bookmarks", description: "Synchronisation for Google Chrome bookmarks", safety: "safe" }, + { pkg: "com.google.android.syncadapters.calendar", label: "Calendar", description: "Synchronisation for Google Calendar.", safety: "caution" }, + { pkg: "com.google.android.syncadapters.contacts", label: "Contacts", description: "Synchronisation for Google Contacts.", safety: "caution" }, + { pkg: "com.google.android.talk", label: "Talk", description: "Google Hangouts (https://play.google.com/store/apps/details?id=com.google.android.talk)", safety: "safe" }, + { pkg: "com.google.android.tts", label: "Tts", description: "Speech Services by Google (https://play.google.com/store/apps/details?id=com.google.android.tts)", safety: "caution" }, + { pkg: "com.google.android.tv.remote", label: "Remote", description: "Android TV remote control (https://play.google.com/store/apps/details?id=com.google.android.tv.remote)", safety: "safe" }, + { pkg: "com.google.android.videoeditor", label: "Videoeditor", description: "Google Movie Studio (discontinued)", safety: "safe" }, + { pkg: "com.google.android.videos", label: "Videos", description: "Google TV (previously Google Play Movies & TV) (https://play.google.com/store/apps/details?id=com.google.an...", safety: "safe" }, + { pkg: "com.google.android.voicesearch", label: "Voicesearch", description: "Google Voice Search (Speech-To-Text)", safety: "safe" }, + { pkg: "com.google.android.vr.home", label: "Home", description: "Daydream (VR stuff) (https://play.google.com/store/apps/details?id=com.google.android.vr.home)", safety: "safe" }, + { pkg: "com.google.android.vr.inputmethod", label: "Inputmethod", description: "Daydream virtual keyboard (VR stuff) (https://play.google.com/store/apps/details?id=com.google.android.vr.i...", safety: "safe" }, + { pkg: "com.google.android.wearable.app", label: "App", description: "Wear OS Smartwatch (https://play.google.com/store/apps/details?id=com.google.android.wearable.app)", safety: "safe" }, + { pkg: "com.google.ar.core", label: "Core", description: "Google Play Services for AR (Augmented Reality) (https://play.google.com/store/apps/details?id=com.google.a...", safety: "safe" }, + { pkg: "com.google.ar.lens", label: "Lens", description: "Google Lens (for AR too) (https://play.google.com/store/apps/details?id=com.google.ar.lens)", safety: "safe" }, + { pkg: "com.google.chromeremotedesktop", label: "Chromeremotedesktop", description: "Chrome Remote Desktop (https://play.google.com/store/apps/details?id=com.google.chromeremotedesktop)", safety: "safe" }, + { pkg: "com.google.earth", label: "Earth", description: "Google Earth (https://play.google.com/store/apps/details?id=com.google.earth)", safety: "safe" }, + { pkg: "com.google.marvin.talkback", label: "Talkback", description: "Android Accessibility Suite (https://play.google.com/store/apps/details?id=com.google.android.marvin.talkback)", safety: "safe" }, + { pkg: "com.google.samples.apps.cardboarddemo", label: "Cardboarddemo", description: "Google Cardboard (VR stuff) (https://play.google.com/store/apps/details?id=com.google.samples.apps.cardboar...", safety: "safe" }, + { pkg: "com.google.tango.measure", label: "Measure", description: "Google Measure (https://play.google.com/store/apps/details?id=com.google.tango.measure)", safety: "safe" }, + { pkg: "com.google.vr.cyclops", label: "Cyclops", description: "Google Cardboard Camera (VR stuff) (https://play.google.com/store/apps/details?id=com.google.vr.cyclops)", safety: "safe" }, + { pkg: "com.google.vr.expeditions", label: "Expeditions", description: "Google Expedition (VR stuff) (https://play.google.com/store/apps/details?id=com.google.vr.expeditions)", safety: "safe" }, + { pkg: "com.google.vr.vrcore", label: "Vrcore", description: "Google VR services (https://play.google.com/store/apps/details?id=com.google.vr.vrcore)", safety: "caution" }, + { pkg: "com.google.zxing.client.android", label: "Android", description: "Google Barcode Scanner (discontinued) (https://play.google.com/store/apps/details?id=com.google.zxing.clien...", safety: "safe" }, + { pkg: "com.google.android.apps.maps", label: "Maps", description: "Google Maps (https://play.google.com/store/apps/details?id=com.google.android.apps.maps)", safety: "safe" }, + { pkg: "com.google.android.apps.nexuslauncher", label: "Nexuslauncher", description: "Pixel Launcher (https://play.google.com/store/apps/details?id=com.google.android.apps.nexuslauncher)", safety: "caution" }, + { pkg: "com.google.android.apps.turbo", label: "Turbo", description: "Device Health Services (discontinued?)", safety: "caution" }, + { pkg: "com.google.android.apps.work.oobconfig", label: "Oobconfig", description: "Device Setup", safety: "caution" }, + { pkg: "com.google.android.carrierconfig", label: "Carrierconfig", description: "Same as com.android.carrierconfig? Here's that description:", safety: "caution" }, + { pkg: "com.google.android.contacts", label: "Contacts", description: "Google Contacts (https://play.google.com/store/apps/details?id=com.google.android.contacts)", safety: "caution" }, + { pkg: "com.google.android.dialer", label: "Dialer", description: "Google Dialer (https://play.google.com/store/apps/details?id=com.google.android.dialer)", safety: "caution" }, + { pkg: "com.google.android.documentsui", label: "Documentsui", description: "Files", safety: "caution" }, + { pkg: "com.google.android.ext.shared", label: "Shared", description: "Google shared library (used to share common code between apps)", safety: "caution" }, + { pkg: "com.google.android.GoogleCamera", label: "Googlecamera", description: "Google Camera (https://play.google.com/store/apps/details?id=com.google.android.GoogleCamera)", safety: "caution" }, + { pkg: "com.google.android.gms", label: "Gms", description: "Google Play Services", safety: "caution" }, + { pkg: "com.google.android.gms.location.history", label: "History", description: "Google Location history", safety: "safe" }, + { pkg: "com.google.android.gms.policy_sidecar_aps", label: "Policy Sidecar Aps", description: "Not sure what purpose it has, but it gets some network and phone data and connects to some Google domains, ...", safety: "caution" }, + { pkg: "com.google.android.gsf", label: "Gsf", description: "Google Services Framework", safety: "caution" }, + { pkg: "com.google.android.gsf.login", label: "Login", description: "Support for managing Google accounts.", safety: "caution" }, + { pkg: "com.google.android.location", label: "Location", description: "Handles location services on older devices. On newer ones Google location services is part of Google Play S...", safety: "caution" }, + { pkg: "com.google.android.partnersetup", label: "Partnersetup", description: "Google Partner Setup", safety: "safe" }, + { pkg: "com.google.android.webview", label: "Webview", description: "Android System WebView (https://play.google.com/store/apps/details?id=com.google.android.webview)", safety: "caution" }, + { pkg: "com.google.android.launcher", label: "Launcher", description: "Google Now Launcher (https://play.google.com/store/apps/details?id=com.google.android.launcher)", safety: "caution" }, + { pkg: "com.google.android.gm", label: "Gm", description: "Gmail (https://play.google.com/store/apps/details?id=com.google.android.gm)", safety: "safe" }, + { pkg: "com.google.android.gm.lite", label: "Lite", description: "Gmail Go (https://play.google.com/store/apps/details?id=com.google.android.gm.lite)", safety: "safe" }, + { pkg: "com.google.android.ims", label: "Ims", description: "Carrier Services (https://play.google.com/store/apps/details?id=com.google.android.ims)", safety: "caution" }, + { pkg: "com.google.audio.hearing.visualization.accessibility.scribe", label: "Scribe", description: "Live Transcribe & Sound Notifications (https://play.google.com/store/apps/details?id=com.google.audio.heari...", safety: "safe" }, + { pkg: "com.android.vending", label: "Vending", description: "Google Play Store", safety: "caution" }, + { pkg: "com.google.android.inputmethod.latin", label: "Latin", description: "Gboard \u2013 the Google Keyboard (https://play.google.com/store/apps/details?id=com.google.android.inputmethod....", safety: "caution" }, + { pkg: "com.google.android.apps.inputmethod.hindi", label: "Hindi", description: "Google Keyboard + Hinndi characters (https://play.google.com/store/apps/details?id=com.google.android.apps....", safety: "caution" }, + { pkg: "com.google.android.inputmethod.japanese", label: "Japanese", description: "Google Keyboard + Japanese characters (https://play.google.com/store/apps/details?id=com.google.android.inp...", safety: "caution" }, + { pkg: "com.google.android.inputmethod.korean", label: "Korean", description: "Google Keyboard + Korean characters (https://play.google.com/store/apps/details?id=com.google.android.input...", safety: "caution" }, + { pkg: "com.google.android.inputmethod.pinyin", label: "Pinyin", description: "Google Keyboard + Pinyin (chinese) characters (https://play.google.com/store/apps/details?id=com.google.and...", safety: "caution" }, + { pkg: "com.google.android.captiveportallogin", label: "Captiveportallogin", description: "Support for captive portal : https://en.wikipedia.org/wiki/Captive_portal", safety: "keep" }, + { pkg: "com.google.android.modulemetadata", label: "Modulemetadata", description: "Module that contains metadata about the list of modules on the device. And that\u2019s about it.", safety: "keep" }, + { pkg: "com.google.android.ext.services", label: "Services", description: "The ExtServices module updates framework components for core OS functionality such as notification ranking,...", safety: "keep" }, + { pkg: "com.google.android.overlay.modules.ext.services", label: "Services", description: "Android System Theme pack", safety: "caution" }, + { pkg: "com.google.android.networkstack", label: "Networkstack", description: "Network Stack Components", safety: "keep" }, + { pkg: "com.google.android.networkstack.permissionconfig", label: "Permissionconfig", description: "Network Stack Permission Configuration", safety: "keep" }, + { pkg: "com.google.android.packageinstaller", label: "Packageinstaller", description: "Google package installer. Seems to replace com.android.packageinstaller on newer phones. It is strangely no...", safety: "keep" }, + { pkg: "com.google.android.packageinstaller.a_overlay", label: "A Overlay", description: "Gives ability to install, update or remove applications on the device.", safety: "keep" }, + { pkg: "com.google.android.permissioncontroller", label: "Permissioncontroller", description: "Permission controller", safety: "keep" }, + { pkg: "com.google.android.overlay.modules.permissioncontroller", label: "Permissioncontroller", description: "Permission controller Theme pack", safety: "caution" }, + { pkg: "com.google.android.overlay.modules.permissioncontroller.forframework", label: "Forframework", description: "Android System Theme pack", safety: "caution" }, + { pkg: "com.android.hotwordenrollment.okgoogle", label: "Okgoogle", description: "\"OK Google\" detection service.", safety: "safe" }, + { pkg: "com.google.android.apps.inbox", label: "Inbox", description: "Inbox by Gmail (Discontinued)", safety: "safe" }, + { pkg: "com.google.android.apps.navlite", label: "Navlite", description: "Google Maps GPS (https://play.google.com/store/apps/details?id=com.google.android.apps.navlite)", safety: "safe" }, + { pkg: "com.google.android.backup", label: "Backup", description: "Allows Android apps to back up their data on Google servers. (On Android 4.2)", safety: "safe" }, + { pkg: "com.google.android.setupwizard", label: "Setupwizard", description: "Android Setup", safety: "caution" }, + { pkg: "com.google.android.setupwizard.a_overlay", label: "A Overlay", description: "Overlay for setupwizard?", safety: "safe" }, + { pkg: "com.google.android.youtube", label: "Youtube", description: "YouTube (https://play.google.com/store/apps/details?id=com.google.android.youtube)", safety: "safe" }, + { pkg: "com.google.android.apps.youtube.mango", label: "Mango", description: "YouTube Go (https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.mango)", safety: "safe" }, + { pkg: "com.google.android.email", label: "Email", description: "AOSP Mail client", safety: "safe" }, + { pkg: "com.google.android.tag", label: "Tag", description: "Support for NFC tags interactions (5 permissions : Contacts/Phone On by default).", safety: "safe" }, + { pkg: "com.google.android.apps.nbu.paisa.user", label: "User", description: "Google Pay (https://play.google.com/store/apps/details?id=com.google.android.apps.nbu.paisa.user)", safety: "safe" }, + { pkg: "com.android.soundpicker", label: "Soundpicker", description: "Google Sounds. Needed to pick up a phone ringtone. No weird permissions.", safety: "caution" }, + { pkg: "com.google.android.overlay.modules.cellbroadcastreceiver", label: "Cellbroadcastreceiver", description: "Overlay (theme/notification) module for com.google.android.cellbroadcastreceiver", safety: "caution", deps: ["com.google.android.cellbroadcastreceiver"] }, + { pkg: "com.google.android.apps.safetyhub", label: "Safetyhub", description: "Personal Safety (https://play.google.com/store/apps/details?id=com.google.android.apps.safetyhub)", safety: "caution" }, + ], + }, + { + name: "Samsung", + packages: [ + { pkg: "com.samsung.android.galaxycontinuity", label: "Galaxycontinuity", description: "Samsung Flow (https://play.google.com/store/apps/details?id=com.samsung.android.galaxycontinuity)", safety: "safe" }, + { pkg: "com.knox.vpn.proxyhandler", label: "Proxyhandler", description: "Third-party package that provides caller profile information to help consumers identify incoming calls and ...", safety: "safe" }, + { pkg: "com.samsung.app.jansky", label: "Jansky", description: "Multi-lines settings", safety: "safe" }, + { pkg: "com.samsung.aasaservice", label: "Aasaservice", description: "Sometimes, eat a LOT of battery (according to some reddit users)", safety: "safe" }, + { pkg: "com.samsung.accessory", label: "Accessory", description: "Samsung Accessory Service (https://play.google.com/store/apps/details?id=com.samsung.accessory)", safety: "safe" }, + { pkg: "com.samsung.accessory.beansmgr", label: "Beansmgr", description: "Gear IconX Plugin (https://play.google.com/store/apps/details?id=com.samsung.accessory.beansmgr)", safety: "safe" }, + { pkg: "com.samsung.accessory.safiletransfer", label: "Safiletransfer", description: "SASystemProviders", safety: "safe" }, + { pkg: "com.samsung.android.aircommandmanager", label: "Aircommandmanager", description: "AirCommandManager manager", safety: "safe" }, + { pkg: "com.samsung.android.allshare.service.mediashare", label: "Mediashare", description: "Samsung Allshare service (now called SmartView).", safety: "safe" }, + { pkg: "com.samsung.android.app.accesscontrol", label: "Accesscontrol", description: "Samsung Interaction control", safety: "safe" }, + { pkg: "com.samsung.android.app.advsounddetector", label: "Advsounddetector", description: "Samsung Sound detectors", safety: "safe" }, + { pkg: "com.samsung.android.app.appsedge", label: "Appsedge", description: "Samsung apps edge (https://www.samsung.com/global/galaxy/what-is/apps-edge/)", safety: "caution" }, + { pkg: "com.samsung.android.app.assistantmenu", label: "Assistantmenu", description: "Assistant menu", safety: "safe" }, + { pkg: "com.samsung.android.app.camera.sticker.stamp.preload", label: "Preload", description: "Annoying Stickers/stamps of the Samsung camera app. C'mon it feels like Snapshat.", safety: "safe" }, + { pkg: "com.samsung.android.app.camera.sticker.facearframe.preload", label: "Preload", description: "Frames sticker?", safety: "safe" }, + { pkg: "com.samsung.android.app.clipboardedge", label: "Clipboardedge", description: "Clipboard edge panel", safety: "safe" }, + { pkg: "com.samsung.android.app.cocktailbarservice", label: "Cocktailbarservice", description: "Edge screen", safety: "safe" }, + { pkg: "com.samsung.android.app.color", label: "Color", description: "Color adjustment", safety: "safe" }, + { pkg: "com.samsung.android.app.dressroom", label: "Dressroom", description: "Samsung Wallpapers", safety: "caution" }, + { pkg: "com.samsung.android.app.episodes", label: "Episodes", description: "Samsung story album (https://www.samsung.com/in/support/mobile-devices/what-is-story-album-application-in-s...", safety: "safe" }, + { pkg: "com.samsung.android.app.filterinstaller", label: "Filterinstaller", description: "Filter installer", safety: "safe" }, + { pkg: "com.samsung.app.highlightplayer", label: "Highlightplayer", description: "Samsung Story Video Editor", safety: "safe" }, + { pkg: "com.samsung.android.app.interactivepanoramaviewer", label: "Interactivepanoramaviewer", description: "Visual. photo virt.", safety: "safe" }, + { pkg: "com.samsung.android.app.ledcoverdream", label: "Ledcoverdream", description: "I think it enable doing things with LEDs on the cover", safety: "safe" }, + { pkg: "com.samsung.android.app.omcagent", label: "Omcagent", description: "Open Market Customization Agent", safety: "safe" }, + { pkg: "com.samsung.android.app.memo", label: "Memo", description: "Samsung Memo (was replaced by Samsung Notes app :\tcom.samsung.android.app.notes)", safety: "safe" }, + { pkg: "com.samsung.android.app.mhswrappertmo", label: "Mhswrappertmo", description: "Mobile Hotspot", safety: "safe" }, + { pkg: "com.samsung.android.app.mirrorlink", label: "Mirrorlink", description: "Used to connect your phone to a car (with https://mirrorlink.com/ support) in order to provide audio stream...", safety: "safe" }, + { pkg: "com.samsung.android.app.news", label: "News", description: "News Samsung app", safety: "safe" }, + { pkg: "com.samsung.android.app.notes", label: "Notes", description: "Samsung Notes app (https://play.google.com/store/apps/details?id=com.samsung.android.app.notes)", safety: "safe" }, + { pkg: "com.samsung.android.app.panel.naver.v", label: "V", description: "Naver V Panel", safety: "safe" }, + { pkg: "com.samsung.android.app.pinboard", label: "Pinboard", description: "Samsung Scrapbook (discontinued)", safety: "safe" }, + { pkg: "com.samsung.android.app.reminder", label: "Reminder", description: "Samsung bixby reminder (https://www.samsung.com/global/galaxy/apps/bixby/reminder/)", safety: "safe" }, + { pkg: "com.samsung.android.app.routines", label: "Routines", description: "Samsung bixby routines (https://www.samsung.com/global/galaxy/what-is/bixby-routines/)", safety: "safe" }, + { pkg: "com.samsung.android.app.sbrowseredge", label: "Sbrowseredge", description: "Related to internet browser. For Galaxy Edge?", safety: "safe" }, + { pkg: "com.samsung.android.app.settings.bixby", label: "Bixby", description: "Bixby settings (Bixby = Samsung intelligence assistant)", safety: "safe" }, + { pkg: "com.samsung.android.app.simplesharing", label: "Simplesharing", description: "Samsung Link Sharing", safety: "safe" }, + { pkg: "com.samsung.android.app.social", label: "Social", description: "I know this has been discontinued by Samsung but that it.", safety: "safe" }, + { pkg: "com.samsung.android.app.spage", label: "Spage", description: "Samsung Free (previously known as 'Bixby Home') is a vertically scrolling list of information that Bixby ca...", safety: "safe" }, + { pkg: "com.samsung.android.app.storyalbumwidget", label: "Storyalbumwidget", description: "The Story Album widget enables you to access the Story Album app and create digital picture albums that you...", safety: "safe" }, + { pkg: "com.samsung.android.app.talkback", label: "Talkback", description: "Voice assistant. Accessibility feature", safety: "safe" }, + { pkg: "com.samsung.android.app.taskedge", label: "Taskedge", description: "Handle task edge panel", safety: "safe" }, + { pkg: "com.samsung.android.app.tips", label: "Tips", description: "Tips on how to use your phone\"", safety: "safe" }, + { pkg: "com.samsung.android.app.vrsetupwizardstub", label: "Vrsetupwizardstub", description: "Samsung Gear VR (Virtual Reality) setup wizard (https://en.wikipedia.org/wiki/Samsung_Gear_VR)", safety: "safe" }, + { pkg: "com.samsung.android.app.watchmanager", label: "Watchmanager", description: "Samsung Galaxy Wearable (Samsung Gear) (https://play.google.com/store/apps/details?id=com.samsung.android.a...", safety: "safe" }, + { pkg: "com.samsung.android.app.watchmanagerstub", label: "Watchmanagerstub", description: "Stub for the Galaxy Wearable app.", safety: "safe" }, + { pkg: "com.samsung.android.app.withtv", label: "Withtv", description: "WitTV (replaced by com.sec.android.app.withtv)", safety: "safe" }, + { pkg: "com.samsung.android.ardrawing", label: "Ardrawing", description: "AR Doodles (accessible through AR Zone)", safety: "safe" }, + { pkg: "com.samsung.android.arzone", label: "Arzone", description: "AR Zone", safety: "safe" }, + { pkg: "com.samsung.android.aremoji", label: "Aremoji", description: "AR Emoji mode for Samsung camera", safety: "safe" }, + { pkg: "com.samsung.android.aremojieditor", label: "Aremojieditor", description: "AR Emoji Editor", safety: "safe" }, + { pkg: "com.samsung.android.asksmanager", label: "Asksmanager", description: "Samsung device protection manager.", safety: "safe" }, + { pkg: "com.samsung.android.authfw", label: "Authfw", description: "Used by Samsung Pass", safety: "safe" }, + { pkg: "com.samsung.android.aware.service", label: "Service", description: "Samsung Quick Share", safety: "safe" }, + { pkg: "com.samsung.android.bbc.bbcagent", label: "Bbcagent", description: "BBCAgent (B. B. Container Agent?)", safety: "safe" }, + { pkg: "com.samsung.android.bbc.fileprovider", label: "Fileprovider", description: "KNOX BBC Provider.", safety: "safe" }, + { pkg: "com.samsung.android.beaconmanager", label: "Beaconmanager", description: "Replaced by Samsung Smart Things (com.samsung.android.ststub)", safety: "safe" }, + { pkg: "com.samsung.android.bixby.agent", label: "Agent", description: "Removing this will disable the bixby hardware key without breaking Bixby itself.", safety: "safe" }, + { pkg: "com.samsung.android.bixbyvision.framework", label: "Framework", description: "BixbyVision Framework", safety: "safe" }, + { pkg: "com.samsung.android.calendar", label: "Calendar", description: "Samsung Calendar App", safety: "caution" }, + { pkg: "com.samsung.android.coreapps", label: "Coreapps", description: "Samsung Enhanced features", safety: "safe" }, + { pkg: "com.samsung.android.da.daagent", label: "Daagent", description: "Samsung dual messenger (https://www.samsung.com/global/galaxy/what-is/dual-messenger/)", safety: "safe" }, + { pkg: "com.samsung.android.dlp.service", label: "Service", description: "SamsungDLPService (KNOX). Old feature. Was replaced by SDP (Sensitive Data Protection)", safety: "safe" }, + { pkg: "com.samsung.android.dqagent", label: "Dqagent", description: "Samsung Device Quality Agent", safety: "safe" }, + { pkg: "com.samsung.android.drivelink.stub", label: "Stub", description: "Stub for car mode", safety: "safe" }, + { pkg: "com.samsung.android.dynamiclock", label: "Dynamiclock", description: "Samsung Wallpaper services (AKA 'Dynamic Lock')", safety: "safe" }, + { pkg: "com.samsung.android.gearoplugin", label: "Gearoplugin", description: "Gear S Plugin (https://play.google.com/store/apps/details?id=com.samsung.android.gearoplugin)", safety: "safe" }, + { pkg: "com.samsung.android.easysetup", label: "Easysetup", description: "Samsung Connect Easy Setup (now SmartThings)", safety: "safe" }, + { pkg: "com.samsung.android.email.provider", label: "Provider", description: "Samsung email app (https://play.google.com/store/apps/details?id=com.samsung.android.email.provider)", safety: "safe" }, + { pkg: "com.samsung.android.emojiupdater", label: "Emojiupdater", description: "AR Emoji updater", safety: "safe" }, + { pkg: "com.samsung.android.fast", label: "Fast", description: "Samsung Secure Wi-Fi", safety: "safe" }, + { pkg: "com.samsung.android.fmm", label: "Fmm", description: "Find My Mobile", safety: "safe" }, + { pkg: "com.samsung.android.game.gamehome", label: "Gamehome", description: "Samsung Game Launcher", safety: "safe" }, + { pkg: "com.samsung.android.game.gametools", label: "Gametools", description: "Samsung Game Tools (https://www.samsung.com/au/support/mobile-devices/how-to-use-game-tools/)", safety: "safe" }, + { pkg: "com.samsung.android.game.gos", label: "Gos", description: "Samsung Game Optimizing Service", safety: "safe" }, + { pkg: "com.samsung.android.gametuner.thin", label: "Thin", description: "Samsung Game Tuner (https://play.google.com/store/apps/details?id=com.samsung.android.gametuner.thin)", safety: "safe" }, + { pkg: "com.samsung.android.homemode", label: "Homemode", description: "Daily Board (https://play.google.com/store/apps/details?id=com.samsung.android.homemode)", safety: "safe" }, + { pkg: "com.samsung.android.hmt.vrshell", label: "Vrshell", description: "Gear VR Shell", safety: "safe" }, + { pkg: "com.samsung.android.hmt.vrsvc", label: "Vrsvc", description: "Gear VR Service", safety: "safe" }, + { pkg: "com.samsung.android.icecone", label: "Icecone", description: "Keyboard Content Center", safety: "safe" }, + { pkg: "com.samsung.android.intelligenceservice2", label: "Intelligenceservice2", description: "It seems that this package is a kind of spyware. Very difficult to find information about this.", safety: "safe" }, + { pkg: "com.samsung.android.ipsgeofence", label: "Ipsgeofence", description: "Samsung Visit In app", safety: "safe" }, + { pkg: "com.samsung.android.keyguardwallpaperupdator", label: "Keyguardwallpaperupdator", description: "Lets you customize your Samsung device with different images (provided by Samsung) on the lock screen.", safety: "safe" }, + { pkg: "com.samsung.android.kidsinstaller", label: "Kidsinstaller", description: "Samsung Kids Home (https://www.samsung.com/global/galaxy/apps/samsung-kids-home/)", safety: "safe" }, + { pkg: "com.samsung.android.knox.attestation", label: "Attestation", description: "KNOX Attestation", safety: "safe" }, + { pkg: "com.samsung.android.knox.containercore", label: "Containercore", description: "KNOX Work profile/space", safety: "safe" }, + { pkg: "com.samsung.android.knox.containerdesktop", label: "Containerdesktop", description: "Knox Container Desktop", safety: "safe" }, + { pkg: "com.samsung.android.livestickers", label: "Livestickers", description: "Deco Pic (accessible through AR Zone)", safety: "safe" }, + { pkg: "com.samsung.android.location", label: "Location", description: "IMO it handles GPS needs for some samsungs apps. I have it removed on my phone and I still can use the GPS ...", safety: "caution" }, + { pkg: "com.samsung.android.mateagent", label: "Mateagent", description: "Samsung Galaxy Friends is an accessory platform service that allows the user to enjoy a variety of content ...", safety: "safe" }, + { pkg: "com.samsung.android.mdecservice", label: "Mdecservice", description: "Samsung Call & Text", safety: "safe" }, + { pkg: "com.samsung.android.mdm", label: "Mdm", description: "MDMApp (Mobile Device Management app)", safety: "safe" }, + { pkg: "com.samsung.android.mdx", label: "Mdx", description: "Link to Windows Service", safety: "safe" }, + { pkg: "com.samsung.android.mdx.kit", label: "Kit", description: "MDE Service Framework", safety: "safe" }, + { pkg: "com.samsung.android.mdx.quickboard", label: "Quickboard", description: "Media & Devices feature", safety: "caution" }, + { pkg: "com.samsung.android.mobileservice", label: "Mobileservice", description: "Samsung Experience Service (https://play.google.com/store/apps/details?id=com.samsung.android.mobileservice)", safety: "safe" }, + { pkg: "com.samsung.android.net.wifi.wifiguider", label: "Wifiguider", description: "Wi-Fi Tips", safety: "safe" }, + { pkg: "com.samsung.android.networkdiagnostic", label: "Networkdiagnostic", description: "Network Diagnostic", safety: "safe" }, + { pkg: "com.samsung.android.oneconnect", label: "Oneconnect", description: "Samsung Smart Things (https://play.google.com/store/apps/details?id=com.samsung.android.oneconnect)", safety: "safe" }, + { pkg: "com.samsung.android.provider.shootingmodeprovider", label: "Shootingmodeprovider", description: "Provide camera modes (when you swipe left fromt the camera app)", safety: "caution" }, + { pkg: "com.samsung.android.providers.context", label: "Context", description: "Spyware", safety: "safe" }, + { pkg: "com.samsung.android.rubin.app", label: "App", description: "Customization Service", safety: "safe" }, + { pkg: "com.samsung.android.samsungpass", label: "Samsungpass", description: "Samsung Pass app", safety: "safe" }, + { pkg: "com.samsung.android.samsungpassautofill", label: "Samsungpassautofill", description: "Auto Fill for Samsung Pass", safety: "safe" }, + { pkg: "com.samsung.android.samsungpositioning", label: "Samsungpositioning", description: "Run at startup and ask for an unknown permission SEC_FACTORY_PHONE", safety: "safe" }, + { pkg: "com.samsung.android.sdk.handwriting", label: "Handwriting", description: "Handwriting Service", safety: "safe" }, + { pkg: "com.samsung.android.sdk.professionalaudio.utility.jammonitor", label: "Jammonitor", description: "Professional Audio", safety: "safe" }, + { pkg: "com.samsung.android.sdk.professionalaudio.app.audioconnectionservice", label: "Audioconnectionservice", description: "AudioConnectionService", safety: "safe" }, + { pkg: "com.samsung.android.shortcutbackupservice", label: "Shortcutbackupservice", description: "ShortcutBNR", safety: "safe" }, + { pkg: "com.samsung.android.sdm.config", label: "Config", description: "Configuration Update for Samsung Deskphone Manager (SDM)", safety: "safe" }, + { pkg: "com.samsung.android.slinkcloud", label: "Slinkcloud", description: "Samsung Cloud Gateway", safety: "safe" }, + { pkg: "com.samsung.android.smartface", label: "Smartface", description: "SmartFaceService", safety: "caution" }, + { pkg: "com.samsung.android.smartswitchassistant", label: "Smartswitchassistant", description: "Samsung SmartSwitch", safety: "safe" }, + { pkg: "com.samsung.android.stickerplugin", label: "Stickerplugin", description: "StickerPlugin", safety: "safe" }, + { pkg: "com.samsung.android.sm", label: "Sm", description: "Smart Manager app", safety: "safe" }, + { pkg: "com.samsung.android.scloud.sync", label: "Sync", description: "Samsung cloud synchronisation service", safety: "safe" }, + { pkg: "com.samsung.android.scloud", label: "Scloud", description: "Samsung Cloud (https://www.samsung.com/us/support/owners/app/samsung-cloud)", safety: "safe" }, + { pkg: "com.samsung.android.scloud.auth", label: "Auth", description: "Handle authentifcation for Samsung cloud", safety: "safe" }, + { pkg: "com.samsung.android.sconnect", label: "Sconnect", description: "Samsung Quick connect (discontinued ?)", safety: "safe" }, + { pkg: "com.samsung.android.securitylogagent", label: "Securitylogagent", description: "Security Log Agent", safety: "safe" }, + { pkg: "com.samsung.android.service.livedrawing", label: "Livedrawing", description: "Live Message enables you to draw your own animated GIFs or emojis.", safety: "safe" }, + { pkg: "com.samsung.android.mfi", label: "Mfi", description: "Galaxy Widget (https://play.google.com/store/apps/details?id=com.samsung.android.mfi)", safety: "safe" }, + { pkg: "com.samsung.android.service.peoplestripe", label: "Peoplestripe", description: "People Edge", safety: "safe" }, + { pkg: "com.samsung.android.service.travel", label: "Travel", description: "Samsung Travel Wallpaper (discontinued)", safety: "safe" }, + { pkg: "com.samsung.android.smartcallprovider", label: "Smartcallprovider", description: "Samsung Smart Call", safety: "safe" }, + { pkg: "com.samsung.android.smartmirroring", label: "Smartmirroring", description: "Samsung Smart View", safety: "caution", neededBy: ["com.samsung.android.video"] }, + { pkg: "com.samsung.android.spayfw", label: "Spayfw", description: "Samsung Pay Framework needed for Samsung Pay", safety: "safe", neededBy: ["com.samsung.android.spay"] }, + { pkg: "com.samsung.android.spay", label: "Spay", description: "Samsung Pay (https://play.google.com/store/apps/details?id=com.samsung.android.spay)", safety: "safe", deps: ["com.sec.android.app.samsungapps", "com.samsung.android.spayfw"] }, + { pkg: "com.samsung.android.spaymini", label: "Spaymini", description: "Samsung Pay Mini", safety: "safe" }, + { pkg: "com.samsung.android.spdfnote", label: "Spdfnote", description: "Write on PDF (https://play.google.com/store/apps/details?id=com.samsung.android.spdfnote)", safety: "safe" }, + { pkg: "com.samsung.android.stickercenter", label: "Stickercenter", description: "Sticker center. Used to retrieve stickers from the web in the camera app.", safety: "safe" }, + { pkg: "com.samsung.android.ststub", label: "Ststub", description: "Allows users to control, automate, and monitor their home environment via mobile device.", safety: "safe" }, + { pkg: "com.samsung.android.svcagent", label: "Svcagent", description: "Impossible to know what this system app does. It has full access to internet network anyway.", safety: "safe" }, + { pkg: "com.samsung.android.svoice", label: "Svoice", description: "Samsung Voice (S Voice) was replaced by bixby on Samsung Galaxy S8(+) and newer phones.", safety: "safe" }, + { pkg: "com.samsung.android.svoiceime", label: "Svoiceime", description: "Samsung voice input", safety: "safe" }, + { pkg: "com.samsung.android.themecenter", label: "Themecenter", description: "Samsung Theme Center (AKA Galaxy Themes Service)", safety: "caution" }, + { pkg: "com.samsung.android.themestore", label: "Themestore", description: "Galaxy Themes", safety: "caution" }, + { pkg: "com.samsung.android.tripwidget", label: "Tripwidget", description: "Discontinued package (used in Galaxy S4) handling trip wallpaper widget.", safety: "safe" }, + { pkg: "com.samsung.android.unifiedprofile", label: "Unifiedprofile", description: "My Profile", safety: "safe" }, + { pkg: "com.samsung.android.universalswitch", label: "Universalswitch", description: "Universal Switch lets you designate certain touches or gestures to control specific actions on your phone.", safety: "safe" }, + { pkg: "com.samsung.android.visionarapps", label: "Visionarapps", description: "\"AR apps\"", safety: "safe" }, + { pkg: "com.samsung.android.visioncloudagent", label: "Visioncloudagent", description: "VisionCloudAgent", safety: "safe" }, + { pkg: "com.samsung.android.visionintelligence", label: "Visionintelligence", description: "Bixby Vision", safety: "safe" }, + { pkg: "com.samsung.android.voc", label: "Voc", description: "Samsung Members (https://play.google.com/store/apps/details?id=com.samsung.android.voc)", safety: "safe" }, + { pkg: "com.samsung.android.voicewakeup", label: "Voicewakeup", description: "Voice wake-up for using Bixby", safety: "safe" }, + { pkg: "com.samsung.android.weather", label: "Weather", description: "Samsung Weather", safety: "safe" }, + { pkg: "com.samsung.android.forest", label: "Forest", description: "Digital Wellbeing (old version of com.samsung.android.wellbeing)", safety: "safe" }, + { pkg: "com.samsung.android.wellbeing", label: "Wellbeing", description: "Digital Wellbeing", safety: "safe" }, + { pkg: "com.samsung.android.widgetapp.yahooedge.finance", label: "Finance", description: "Special edge panel widget for Yahoo Finance", safety: "safe" }, + { pkg: "com.samsung.android.widgetapp.yahooedge.sport", label: "Sport", description: "Special edge panel widget for Yahoo Sport", safety: "safe" }, + { pkg: "com.samsung.crane", label: "Crane", description: "Call+ (https://support.vodafone.co.uk/Vodafone-apps/Call-and-Message/60900956/What-is-Call.htm)", safety: "safe" }, + { pkg: "com.samsung.daydream.customization", label: "Customization", description: "Samsung customization for Google Daydream VR headset (https://arvr.google.com/daydream/)", safety: "safe" }, + { pkg: "com.samsung.desktopsystemui", label: "Desktopsystemui", description: "Samsung DEX UI", safety: "safe" }, + { pkg: "com.samsung.discover", label: "Discover", description: "It shows up as a pane on OneUI home and prompts you to install all sorts of random apps. OneUI works perfec...", safety: "safe", neededBy: ["com.samsung.discover.sep"] }, + { pkg: "com.samsung.discover.sep", label: "Sep", description: "Related to `com.samsung.discover` but doesnt seem to do much on its own. Safe to remove without any effect.", safety: "safe", deps: ["com.samsung.discover"] }, + { pkg: "com.samsung.ecomm", label: "Ecomm", description: "Shop Samsung (https://play.google.com/store/apps/details?id=com.samsung.ecomm)", safety: "safe" }, + { pkg: "com.samsung.enhanceservice", label: "Enhanceservice", description: "Enhanced service is the process for Samsung cloud messaging (equivalent to iMessage on iOS).", safety: "safe" }, + { pkg: "com.samsung.faceservice", label: "Faceservice", description: "Face service detection", safety: "safe" }, + { pkg: "com.samsung.fresco.logging", label: "Logging", description: "Fresco Logging Service", safety: "safe" }, + { pkg: "com.samsung.groupcast", label: "Groupcast", description: "Samsung Group Play (discontinued)", safety: "safe" }, + { pkg: "com.samsung.helphub", label: "Helphub", description: "Not sure if this package still exist.", safety: "safe" }, + { pkg: "com.samsung.ipservice", label: "Ipservice", description: "Set of hidden network settings (inlcuding frequency bands choice)", safety: "safe" }, + { pkg: "com.samsung.klmsagent", label: "Klmsagent", description: "Checks the validity of your KLM/KPE (Knox Licence Manager) licence.", safety: "safe" }, + { pkg: "com.samsung.android.knox.analytics.uploader", label: "Uploader", description: "Knox Analytics Uploader", safety: "safe" }, + { pkg: "com.samsung.knox.keychain", label: "Keychain", description: "Knox Key Chain", safety: "keep" }, + { pkg: "com.samsung.knox.knoxtrustagent", label: "Knoxtrustagent", description: "Knox Quick Access allows users to access the Knox Workspace container using wearables such as the Galaxy Ge...", safety: "safe" }, + { pkg: "com.samsung.knox.kss", label: "Kss", description: "Knox Keyguard. Not much more information", safety: "safe" }, + { pkg: "com.samsung.android.knox.pushmanager", label: "Pushmanager", description: "KnoxPushManager", safety: "safe" }, + { pkg: "com.samsung.knox.securefolder", label: "Securefolder", description: "Knox Secure Folder (https://play.google.com/store/apps/details?id=com.samsung.knox.securefolder)", safety: "safe" }, + { pkg: "com.samsung.knox.securefolder.setuppage", label: "Setuppage", description: "Provides the setup process when opening secure folder (com.samsung.knox.securefolder) for the first time", safety: "safe" }, + { pkg: "com.samsung.logwriter", label: "Logwriter", description: "LogWriter", safety: "safe" }, + { pkg: "com.samsung.mdl.radio", label: "Radio", description: "Samsung Milk Music (discontinued in 2016)", safety: "safe" }, + { pkg: "com.samsung.mlp", label: "Mlp", description: "Samsung content recognition.", safety: "safe" }, + { pkg: "com.samsung.mdl.radio.radiostub", label: "Radiostub", description: "Milk Music (shut down by Samsung)", safety: "safe" }, + { pkg: "com.samsung.oh", label: "Oh", description: "Samsung Members (https://play.google.com/store/apps/details?id=com.samsung.oh)", safety: "safe" }, + { pkg: "com.samsung.rcs", label: "Rcs", description: "RCS (Rich Communication Services)", safety: "safe" }, + { pkg: "com.samsung.safetyinformation", label: "Safetyinformation", description: "Some safety information telling you not to put your phone in your eyes (it's not a joke)", safety: "safe" }, + { pkg: "com.samsung.SMT", label: "Smt", description: "Samsung TTS (Text-to-speech)", safety: "caution" }, + { pkg: "com.samsung.storyservice", label: "Storyservice", description: "Samsung StoryService", safety: "safe" }, + { pkg: "com.samsung.svoice.sync", label: "Sync", description: "Samsung Voice service", safety: "safe" }, + { pkg: "com.samsung.systemui.bixby2", label: "Bixby2", description: "System UI for Bixby/Bixby2", safety: "safe" }, + { pkg: "com.samsung.tmovvm", label: "Tmovvm", description: "Samsung Visual Voicemail (for T-mobile only)", safety: "safe" }, + { pkg: "com.samsung.ucs.agent.boot", label: "Boot", description: "Boot agent", safety: "safe" }, + { pkg: "com.samsung.ucs.agent.ese", label: "Ese", description: "eSE UCS Plugin is another package from UCS. It makes possible for apps to access eSE of Samsung mobile devi...", safety: "safe" }, + { pkg: "com.samsung.visionprovider", label: "Visionprovider", description: "Provider for Bixby Vision (com.samsung.android.visionintelligence)", safety: "safe" }, + { pkg: "com.samsung.voiceserviceplatform", label: "Voiceserviceplatform", description: "Samsung Voice (for Galaxy S7)", safety: "safe" }, + { pkg: "com.samsung.vvm.se", label: "Se", description: "Samsung Verizon Voicemail", safety: "safe" }, + { pkg: "com.sec.allsharecastplayer", label: "Allsharecastplayer", description: "Screen Mirroring (only in Galaxy S6)", safety: "safe" }, + { pkg: "com.sec.android.app.apex", label: "Apex", description: "Samsung ApexService", safety: "safe" }, + { pkg: "com.sec.android.app.applinker", label: "Applinker", description: "Related to FeliCa Networks (https://en.wikipedia.org/wiki/FeliCa / https://www.felicanetworks.co.jp/en/).", safety: "safe" }, + { pkg: "com.sec.android.app.billing", label: "Billing", description: "Samsung billing/Checkout", safety: "safe" }, + { pkg: "com.sec.android.app.camera", label: "Camera", description: "Samsung camera app", safety: "caution" }, + { pkg: "com.sec.android.app.bluetoothtest", label: "Bluetoothtest", description: "Bluetooth Test", safety: "safe" }, + { pkg: "com.sec.android.app.chromecustomizations", label: "Chromecustomizations", description: "Samsung stuff on the homepage of Google Chrome", safety: "safe" }, + { pkg: "com.sec.android.app.DataCreate", label: "Datacreate", description: "Automation Test", safety: "safe" }, + { pkg: "com.sec.android.app.desktoplauncher", label: "Desktoplauncher", description: "Samsung DeX Home (launcher)", safety: "safe" }, + { pkg: "com.sec.android.diagmonagent", label: "Diagmonagent", description: "Diagnostic Monitoring Agent", safety: "safe" }, + { pkg: "com.sec.android.app.dictionary", label: "Dictionary", description: "Samsung Dictionary is is an app that enables you to manage all the dictionaries stored on your Samsung device.", safety: "safe" }, + { pkg: "com.sec.android.app.easysetup", label: "Easysetup", description: "Core of Samsung SmartThings (formerly Samsung Easy Setup)", safety: "safe" }, + { pkg: "com.sec.android.app.factorykeystring", label: "Factorykeystring", description: "DeviceKeyString : Dialable hidden diagnostic/debug app", safety: "safe" }, + { pkg: "com.sec.android.app.gamehub", label: "Gamehub", description: "Samsung Game Hub", safety: "safe" }, + { pkg: "com.sec.android.app.hwmoduletest", label: "Hwmoduletest", description: "HwModuleTest, a hardware hidden test app (dial *#0*# to open it).", safety: "safe" }, + { pkg: "com.sec.android.app.magnifier", label: "Magnifier", description: "Lets you use your device as a magnifying glass making it easier to read any small font or expand the detail...", safety: "safe" }, + { pkg: "com.sec.android.app.mt", label: "Mt", description: "Mobile tracker security feature. If someone inserts a new SIM card in your device the device will automatic...", safety: "safe" }, + { pkg: "com.sec.android.app.ocr", label: "Ocr", description: "Optical Read (feature replaced by Bixby Vision : com.samsung.android.visionintelligence)", safety: "safe" }, + { pkg: "com.sec.android.app.parser", label: "Parser", description: "DRParser Mode", safety: "safe" }, + { pkg: "com.sec.android.app.quicktool", label: "Quicktool", description: "The Quick Tools panel includes a ruler, a compass and a torch. To add this to the Edge Panel (com.samsung.a...", safety: "safe" }, + { pkg: "com.sec.android.app.ringtoneBR", label: "Ringtonebr", description: "Samsung ringtone backup/restore feature", safety: "safe" }, + { pkg: "com.sec.android.app.samsungapps", label: "Samsungapps", description: "Samsung Galaxy Store", safety: "safe", neededBy: ["com.samsung.android.spay"] }, + { pkg: "com.sec.android.app.safetyassurance", label: "Safetyassurance", description: "Safety assurance is related to emergency features. It is especially used for SOS messages.", safety: "caution" }, + { pkg: "com.sec.android.app.sbrowser", label: "Sbrowser", description: "Samsung web browser (https://play.google.com/store/apps/details?id=com.sec.android.app.sbrowser)", safety: "safe" }, + { pkg: "com.sec.android.app.sbrowser.lite", label: "Lite", description: "Samsung web browser lite", safety: "safe" }, + { pkg: "com.sec.android.app.scloud", label: "Scloud", description: "I guess it's the core of Samsung scloud.", safety: "safe" }, + { pkg: "com.sec.android.app.SecSetupWizard", label: "Secsetupwizard", description: "Samsung Setup Wizard", safety: "safe" }, + { pkg: "com.sec.android.app.servicemodeapp", label: "Servicemodeapp", description: "SysDump hidden app", safety: "safe" }, + { pkg: "com.sec.android.app.setupwizardlegalprovider", label: "Setupwizardlegalprovider", description: "SetupWizardLegalProvider", safety: "safe" }, + { pkg: "com.sec.android.app.shealth", label: "Shealth", description: "Samsung Health (https://play.google.com/store/apps/details?id=com.sec.android.app.shealth)", safety: "safe" }, + { pkg: "com.sec.android.app.sns3", label: "Sns3", description: "Samsung Galaxy (Only installed on older phone before Galaxy S7)", safety: "safe" }, + { pkg: "com.sec.android.app.setupwizard", label: "Setupwizard", description: "Samsung Setupwizard", safety: "safe" }, + { pkg: "com.sec.android.app.suwscriptplayer", label: "Suwscriptplayer", description: "SuwScriptPlayer", safety: "safe" }, + { pkg: "com.sec.android.app.sysscope", label: "Sysscope", description: "Checks after every boot if the ROM and kernel have been modified. This package is only present on Verizon-l...", safety: "safe" }, + { pkg: "com.sec.android.app.translator", label: "Translator", description: "Samsung Translater (S Translater)", safety: "safe" }, + { pkg: "com.sec.android.app.voicenote", label: "Voicenote", description: "Samsung Voice recorder (https://play.google.com/store/apps/details?id=com.sec.android.app.voicenote)", safety: "safe" }, + { pkg: "com.sec.android.app.withtv", label: "Withtv", description: "Samsung Smart View", safety: "safe" }, + { pkg: "com.sec.android.app.wlantest", label: "Wlantest", description: "wlan test", safety: "safe" }, + { pkg: "com.sec.android.AutoPreconfig", label: "Autopreconfig", description: "Auto Preconfig", safety: "safe" }, + { pkg: "com.sec.android.cover.ledcover", label: "Ledcover", description: "Samsung LED cover service", safety: "safe" }, + { pkg: "com.sec.android.daemonapp", label: "Daemonapp", description: "Unified Daemon app", safety: "safe" }, + { pkg: "com.sec.android.desktopcommunity", label: "Desktopcommunity", description: "Samsung DeX panel", safety: "safe" }, + { pkg: "com.sec.android.desktopmode.uiservice", label: "Uiservice", description: "Samsung DeX", safety: "safe" }, + { pkg: "com.sec.android.app.dexonpc", label: "Dexonpc", description: "Samsung DeX", safety: "safe" }, + { pkg: "com.sec.android.easyMover", label: "Easymover", description: "Samsung Smart Switch Mobile (https://play.google.com/store/apps/details?id=com.sec.android.easyMover)", safety: "safe" }, + { pkg: "com.sec.android.easyMover.Agent", label: "Agent", description: "Smart Switch Agent", safety: "safe" }, + { pkg: "com.sec.android.easyonehand", label: "Easyonehand", description: "Samsung Easy One Hand mode", safety: "safe" }, + { pkg: "com.sec.android.fido.uaf.asm", label: "Asm", description: "Fido is a set of open technical specifications for mechanisms of authenticating users to online services th...", safety: "safe" }, + { pkg: "com.sec.android.fido.uaf.client", label: "Client", description: "Fido UAF client. It's a layer that connects authenticator and RP (the application owner) and ensures validi...", safety: "safe" }, + { pkg: "com.sec.android.game.gamehome", label: "Gamehome", description: "Samsung Game launcher", safety: "safe" }, + { pkg: "com.sec.android.mimage.avatarstickers", label: "Avatarstickers", description: "Samsung My Emoji Stickers", safety: "safe" }, + { pkg: "com.sec.android.mimage.gear360editor", label: "Gear360Editor", description: "360 Photo Editor", safety: "safe" }, + { pkg: "com.sec.android.preloadinstaller", label: "Preloadinstaller", description: "Very shady apk. According to if you're chinese or not, Samsung mount an hidden partition during the first b...", safety: "safe" }, + { pkg: "com.sec.android.providers.security", label: "Security", description: "Provider of password security policies?", safety: "safe" }, + { pkg: "com.sec.android.provider.snote", label: "Snote", description: "Content provider for S Note (https://www.samsung.com/global/galaxy/apps/samsung-notes/).", safety: "safe" }, + { pkg: "com.sec.android.RilServiceModeApp", label: "Rilservicemodeapp", description: "Service mode RIL hidden app. Used for debug and diagnostics", safety: "safe" }, + { pkg: "com.sec.android.service.health", label: "Health", description: "Samsung Health Service", safety: "safe" }, + { pkg: "com.sec.android.sidesync30", label: "Sidesync30", description: "SideSync (discontinued)", safety: "safe" }, + { pkg: "com.sec.android.splitsound", label: "Splitsound", description: "SplitSoundService", safety: "caution" }, + { pkg: "com.sec.android.uibcvirtualsoftkey", label: "Uibcvirtualsoftkey", description: "UIBC (User input back channel)", safety: "safe" }, + { pkg: "com.sec.android.widgetapp.diotek.smemo", label: "Smemo", description: "Samsung Memo widget (was replaced by Samsung Note : com.samsung.android.app.notes)", safety: "safe" }, + { pkg: "com.sec.android.widgetapp.easymodecontactswidget", label: "Easymodecontactswidget", description: "Favourite Contacts widget", safety: "safe" }, + { pkg: "com.sec.android.widgetapp.samsungapps", label: "Samsungapps", description: "Galaxy Essential widget", safety: "safe" }, + { pkg: "com.sec.android.widgetapp.webmanual", label: "Webmanual", description: "User Manual", safety: "safe" }, + { pkg: "com.sec.app.RilErrorNotifier", label: "Rilerrornotifier", description: "RilNotifier", safety: "safe" }, + { pkg: "com.sec.bcservice", label: "Bcservice", description: "Broadcast Service", safety: "safe" }, + { pkg: "com.sec.downloadablekeystore", label: "Downloadablekeystore", description: "Keystore is a secure place provided by Android to store cryptographic keys and make it more difficult to ex...", safety: "safe" }, + { pkg: "com.sec.enterprise.knox.attestation", label: "Attestation", description: "KNOX Attestation", safety: "safe" }, + { pkg: "com.sec.enterprise.knox.cloudmdm.smdms", label: "Smdms", description: "Knox Enrollment Service", safety: "safe" }, + { pkg: "com.sec.enterprise.knox.shareddevice.keyguard", label: "Keyguard", description: "KNOX shared device keyguard.", safety: "safe" }, + { pkg: "com.sec.enterprise.mdm.services.simpin", label: "Simpin", description: "Entreprise Sim Pin Service", safety: "safe" }, + { pkg: "com.sec.enterprise.mdm.vpn", label: "Vpn", description: "Entreprise VPN service", safety: "safe" }, + { pkg: "com.sec.epdgtestapp", label: "Epdgtestapp", description: "Test app for ePDG (see com.sec.epdg)", safety: "safe" }, + { pkg: "com.sec.everglades", label: "Everglades", description: "Samsung Hub (discontinued)", safety: "safe" }, + { pkg: "com.sec.everglades.update", label: "Update", description: "SamsungHub Updater (discontinued - See above)", safety: "safe" }, + { pkg: "com.sec.factory", label: "Factory", description: "Device Test app", safety: "safe" }, + { pkg: "com.sec.factory.camera", label: "Camera", description: "Camera Test (dial *#34971539# to open CameraFirmware Standard)", safety: "safe" }, + { pkg: "com.sec.factory.iris.usercamera", label: "Usercamera", description: "Camera Iris User Test (by dialing *#0*#)", safety: "safe" }, + { pkg: "com.sec.hiddenmenu", label: "Hiddenmenu", description: "IOTHiddenMenu", safety: "safe" }, + { pkg: "com.sec.imslogger", label: "Imslogger", description: "IMS Logger provides logging opt-ins.", safety: "safe" }, + { pkg: "com.sec.kidsplat.installer", label: "Installer", description: "Kids Mode (replaced by Kids Home : com.samsung.android.kidsinstaller)", safety: "safe" }, + { pkg: "com.sec.knox.bluetooth", label: "Bluetooth", description: "KNOX bluetooth", safety: "safe" }, + { pkg: "com.sec.knox.bridge", label: "Bridge", description: "Debug Bridge ?", safety: "safe" }, + { pkg: "com.sec.knox.containeragent2", label: "Containeragent2", description: "Samsung Knox Container (v2 ?)", safety: "safe" }, + { pkg: "com.sec.knox.foldercontainer", label: "Foldercontainer", description: "Needed by KNOX Secure folder (com.samsung.knox.securefolder)", safety: "safe" }, + { pkg: "com.sec.knox.knoxsetupwizardclient", label: "Knoxsetupwizardclient", description: "KNOX SetupWizardClient", safety: "safe" }, + { pkg: "com.sec.knox.packageverifier", label: "Packageverifier", description: "KNOX Verifier", safety: "safe" }, + { pkg: "com.sec.knox.shortcutsms", label: "Shortcutsms", description: "Knox shortcut to switch to workspace", safety: "safe" }, + { pkg: "com.sec.knox.switchknoxII", label: "Switchknoxii", description: "Handles switches between KNOW/Work container and personal profile.", safety: "safe" }, + { pkg: "com.sec.knox.switchknoxI", label: "Switchknoxi", description: "Handles switches between KNOW/Work container and personal profile.", safety: "safe" }, + { pkg: "com.sec.knox.switchknox", label: "Switchknox", description: "Handles switches between KNOW/Work container and personal profile.", safety: "safe" }, + { pkg: "com.sec.location.nsflp2", label: "Nsflp2", description: "Samsung Location", safety: "safe" }, + { pkg: "com.sec.mldapchecker", label: "Mldapchecker", description: "MLDAP log", safety: "safe" }, + { pkg: "com.sec.modem.settings", label: "Settings", description: "Name : SilentLogging", safety: "safe" }, + { pkg: "com.sec.phone", label: "Phone", description: "another test/debug app used to test the proper functioning of phone calls.", safety: "safe" }, + { pkg: "com.sec.readershub", label: "Readershub", description: "Samsung Books (discontinued)", safety: "safe" }, + { pkg: "com.sec.smartcard.manager", label: "Manager", description: "Smart Card Manager", safety: "safe" }, + { pkg: "com.sec.spp.push", label: "Push", description: "Samsung Push Service (https://play.google.com/store/apps/details?id=com.sec.spp.push)", safety: "safe" }, + { pkg: "com.sec.sve", label: "Sve", description: "SecVideoEngineService is arguably a Samsung video engine service (handle enconding/decoding ?) for displayi...", safety: "caution" }, + { pkg: "com.sec.yosemite.phone", label: "Phone", description: "Samsung WatchON (discontinued)", safety: "safe" }, + { pkg: "com.sec.usbsettings", label: "Usbsettings", description: "USBSettings", safety: "safe" }, + { pkg: "com.samsung.advp.imssettings", label: "Imssettings", description: "Needed for VoLTE (Voice over LTE) https://en.wikipedia.org/wiki/Voice_over_LTE", safety: "caution" }, + { pkg: "com.samsung.accessibility", label: "Accessibility", description: "Accessibility settings (useful for apps creating virtual buttons such as a pie-menu)", safety: "caution" }, + { pkg: "com.samsung.android.allshare.service.fileshare", label: "Fileshare", description: "Wi-Fi Direct", safety: "caution" }, + { pkg: "com.samsung.android.app.amcagent", label: "Amcagent", description: "Advanced Management Console Agent", safety: "caution" }, + { pkg: "com.samsung.android.app.aodservice", label: "Aodservice", description: "Always On Display", safety: "caution" }, + { pkg: "com.samsung.android.app.galaxyfinder", label: "Galaxyfinder", description: "S Finder is a search application that allows you to find what you want in an instant by searching the conte...", safety: "caution" }, + { pkg: "com.samsung.android.app.motionpanoramaviewer", label: "Motionpanoramaviewer", description: "Motion panorama viewer", safety: "caution" }, + { pkg: "com.samsung.android.app.selfmotionpanoramaviewer", label: "Selfmotionpanoramaviewer", description: "Selfie panorama viewer", safety: "caution" }, + { pkg: "com.samsung.android.app.smartcapture", label: "Smartcapture", description: "Samsung screenshot", safety: "caution" }, + { pkg: "com.sec.android.app.soundalive", label: "Soundalive", description: "Responsible for Dolby Atmos and other pre-programmed equalizer stuff (accessible from the Settings app)", safety: "safe" }, + { pkg: "com.samsung.android.mcfserver", label: "Mcfserver", description: "Samsung Multi Connectivity (starting from Galaxy S20)", safety: "caution" }, + { pkg: "com.samsung.app.newtrim", label: "Newtrim", description: "Samsung Video trimmer", safety: "caution" }, + { pkg: "com.sec.epdg", label: "Epdg", description: "Huh... that's hard to explain quickly. Let's try :", safety: "caution" }, + { pkg: "com.samsung.android.app.multiwindow", label: "Multiwindow", description: "Provides manifestly the ability to display multiple apps on the screen (at the same time)", safety: "caution" }, + { pkg: "com.samsung.android.bio.face.service", label: "Service", description: "Handles Face recognition unlock", safety: "caution" }, + { pkg: "com.samsung.android.biometrics", label: "Biometrics", description: "Provide biometric support", safety: "caution" }, + { pkg: "com.samsung.android.biometrics.app.setting", label: "Setting", description: "Biometric settings", safety: "caution" }, + { pkg: "com.samsung.android.bluelightfilter", label: "Bluelightfilter", description: "Blue light filter", safety: "caution" }, + { pkg: "com.samsung.android.app.contacts", label: "Contacts", description: "Samsung contacts app", safety: "caution" }, + { pkg: "com.samsung.android.fingerprint.service", label: "Service", description: "Fingerprint service", safety: "caution" }, + { pkg: "com.samsung.android.lool", label: "Lool", description: "Samsung Device Care (phone optimizer) (https://play.google.com/store/apps/details?id=com.samsung.android.lool)", safety: "caution" }, + { pkg: "com.samsung.android.messaging", label: "Messaging", description: "Samsung Messaging app", safety: "caution" }, + { pkg: "com.samsung.android.provider.stickerprovider", label: "Stickerprovider", description: "One more package related to camera stickers.", safety: "caution" }, + { pkg: "com.samsung.android.sm.devicesecurity", label: "Devicesecurity", description: "Samsung Device security for the Smart Manager app using McAfee antivirus engine.", safety: "caution" }, + { pkg: "com.samsung.android.server.iris", label: "Iris", description: "Provides iris recognition feature", safety: "caution" }, + { pkg: "com.samsung.android.smartfitting", label: "Smartfitting", description: "Smart Fitting Service", safety: "safe" }, + { pkg: "com.samsung.android.spdclient", label: "Spdclient", description: "Security policy updates (part of KNOX)", safety: "caution" }, + { pkg: "com.samsung.android.tadownloader", label: "Tadownloader", description: "Seems to check if a trusted application needs an update and downloads it.", safety: "caution" }, + { pkg: "com.samsung.android.tapack.authfw", label: "Authfw", description: "AuthFw TaPack", safety: "caution" }, + { pkg: "com.samsung.android.video", label: "Video", description: "Samsung Video Player", safety: "caution", deps: ["com.samsung.android.smartmirroring"] }, + { pkg: "com.samsung.app.slowmotion", label: "Slowmotion", description: "Slowmotion mode in camera app", safety: "caution" }, + { pkg: "com.samsung.sec.android.application.csc", label: "Csc", description: "Do something related to Country Specific Code (CSC). Maybe it only let you change your CSC", safety: "caution" }, + { pkg: "com.samsung.upsmtheme", label: "Upsmtheme", description: "Handle the theme of UPSM (Ultra Power Saving Mode)", safety: "caution" }, + { pkg: "com.samsung.clipboardsaveservice", label: "Clipboardsaveservice", description: "Clipboard Save service saves all the content you saved in the clipboard (clipboard history)", safety: "caution" }, + { pkg: "com.samsung.cmh", label: "Cmh", description: "CMH Provider is a dependency for the the samsung gallery app. This package asks for a lot of permissions.", safety: "caution" }, + { pkg: "com.samsung.dcmservice", label: "Dcmservice", description: "Hard to find what it really does but I do know what DCM is in telecommunication. It means Dual Carrier Modu...", safety: "caution" }, + { pkg: "com.samsung.sdm", label: "Sdm", description: "Handles OTA system Updates.", safety: "caution" }, + { pkg: "com.samsung.sdm.sdmviewer", label: "Sdmviewer", description: "Lets you view installed updates?", safety: "caution" }, + { pkg: "com.samsung.tmowfc.wfcpref", label: "Wfcpref", description: "Wifi Calling for T-mobile clients only! (tmowfc = t-mobile only wifi calling)", safety: "caution" }, + { pkg: "com.samsung.android.app.dofviewer", label: "Dofviewer", description: "Live focus", safety: "caution" }, + { pkg: "com.sec.android.app.fm", label: "Fm", description: "Samsung Radio", safety: "caution" }, + { pkg: "com.sec.android.app.launcher", label: "Launcher", description: "Samsung One UI Home launcher (homescreen) (https://play.google.com/store/apps/details?id=com.sec.android.ap...", safety: "caution" }, + { pkg: "com.sec.android.app.clockpackage", label: "Clockpackage", description: "Samsung clock", safety: "caution" }, + { pkg: "com.sec.android.app.myfiles", label: "Myfiles", description: "Samsung file manager app (https://play.google.com/store/apps/details?id=com.sec.android.app.myfiles)", safety: "caution" }, + { pkg: "com.sec.android.app.personalization", label: "Personalization", description: "Has something to do with personalization?", safety: "caution" }, + { pkg: "com.sec.android.app.popupcalculator", label: "Popupcalculator", description: "Samsung calculator app (https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator)", safety: "caution" }, + { pkg: "com.sec.android.emergencylauncher", label: "Emergencylauncher", description: "Samsung Launcher when in emergency(low battery) mode.", safety: "caution" }, + { pkg: "com.sec.android.app.vepreload", label: "Vepreload", description: "Samsung video editor", safety: "caution" }, + { pkg: "com.sec.android.inputmethod.beta", label: "Beta", description: "Samsung Keyboard Neural Beta", safety: "caution" }, + { pkg: "com.sec.android.emergencymode.service", label: "Service", description: "Emergency mode enables you to extend your device\u2019s standby time when in an emergency situation and want you...", safety: "caution" }, + { pkg: "com.sec.android.gallery3d", label: "Gallery3D", description: "Samsung Gallery app (https://play.google.com/store/apps/details?id=com.sec.android.gallery3d)", safety: "caution" }, + { pkg: "com.sec.android.gallery3d.panorama360view", label: "Panorama360View", description: "Let you see panoramic photos in the samsung Gallery.", safety: "caution" }, + { pkg: "com.samsung.android.honeyboard", label: "Honeyboard", description: "Samsung keyboard", safety: "caution" }, + { pkg: "com.sec.android.mimage.photoretouching", label: "Photoretouching", description: "Samsung Photo Editor", safety: "caution" }, + { pkg: "com.sec.android.ofviewer", label: "Ofviewer", description: "Samsung selective focus camera mode.", safety: "caution" }, + { pkg: "com.sec.android.provider.badge", label: "Badge", description: "Provider for the notification badges (which are not very useful IMHO)", safety: "caution" }, + { pkg: "com.sec.android.provider.emergencymode", label: "Emergencymode", description: "Provider for emergency mode (com.sec.android.emergencylauncher)", safety: "caution" }, + { pkg: "com.sec.android.sdhms", label: "Sdhms", description: "Samsung Device Health Manager Service", safety: "caution" }, + { pkg: "com.sec.android.wallpapercropper2", label: "Wallpapercropper2", description: "Samsung Wallpaper. Needed to set a wallpaper on the launcher.", safety: "caution" }, + { pkg: "com.sec.imsservice", label: "Imsservice", description: "IMS(Ip Multimedia Subsystem) is an open industry standard for voice and multimedia communications over pack...", safety: "caution" }, + { pkg: "com.sec.automation", label: "Automation", description: "Tethering Automation enables sharing phone internet to the PC with a usb cable.", safety: "caution" }, + { pkg: "com.sec.hearingadjust", label: "Hearingadjust", description: "Samsung Adapt Sound", safety: "safe" }, + { pkg: "com.sec.ims", label: "Ims", description: "IMS(Ip Multimedia Subsystem) is an open industry standard for voice and multimedia communications over pack...", safety: "caution" }, + { pkg: "com.sec.internal.vsim.VSimServiceApp", label: "Vsimserviceapp", description: "Non Sim Device Solution (NSDS) needed for VoLTE and VoWifi (Wifi Calling) if you have a virtual SIM.", safety: "caution" }, + { pkg: "com.sec.vsimservice", label: "Vsimservice", description: "VSim Service", safety: "caution" }, + { pkg: "com.sec.vsim.ericssonnsds.webapp", label: "Webapp", description: "NSDSWebApp.", safety: "safe" }, + { pkg: "com.sec.svoice.lang.en_GB", label: "En Gb", description: "Language Pack for S-voice, the Samsung assistant (com.samsung.android.svoice)", safety: "safe" }, + { pkg: "com.samsung.android.applock", label: "Applock", description: "Samsung App Lock", safety: "keep" }, + { pkg: "com.samsung.android.SettingsReceiver", label: "Settingsreceiver", description: "Samsung overlay of AOSP Settings. It has 39 permissions. Handles interactions with features controled by th...", safety: "keep" }, + { pkg: "com.samsung.android.timezone.data_Q", label: "Data Q", description: "Stores timezone data?", safety: "keep" }, + { pkg: "com.samsung.android.timezone.data.P", label: "P", description: "Samsung timezone data?", safety: "keep" }, + { pkg: "com.samsung.android.timezone.autoupdate_O", label: "Autoupdate O", description: "Samsung Time Zone Updater", safety: "keep" }, + { pkg: "com.samsung.android.timezone.data.updater", label: "Updater", description: "Samsung Time Zone Updater", safety: "keep" }, + { pkg: "com.samsung.android.app.soundpicker", label: "Soundpicker", description: "Lets you select a sound for alarm/ringtone", safety: "keep" }, + { pkg: "com.samsung.android.clipboarduiservice", label: "Clipboarduiservice", description: "User interface for clipboard", safety: "keep" }, + { pkg: "com.samsung.android.communicationservice", label: "Communicationservice", description: "Message Service.", safety: "keep" }, + { pkg: "com.samsung.android.incallui", label: "Incallui", description: "UI when \"being called/in call\". It's basically the screen that shows you who is calling, lets you answer an...", safety: "keep" }, + { pkg: "com.samsung.android.MtpApplication", label: "Mtpapplication", description: "Samsung overlay for MTP. Talks to com.android.mtp", safety: "keep" }, + { pkg: "com.samsung.android.provider.filterprovider", label: "Filterprovider", description: "FilterProvider dependency to Samsung Camera", safety: "caution" }, + { pkg: "com.samsung.networkui", label: "Networkui", description: "User interface of the Mobile Network settings", safety: "keep" }, + { pkg: "com.samsung.android.sm.policy", label: "Policy", description: "SPCM (Striped Phase Change Memory ?) client.", safety: "keep" }, + { pkg: "com.sec.android.app.simsettingmgr", label: "Simsettingmgr", description: "SIM card manager.", safety: "keep" }, + { pkg: "com.samsung.android.sume.nn.service", label: "Service", description: "Provides the photo remaster feature in the Gallery app. Has the camera permission and can access all your m...", safety: "caution" }, + { pkg: "com.samsung.android.privateshare", label: "Privateshare", description: "Blockchain-powered file sharing system for Samsung phones.", safety: "safe" }, + { pkg: "com.samsung.android.airtel.stubapp", label: "Stubapp", description: "My Airtel Stub app", safety: "safe" }, + { pkg: "com.samsung.android.app.camera.sticker.facear.preload", label: "Preload", description: "Annoying Stickers/stamps of the Samsung camera app. C'mon it feels like Snapshat.", safety: "safe" }, + { pkg: "com.samsung.android.app.camera.sticker.facear3d.preload", label: "Preload", description: "Default 3D live stickers", safety: "safe" }, + { pkg: "com.samsung.android.app.camera.sticker.facearavatar.preload", label: "Preload", description: "Annoying Stickers/stamps of the Samsung camera app. C'mon it feels like Snapshat.", safety: "safe" }, + { pkg: "com.samsung.android.app.ledbackcover", label: "Ledbackcover", description: "I think it enables doing things with LEDs on the cover", safety: "safe" }, + { pkg: "com.samsung.android.app.vrsetupwizards", label: "Vrsetupwizards", description: "Samsung Gear VR (Virtual Reality) setup wizard (https://en.wikipedia.org/wiki/Samsung_Gear_VR)", safety: "safe" }, + { pkg: "com.samsung.android.bixby.agent.dummy", label: "Dummy", description: "Bixby Voice Stub", safety: "safe" }, + { pkg: "com.samsung.android.bixby.es.globalaction", label: "Globalaction", description: "Bixby stuff [MORE INFO NEEDED]", safety: "safe" }, + { pkg: "com.samsung.android.bixby.plmsync", label: "Plmsync", description: "Bixby stuff [MORE INFO NEEDED]", safety: "safe" }, + { pkg: "com.samsung.android.bixby.service", label: "Service", description: "Bixby Service", safety: "safe" }, + { pkg: "com.samsung.android.bixby.voiceinput", label: "Voiceinput", description: "Bixby service needed for voice control", safety: "safe" }, + { pkg: "com.samsung.android.bixby.wakeup", label: "Wakeup", description: "Bixby voice wake-up", safety: "safe" }, + { pkg: "com.samsung.android.contacts", label: "Contacts", description: "Samsung contacts app?", safety: "caution" }, + { pkg: "com.samsung.android.knox.containeragent", label: "Containeragent", description: "KNOX Work profile/space", safety: "safe" }, + { pkg: "com.samsung.android.personalpage.service", label: "Service", description: "Private mode (was replaced by Secure Folder)", safety: "safe" }, + { pkg: "com.samsung.hiddennetworksetting", label: "Hiddennetworksetting", description: "Set of hidden network settings (inlcuding frequency band choice).", safety: "caution" }, + { pkg: "com.samsung.systemui.bixby", label: "Bixby", description: "System UI for Bixby/Bixby2", safety: "safe" }, + { pkg: "com.samsung.vvm", label: "Vvm", description: "Samsung Verizon Voicemail", safety: "safe" }, + { pkg: "com.samsung.android.kgclient", label: "Kgclient", description: "Samsung Payment Services", safety: "keep" }, + { pkg: "com.samsung.android.setupindiaservicestnc", label: "Setupindiaservicestnc", description: "Samsung Services", safety: "safe" }, + { pkg: "com.samsung.advancedcallservice", label: "Advancedcallservice", description: "Advanced Calling feature on an Android is a feature that allows you to make calls while using other applica...", safety: "caution" }, + { pkg: "com.samsung.android.mediacontroller", label: "Mediacontroller", description: "Ability to controls phone's audio from your watch.", safety: "caution" }, + { pkg: "com.samsung.android.shealthmonitor", label: "Shealthmonitor", description: "Samsung Health Monitor", safety: "caution" }, + { pkg: "com.samsung.android.watch.cameracontroller", label: "Cameracontroller", description: "Mirrors phone's camera to your watch. I can't find a use case for my usage. Safe to remove.", safety: "safe" }, + { pkg: "com.samsung.android.watch.findmywatch", label: "Findmywatch", description: "The watch will start ringing, if connected to phone via BT or WiFi, when pressing 'start ringing' on the ph...", safety: "caution" }, + { pkg: "com.samsung.android.watch.findmyphone", label: "Findmyphone", description: "The phone will start ringing, if connected to watch via BT or WiFi, when pressing 'start ringing' on the wa...", safety: "caution" }, + { pkg: "com.samsung.android.watch.runestone.app", label: "App", description: "Customization Service from Samsung. Provides customized content and recommendations. Collects a lot of pers...", safety: "safe" }, + { pkg: "com.samsung.android.watch.watchface.analoguefont", label: "Analoguefont", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.animal", label: "Animal", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.aremoji", label: "Aremoji", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.basicclock", label: "Basicclock", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.basicdashboard", label: "Basicdashboard", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.bespoke", label: "Bespoke", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.bitmoji", label: "Bitmoji", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.boldindex", label: "Boldindex", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.digitalfont", label: "Digitalfont", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.digitalmodular", label: "Digitalmodular", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.dualwatch", label: "Dualwatch", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.dynamicfont", label: "Dynamicfont", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.gradientfont", label: "Gradientfont", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.healthmodular", label: "Healthmodular", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.infomodular", label: "Infomodular", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.large", label: "Large", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.livewallpaper", label: "Livewallpaper", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.mypebble", label: "Mypebble", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.myphoto", label: "Myphoto", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.mystyle", label: "Mystyle", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.premiumanalog", label: "Premiumanalog", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.simpleanalogue", label: "Simpleanalogue", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.simplecomplication", label: "Simplecomplication", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.superfiction", label: "Superfiction", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.together", label: "Together", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.typography", label: "Typography", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.weather", label: "Weather", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.analogmodular", label: "Analogmodular", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.simpleclassic", label: "Simpleclassic", description: "Preinstalled watchface.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.emergency", label: "Emergency", description: "Watchface in the emergency launcher.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.companionhelper", label: "Companionhelper", description: "Watchfaces fail to load without this. Removing it also breaks editing and changing watchfaces.", safety: "caution" }, + { pkg: "com.samsung.android.watch.watchface.tickingsound", label: "Tickingsound", description: "Ticking sound on watchfaces that support it.", safety: "caution" }, + { pkg: "com.samsung.android.watch.weather", label: "Weather", description: "Weather application from Samsung.", safety: "safe" }, + { pkg: "com.samsung.android.watch.worldclock", label: "Worldclock", description: "Worldclock app. This also includes a widget, displaying time in different time zones.", safety: "safe" }, + { pkg: "com.samsung.android.wear.blockednumber", label: "Blockednumber", description: "Blocked number storage. Doesn't affect the dialer or contacts.", safety: "caution" }, + { pkg: "com.samsung.android.wear.musictransfer", label: "Musictransfer", description: "Used to sync music with the watch.", safety: "caution" }, + { pkg: "com.samsung.android.wearable.setupwizard", label: "Setupwizard", description: "Samsung Wearable Setup Wizard", safety: "safe" }, + { pkg: "com.samsung.android.wear.contacts.sync", label: "Sync", description: "Handles 'open on phone' events. Also, settings often crash when this is uninstalled.", safety: "caution" }, + { pkg: "com.samsung.android.cidmanager", label: "Cidmanager", description: "In order to ensure that a user\u2019s phone receives the appropriate firmware updates, this app is used to ident...", safety: "caution" }, + { pkg: "com.samsung.packageinstalleroverlay", label: "Packageinstalleroverlay", description: "It's used to display an overlay window when installing or updating apps. Shows information about the app an...", safety: "caution" }, + { pkg: "com.samsung.android.wcs.exstention", label: "Exstention", description: "Samsung Internet Extensions", safety: "caution" }, + { pkg: "com.samsung.android.stextclassifier", label: "Stextclassifier", description: "From https://developer.android.com/reference/android/view/textclassifier/TextClassifier:", safety: "caution" }, + { pkg: "com.sec.android.soagent", label: "Soagent", description: "System application that is responsible for checking and installing software updates.", safety: "caution" }, + { pkg: "com.samsung.packageinstalleroverlay", label: "Packageinstalleroverlay", description: "Most likely the overlay that appears when you installed an application.", safety: "caution" }, + { pkg: "com.samsung.android.service.health", label: "Health", description: "Health Platform (https://play.google.com/store/apps/details?id=com.samsung.android.service.health)", safety: "caution" }, + { pkg: "com.samsung.android.wear.shealth", label: "Shealth", description: "Samsung Health app for WearOS.", safety: "caution" }, + { pkg: "com.samsung.android.wearable.samsungaccount", label: "Samsungaccount", description: "Samsung account settings. Breaks settings app if uninstalled.", safety: "caution" }, + { pkg: "com.samsung.android.watch.stopwatch", label: "Stopwatch", description: "Samsung Stopwatch", safety: "safe" }, + { pkg: "com.samsung.android.watch.screencapture", label: "Screencapture", description: "Provides the ability to take screenshots from the smart watch.", safety: "caution" }, + { pkg: "com.samsung.android.watch.flashlight", label: "Flashlight", description: "Samsung Flashlight", safety: "caution" }, + { pkg: "com.samsung.android.watch.compass", label: "Compass", description: "Samsung Compass app.", safety: "safe" }, + { pkg: "com.samsung.android.watch.alarm", label: "Alarm", description: "Samsung Alarm app.", safety: "safe" }, + { pkg: "com.samsung.android.storage.watchstoragemanager", label: "Watchstoragemanager", description: "Storage manager. DO NOT REMOVE THIS", safety: "keep" }, + { pkg: "com.samsung.android.watch.timer", label: "Timer", description: "Timer app from Samsung.", safety: "safe" }, + { pkg: "com.samsung.android.gallery.watch", label: "Watch", description: "Samsung Watch gallery app", safety: "caution" }, + ], + }, + { + name: "Xiaomi", + packages: [ + { pkg: "com.miui.accessibility", label: "Accessibility", description: "Mi Ditto", safety: "safe" }, + { pkg: "com.miui.audioeffect", label: "Audioeffect", description: "AudioEffect from Xiaomi (https://developer.android.com/reference/android/media/audiofx/AudioEffect)", safety: "safe" }, + { pkg: "com.miui.cit", label: "Cit", description: "Hardware tests", safety: "safe" }, + { pkg: "com.miui.cloudservice", label: "Cloudservice", description: "Mi Cloud Services needed for Mi Cloud", safety: "safe" }, + { pkg: "com.miui.huanji", label: "Huanji", description: "Mi Mover (https://play.google.com/store/apps/details?id=com.miui.huanji)", safety: "safe" }, + { pkg: "com.miui.enbbs", label: "Enbbs", description: "Xiaomi Forums old package.", safety: "safe" }, + { pkg: "com.miui.greenguard", label: "Greenguard", description: "Security Guard Service", safety: "safe" }, + { pkg: "com.miui.hybrid", label: "Hybrid", description: "Quick Apps", safety: "safe" }, + { pkg: "com.miui.hybrid.accessory", label: "Accessory", description: "Xiaomi Hybrid Accessory", safety: "safe" }, + { pkg: "com.miui.micloudsync", label: "Micloudsync", description: "Mi Cloud Sync", safety: "safe" }, + { pkg: "com.miui.miwallpaper", label: "Miwallpaper", description: "Mi Wallpaper", safety: "caution" }, + { pkg: "com.miui.nextpay", label: "Nextpay", description: "Next Pay", safety: "safe" }, + { pkg: "com.miui.qr", label: "Qr", description: "MUI Qr code scanner", safety: "safe" }, + { pkg: "com.miui.smsextra", label: "Smsextra", description: "Dependency for MIUI Messaging (MIUI SMS app misleadingly called com.android.mms)", safety: "safe" }, + { pkg: "com.miui.touchassistant", label: "Touchassistant", description: "Quick Ball/Touch Assistant", safety: "safe" }, + { pkg: "com.miui.translation.xmcloud", label: "Xmcloud", description: "Translation stuff. Does not impact global translation for non-chinesse users.", safety: "safe" }, + { pkg: "com.miui.translationservice", label: "Translationservice", description: "Translation stuff. Does not impact global translation for non-chinesse users.", safety: "safe" }, + { pkg: "com.miui.userguide", label: "Userguide", description: "Xiaomi User guide", safety: "safe" }, + { pkg: "com.miui.analytics", label: "Analytics", description: "Xiaomi Analytics", safety: "safe" }, + { pkg: "com.miui.android.fashiongallery", label: "Fashiongallery", description: "Mi Wallpaper Carousel (https://play.google.com/store/apps/details?id=com.miui.android.fashiongallery)", safety: "safe" }, + { pkg: "com.miui.antispam", label: "Antispam", description: "MIUI Antispam", safety: "safe" }, + { pkg: "com.miui.backup", label: "Backup", description: "MIUI Backup", safety: "safe" }, + { pkg: "com.miui.bugreport", label: "Bugreport", description: "Mi Feedback", safety: "safe" }, + { pkg: "com.miui.cleanmaster", label: "Cleanmaster", description: "Mi Cleaner", safety: "safe" }, + { pkg: "com.miui.cleaner", label: "Cleaner", description: "Mi Cleaner", safety: "safe" }, + { pkg: "com.miui.cloudbackup", label: "Cloudbackup", description: "Mi Cloud backup", safety: "safe" }, + { pkg: "com.miui.cloudservice.sysbase", label: "Sysbase", description: "Another Mi Cloud dependency", safety: "safe" }, + { pkg: "com.miui.compass", label: "Compass", description: "Mi Compass", safety: "safe" }, + { pkg: "com.miui.contentcatcher", label: "Contentcatcher", description: "Application Extension Service", safety: "safe" }, + { pkg: "com.miui.daemon", label: "Daemon", description: "MIUI daemon", safety: "safe" }, + { pkg: "com.miui.fm", label: "Fm", description: "MIUI FM Radio app", safety: "safe" }, + { pkg: "com.miui.fmservice", label: "Fmservice", description: "FM Radio Service", safety: "safe" }, + { pkg: "com.miui.gallery", label: "Gallery", description: "MIUI Gallery app.", safety: "caution" }, + { pkg: "com.miui.klo.bugreport", label: "Bugreport", description: "KLO Bugreport", safety: "safe" }, + { pkg: "com.miui.miservice", label: "Miservice", description: "Services & feedback", safety: "safe" }, + { pkg: "com.miui.msa.global", label: "Global", description: "Main System Ads", safety: "safe" }, + { pkg: "com.miui.notes", label: "Notes", description: "Mi Notes", safety: "safe" }, + { pkg: "com.miui.personalassistant", label: "Personalassistant", description: "Seems to be App Vault on some phones (https://play.google.com/store/apps/details?id=com.mi.android.globalpe...", safety: "safe" }, + { pkg: "com.miui.phrase", label: "Phrase", description: "Frequent Phrases", safety: "safe" }, + { pkg: "com.miui.player", label: "Player", description: "Mi Music (https://play.google.com/store/apps/details?id=com.miui.player)", safety: "safe" }, + { pkg: "com.miui.providers.weather", label: "Weather", description: "Provider for MI Weather app (com.miui.weather)", safety: "safe" }, + { pkg: "com.miui.screenrecorder", label: "Screenrecorder", description: "Mi Screen Recorder", safety: "safe" }, + { pkg: "com.miui.spock", label: "Spock", description: "Analytics app which constantly runs in background.", safety: "safe" }, + { pkg: "com.miui.systemAdSolution", label: "Systemadsolution", description: "Spyware which analyses user behavior for targeted ads. Yeah Xiaomi phones has ads...", safety: "safe" }, + { pkg: "com.miui.sysopt", label: "Sysopt", description: "SysoptApplication", safety: "safe" }, + { pkg: "com.miui.translation.kingsoft", label: "Kingsoft", description: "Translation stuff by Kingsoft (https://en.wikipedia.org/wiki/Kingsoft)", safety: "safe" }, + { pkg: "com.miui.translation.youdao", label: "Youdao", description: "Translation stufff by Youdao (https://en.wikipedia.org/wiki/Youdao)", safety: "safe" }, + { pkg: "com.miui.video", label: "Video", description: "IMO it's needed by com.miui.videoplayer (confirmation needed)", safety: "safe" }, + { pkg: "com.miui.videoplayer", label: "Videoplayer", description: "Mi Video (https://play.google.com/store/apps/details?id=com.miui.videoplayer)", safety: "safe" }, + { pkg: "com.miui.videoplayer.overlay", label: "Overlay", description: "Mi Video overlay", safety: "caution" }, + { pkg: "com.miui.virtualsim", label: "Virtualsim", description: "Mi Roaming", safety: "safe" }, + { pkg: "com.miui.vsimcore", label: "Vsimcore", description: "Virtual Sim core service", safety: "safe" }, + { pkg: "com.miui.miwallpaper.mars", label: "Mars", description: "SuperWallpaperEARTH / SuperWallpaperMARS", safety: "safe" }, + { pkg: "com.miui.newmidrive", label: "Newmidrive", description: "Mi Drive (Chinese version)", safety: "safe" }, + { pkg: "com.miui.weather2", label: "Weather2", description: "Mi Weather app", safety: "safe" }, + { pkg: "com.miui.yellowpage", label: "Yellowpage", description: "Yellow Page from MIUI.", safety: "safe" }, + { pkg: "com.mi.android.globalpersonalassistant", label: "Globalpersonalassistant", description: "MI Vault aka the \"assistant\" you open swiping left from MI Home", safety: "safe" }, + { pkg: "com.mi.android.globalminusscreen", label: "Globalminusscreen", description: "App Vault (https://play.google.com/store/apps/details?id=com.mi.android.globalminusscreen)", safety: "safe" }, + { pkg: "com.mi.AutoTest", label: "Autotest", description: "Assemble test", safety: "safe" }, + { pkg: "com.xiaomi.mi_connect_service", label: "Mi Connect Service", description: "MiConnectService", safety: "safe" }, + { pkg: "com.mi.global.bbs", label: "Bbs", description: "Mi Community (https://play.google.com/store/apps/details?id=com.mi.global.bbs)", safety: "safe" }, + { pkg: "com.mi.global.shop", label: "Shop", description: "Mi Store (https://play.google.com/store/apps/details?id=com.mi.global.shop)", safety: "safe" }, + { pkg: "com.mi.globalTrendNews", label: "Globaltrendnews", description: "Can't find info about this package", safety: "safe" }, + { pkg: "com.mi.health", label: "Health", description: "Mi Health", safety: "safe" }, + { pkg: "com.mi.liveassistant", label: "Liveassistant", description: "Mi Live Assistant", safety: "safe" }, + { pkg: "com.mi.setupwizardoverlay", label: "Setupwizardoverlay", description: "Weird package related to the SetupWizard (the menu which assists you to setup your phone for the first time)", safety: "safe" }, + { pkg: "com.mi.webkit.core", label: "Core", description: "MI WebView", safety: "safe" }, + { pkg: "com.xiaomi.ab", label: "Ab", description: "MAB", safety: "safe" }, + { pkg: "com.xiaomi.account", label: "Account", description: "Mi Account", safety: "caution" }, + { pkg: "com.xiaomi.channel", label: "Channel", description: "Mi Talk", safety: "safe" }, + { pkg: "com.xiaomi.gamecenter.sdk.service", label: "Service", description: "Game Service", safety: "safe" }, + { pkg: "com.xiaomi.joyose", label: "Joyose", description: "Joyse Analytics and advertising", safety: "safe" }, + { pkg: "com.xiaomi.jr", label: "Jr", description: "Help you getting loans when shopping.", safety: "safe" }, + { pkg: "com.xiaomi.lens", label: "Lens", description: "Related to camera app ?", safety: "safe" }, + { pkg: "com.xiaomi.midrop", label: "Midrop", description: "Share Me (Mi Drop) (https://play.google.com/store/apps/details?id=com.xiaomi.midrop)", safety: "safe" }, + { pkg: "com.xiaomi.macro", label: "Macro", description: "MiMacro is an automation task from Xiaomi like touch on MIUI Game Turbo.", safety: "safe" }, + { pkg: "com.xiaomi.midrop.overlay", label: "Overlay", description: "Mi Drop overlay", safety: "caution" }, + { pkg: "com.xiaomi.mipicks", label: "Mipicks", description: "Mi Picks (becomed Mi Apps Store and now Get Apps -- Xiaomi app store)", safety: "safe" }, + { pkg: "com.xiaomi.o2o", label: "O2O", description: "o2o = online-to-offline", safety: "safe" }, + { pkg: "com.xiaomi.pass", label: "Pass", description: "Mi Pass is an App allows Xiaomi NFC phones to replace cards and keys in real life usage.", safety: "safe" }, + { pkg: "com.xiaomi.payment", label: "Payment", description: "Old package name for Mi Credit (https://play.google.com/store/apps/details?id=com.micredit.in.gp)", safety: "safe" }, + { pkg: "com.xiaomi.scanner", label: "Scanner", description: "Mi Scanner", safety: "safe" }, + { pkg: "com.xiaomi.shop", label: "Shop", description: "Xiaomi app store (I thinks it's discontinued)", safety: "safe" }, + { pkg: "com.xiaomi.vipaccount", label: "Vipaccount", description: "Xiaomi VIP account", safety: "safe" }, + { pkg: "com.xiaomi.glgm", label: "Glgm", description: "Xiaomi Games", safety: "safe" }, + { pkg: "com.xiaomi.micloud.sdk", label: "Sdk", description: "Mi Cloud sdk", safety: "safe" }, + { pkg: "com.xiaomi.mirecycle", label: "Mirecycle", description: "Mi Recycle", safety: "safe" }, + { pkg: "com.xiaomi.oversea.ecom", label: "Ecom", description: "Xiaomi ShopPlus.", safety: "safe" }, + { pkg: "com.xiaomi.providers.appindex", label: "Appindex", description: "Provider for app index?", safety: "safe" }, + { pkg: "com.xiaomi.upnp", label: "Upnp", description: "UpnpService", safety: "safe" }, + { pkg: "com.xiaomi.simactivate.service", label: "Service", description: "Xiaomi SIM Activation Service", safety: "safe" }, + { pkg: "com.xiaomi.smarthome", label: "Smarthome", description: "Mi Home (https://play.google.com/store/apps/details?id=com.xiaomi.smarthome)", safety: "safe" }, + { pkg: "com.xiaomi.xmsfkeeper", label: "Xmsfkeeper", description: "Xiaomi Service Framework Keeper", safety: "safe" }, + { pkg: "com.miui.wmsvc", label: "Wmsvc", description: "WMService", safety: "caution" }, + { pkg: "com.xiaomi.xmsf", label: "Xmsf", description: "Xiaomi Service Framework", safety: "caution" }, + { pkg: "com.xiaomi.location.fused", label: "Fused", description: "FusedLocationProvider", safety: "keep" }, + { pkg: "com.miui.audiomonitor", label: "Audiomonitor", description: "My guess is this is a feature allowing to control the sound of multiples apps.", safety: "caution" }, + { pkg: "com.miui.calculator", label: "Calculator", description: "MIUI Calculator (https://play.google.com/store/apps/details?id=com.miui.calculator)", safety: "safe" }, + { pkg: "com.miui.face", label: "Face", description: "MIUI Biometric", safety: "caution" }, + { pkg: "com.miui.freeform", label: "Freeform", description: "Floating window", safety: "caution" }, + { pkg: "com.miui.home", label: "Home", description: "MIUI System Launcher", safety: "caution" }, + { pkg: "com.mi.globallayout", label: "Globallayout", description: "Home Layout", safety: "caution" }, + { pkg: "com.miui.mishare.connectivity", label: "Connectivity", description: "Mi Share", safety: "caution" }, + { pkg: "com.miui.misound", label: "Misound", description: "Earphones (it's the name of the app)", safety: "caution" }, + { pkg: "com.miui.notification", label: "Notification", description: "Notifications are working without this app.", safety: "caution" }, + { pkg: "com.miui.powerkeeper", label: "Powerkeeper", description: "Battery and Performance", safety: "caution" }, + { pkg: "com.miui.zman", label: "Zman", description: "Mi Secure sharing", safety: "caution" }, + { pkg: "com.mi.android.globalFileexplorer", label: "Globalfileexplorer", description: "Xiaomi Files Manager (https://play.google.com/store/apps/details?id=com.mi.android.globalFileexplorer)", safety: "caution" }, + { pkg: "com.xiaomi.bluetooth.overlay", label: "Overlay", description: "MIUI Bluetooth Control.", safety: "caution" }, + { pkg: "com.xiaomi.bsp.gps.nps", label: "Nps", description: "GPS location", safety: "caution" }, + { pkg: "com.miui.core", label: "Core", description: "MIUI SDK", safety: "keep" }, + { pkg: "com.miui.global.packageinstaller", label: "Packageinstaller", description: "The security check / virus scan that runs after package installation.", safety: "caution" }, + { pkg: "com.miui.guardprovider", label: "Guardprovider", description: "Guard Provider security app", safety: "caution" }, + { pkg: "com.miui.systemui.carriers.overlay", label: "Overlay", description: "MIUI User interface for MCC/MNC configuration", safety: "caution" }, + { pkg: "com.miui.systemui.overlay.devices.android", label: "Android", description: "MIUI User interface for 'device' settings?", safety: "caution" }, + { pkg: "com.xiaomi.discover", label: "Discover", description: "System Apps Updater", safety: "caution" }, + { pkg: "com.xiaomi.powerchecker", label: "Powerchecker", description: "Power Detector", safety: "caution" }, + { pkg: "com.xiaomi.miplay_client", label: "Miplay Client", description: "MiPlay Client", safety: "caution" }, + { pkg: "com.xiaomi.finddevice", label: "Finddevice", description: "Find My Device feature (in the Settings)", safety: "keep" }, + { pkg: "com.miui.securitycenter", label: "Securitycenter", description: "MIUI Security app", safety: "keep" }, + { pkg: "com.miui.securitycore", label: "Securitycore", description: "Core features of the \"com.miui.securitycenter\"", safety: "keep" }, + { pkg: "com.miui.system", label: "System", description: "Called 'MIUI System Launcher' but it's not the launcher itself (com.miui.home is)", safety: "keep" }, + { pkg: "com.miui.rom", label: "Rom", description: "Core package of MIUI", safety: "keep" }, + { pkg: "com.miui.securityadd", label: "Securityadd", description: "Related to the MIUI Security app", safety: "keep" }, + { pkg: "com.xiaomi.misettings", label: "Misettings", description: "Xiaomi Settings app", safety: "keep" }, + { pkg: "com.miui.miwallpaper.earth", label: "Earth", description: "SuperWallpaperEARTH / SuperWallpaperMARS", safety: "safe" }, + { pkg: "com.mi.globalbrowser", label: "Globalbrowser", description: "Mi Browser", safety: "safe" }, + { pkg: "com.xiaomi.calendar", label: "Calendar", description: "Mi Calendar. Google trackers inside and needs 48 permissions! Obviously talks to Xiaomi servers. The com.mi...", safety: "safe" }, + ], + }, + { + name: "Huawei", + packages: [ + { pkg: "com.hicloud.android.clone", label: "Clone", description: "Huawei Phone Clone (https://play.google.com/store/apps/details?id=com.hicloud.android.clone)", safety: "safe" }, + { pkg: "com.huawei.android.chr", label: "Chr", description: "HwChrService", safety: "safe" }, + { pkg: "com.huawei.android.FloatTasks", label: "Floattasks", description: "Floating/Navigation dock (also called NaviDot).", safety: "safe" }, + { pkg: "com.huawei.android.hsf", label: "Hsf", description: "Huawei Services Framework", safety: "safe" }, + { pkg: "com.huawei.android.hwpay", label: "Hwpay", description: "Huawei Pay", safety: "safe" }, + { pkg: "com.huawei.android.instantonline", label: "Instantonline", description: "no noticable consequences", safety: "safe" }, + { pkg: "com.huawei.android.instantshare", label: "Instantshare", description: "Huawei Share features.", safety: "safe" }, + { pkg: "com.huawei.android.karaoke", label: "Karaoke", description: "Karaoke mode feature.", safety: "safe" }, + { pkg: "com.huawei.android.mirrorshare", label: "Mirrorshare", description: "MirrorShare feature (Miracast rebranded by Huawei)", safety: "safe" }, + { pkg: "com.huawei.android.pushagent", label: "Pushagent", description: "push notification agent", safety: "safe" }, + { pkg: "com.huawei.android.remotecontroller", label: "Remotecontroller", description: "Huawei Smart Controller app.", safety: "safe" }, + { pkg: "com.huawei.android.tips", label: "Tips", description: "HUAWEI Feature Advisor", safety: "safe" }, + { pkg: "com.huawei.android.totemweatherwidget", label: "Totemweatherwidget", description: "Huawei Weather app (and its widget)", safety: "safe" }, + { pkg: "com.huawei.android.wfdirect", label: "Wfdirect", description: "Wi-Fi Direct feature.", safety: "caution" }, + { pkg: "com.huawei.appmarket", label: "Appmarket", description: "Huawei app store (AppGallery)", safety: "caution" }, + { pkg: "com.huawei.arengine.service", label: "Service", description: "Augmented reality service.", safety: "safe" }, + { pkg: "com.huawei.bd", label: "Bd", description: "HwUE (Huawei UserExperience)", safety: "safe" }, + { pkg: "com.huawei.bluetooth", label: "Bluetooth", description: "Lets you import your contacts via Bluetooth", safety: "safe" }, + { pkg: "com.huawei.browser", label: "Browser", description: "Huawei Browser app. Don't expect privacy using it", safety: "safe" }, + { pkg: "com.huawei.browserhomepage", label: "Browserhomepage", description: "Huawei Browser component.", safety: "safe" }, + { pkg: "com.huawei.compass", label: "Compass", description: "Huawei Compass app.", safety: "safe" }, + { pkg: "com.huawei.contactscamcard", label: "Contactscamcard", description: "CamCard is a business card reader app.", safety: "safe" }, + { pkg: "com.huawei.contacts.sync", label: "Sync", description: "Huawei Contacts sync", safety: "safe" }, + { pkg: "com.huawei.desktop.explorer", label: "Explorer", description: "From XDA thread : \"Service that is been used when you wanna use your phone as an operative system on a PC.\"", safety: "safe" }, + { pkg: "com.huawei.email", label: "Email", description: "Huawei Email app.", safety: "safe" }, + { pkg: "com.huawei.fido.uafclient", label: "Uafclient", description: "UAF client for FIDO.", safety: "safe" }, + { pkg: "com.huawei.game.kitserver", label: "Kitserver", description: "Probably safe to remove if you don't play games", safety: "safe" }, + { pkg: "com.huawei.gameassistant", label: "Gameassistant", description: "Huawei Game Suite (HiGame).", safety: "safe" }, + { pkg: "com.huawei.geofence", label: "Geofence", description: "GeofenceService.", safety: "safe" }, + { pkg: "com.huawei.hwsearch", label: "Hwsearch", description: "Petal Search widget. Used for finding apps/apks on serveral online sources (introduced after Google Mobile ...", safety: "safe" }, + { pkg: "com.huawei.hwid", label: "Hwid", description: "Huawei Mobile Services (https://play.google.com/store/apps/details?id=com.huawei.hwid)", safety: "safe", neededBy: ["com.huawei.fastapp"] }, + { pkg: "com.huawei.hiaction", label: "Hiaction", description: "no noticable consequences", safety: "safe" }, + { pkg: "com.huawei.hiai", label: "Hiai", description: "no noticable consequences", safety: "safe" }, + { pkg: "com.huawei.hiassistantoversea", label: "Hiassistantoversea", description: "HiVoice. Huawei's voice assistant to replace \"Hey Google\"", safety: "safe" }, + { pkg: "com.huawei.hicard", label: "Hicard", description: "Huawei Cards, no noticable consequences", safety: "safe" }, + { pkg: "com.huawei.hicloud", label: "Hicloud", description: "Huawei cloud features", safety: "safe" }, + { pkg: "com.huawei.hifolder", label: "Hifolder", description: "Huawei Online Cloud folder service", safety: "safe" }, + { pkg: "com.huawei.hiviewtunnel", label: "Hiviewtunnel", description: "This displays details/attributes of pictures in the gallery (ISO, exposure time, etc.).", safety: "safe" }, + { pkg: "com.huawei.himovie.overseas", label: "Overseas", description: "Huawei stock video application (https://play.google.com/store/apps/details?id=com.huawei.himovie.overseas)....", safety: "safe" }, + { pkg: "com.huawei.hitouch", label: "Hitouch", description: "Huawei HiTouch", safety: "safe" }, + { pkg: "com.huawei.hwasm", label: "Hwasm", description: "FIDO UAF Autenthicator-Specific Module.", safety: "safe" }, + { pkg: "com.huawei.hwblockchain", label: "Hwblockchain", description: "Probably blockchain related, no noticable consequences when removed", safety: "safe" }, + { pkg: "com.huawei.hwdetectrepair", label: "Hwdetectrepair", description: "Huawei Smart diagnosis (https://play.google.com/store/apps/details?id=com.huawei.hwdetectrepair)", safety: "safe" }, + { pkg: "com.huawei.HwMultiScreenShot", label: "Hwmultiscreenshot", description: "Scrolling screenshot feature", safety: "safe" }, + { pkg: "com.huawei.hwvoipservice", label: "Hwvoipservice", description: "Voice over IP service for Huawei MeeTime (com.huawei.meetime)", safety: "safe", neededBy: ["com.huawei.meetime"] }, + { pkg: "com.huawei.meetime", label: "Meetime", description: "MeeTime (https://consumer.huawei.com/en/support/content/en-us00956296/). Voice and video calling applicatio...", safety: "safe", deps: ["com.huawei.hwvoipservice"] }, + { pkg: "com.huawei.ohos.inputmethod", label: "Inputmethod", description: "Huawei default Keyboard", safety: "caution" }, + { pkg: "com.huawei.mycenter", label: "Mycenter", description: "Huawei Member Center", safety: "safe" }, + { pkg: "com.huawei.maps.app", label: "App", description: "Petal Maps (https://play.google.com/store/apps/details?id=com.huawei.maps.app)", safety: "caution" }, + { pkg: "com.huawei.webview", label: "Webview", description: "Huawei Webview.", safety: "caution" }, + { pkg: "com.huawei.iaware", label: "Iaware", description: "App Prioritizer. Prioritizes apps to avoid slowdown", safety: "safe" }, + { pkg: "com.huawei.ihealth", label: "Ihealth", description: "MotionService package, it's required for actions like shaking the phone to shut off the alarm, ecc.", safety: "safe" }, + { pkg: "com.huawei.intelligent", label: "Intelligent", description: "Huawei Assistant. Shopping recommendations", safety: "safe" }, + { pkg: "com.huawei.health", label: "Health", description: "Huawei Health (https://play.google.com/store/apps/details?id=com.huawei.health)", safety: "safe" }, + { pkg: "com.huawei.magazine", label: "Magazine", description: "Magazine unlock. Downloads wallpapers for your lock screen.", safety: "safe" }, + { pkg: "com.huawei.mirrorlink", label: "Mirrorlink", description: "Huawei Mirror app.", safety: "safe" }, + { pkg: "com.huawei.music", label: "Music", description: "Huawei Music app. Fat music player developed by Huawei (137Mo. Seriously?). There are a lof of better alter...", safety: "safe" }, + { pkg: "com.huawei.parentcontrol", label: "Parentcontrol", description: "Parental controls functions.", safety: "safe" }, + { pkg: "com.huawei.pcassistant", label: "Pcassistant", description: "HiSuite service. Used by HiSuite PC software.", safety: "safe" }, + { pkg: "com.huawei.phoneservice", label: "Phoneservice", description: "HiCare (https://play.google.com/store/apps/details?id=com.huawei.phoneservice)", safety: "safe" }, + { pkg: "com.huawei.powergenie", label: "Powergenie", description: "Task killer app in EMUI 9+ (Android 9+).", safety: "safe" }, + { pkg: "com.huawei.stylus.floatmenu", label: "Floatmenu", description: "AI Lens. Shop for objects that you take a picture of. This de-clutters the camera interface by removing the...", safety: "safe" }, + { pkg: "com.huawei.synergy", label: "Synergy", description: "Huawei Cloud & Network Synergy.", safety: "safe" }, + { pkg: "com.huawei.tips", label: "Tips", description: "HUAWEI Feature Advisor", safety: "safe" }, + { pkg: "com.huawei.trustagent", label: "Trustagent", description: "Smart unlock feature.", safety: "safe" }, + { pkg: "com.huawei.vassistant", label: "Vassistant", description: "HiVoice app", safety: "safe" }, + { pkg: "com.huawei.videoeditor", label: "Videoeditor", description: "Huawei Video editor", safety: "safe" }, + { pkg: "com.huawei.wallet", label: "Wallet", description: "Huawei Wallet (renammed Huawei Pay)", safety: "safe" }, + { pkg: "com.huawei.watch.sync", label: "Sync", description: "Huawei Watch sync function", safety: "safe" }, + { pkg: "com.hisi.mapcon", label: "Mapcon", description: "Provides wifi calling feature (call or text on Wi-Fi networks using your SIM card)", safety: "safe" }, + { pkg: "com.huawei.KoBackup", label: "Kobackup", description: "As of writing this, Huawei phones cannot be rooted.", safety: "caution" }, + { pkg: "com.huawei.android.thememanager", label: "Thememanager", description: "Themes (https://play.google.com/store/apps/details?id=com.huawei.android.thememanager)", safety: "caution" }, + { pkg: "com.huawei.aod", label: "Aod", description: "Always On Display", safety: "safe" }, + { pkg: "com.huawei.android.internal.app", label: "App", description: "Component of Huawei sharing. I read someone saying \"Do not remove or you won't be able to send files to apps\".", safety: "caution" }, + { pkg: "com.huawei.android.launcher", label: "Launcher", description: "Huawei launcher app.", safety: "caution" }, + { pkg: "com.huawei.calendar", label: "Calendar", description: "Huawei Calendar app.", safety: "caution" }, + { pkg: "com.huawei.contacts", label: "Contacts", description: "Huawei Contacts app", safety: "caution" }, + { pkg: "com.huawei.deskclock", label: "Deskclock", description: "Huawei Clock App.", safety: "caution" }, + { pkg: "com.huawei.photos", label: "Photos", description: "Huawei Gallery app.", safety: "caution" }, + { pkg: "com.huawei.hidisk", label: "Hidisk", description: "Huawei File Manager app.", safety: "caution" }, + { pkg: "com.huawei.search", label: "Search", description: "HiSearch", safety: "safe" }, + { pkg: "com.huawei.securitymgr", label: "Securitymgr", description: "PrivateSpace", safety: "caution" }, + { pkg: "com.huawei.android.totemweather", label: "Totemweather", description: "Huawei Weather app (and its widget)", safety: "safe" }, + { pkg: "com.huawei.android.totemweatherapp", label: "Totemweatherapp", description: "Huawei Weather app (and its widget)", safety: "safe" }, + { pkg: "com.huawei.android.wfdft", label: "Wfdft", description: "Wi-Fi Direct feature.", safety: "safe" }, + { pkg: "com.huawei.hwstartupguide", label: "Hwstartupguide", description: "A one-time setup app that is no longer needed", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.paradise", label: "Paradise", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.artflower", label: "Artflower", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.flowersbloom", label: "Flowersbloom", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.mountaincloud", label: "Mountaincloud", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.naturalgarden", label: "Naturalgarden", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.livewallpaper.ripplestone", label: "Ripplestone", description: "Live wallpapers", safety: "safe" }, + { pkg: "com.huawei.mirror", label: "Mirror", description: "Huawei Mirror app.", safety: "safe" }, + { pkg: "com.huawei.scanner", label: "Scanner", description: "AI Lens. Shop for objects that you take a picture of. This de-clutters the camera interface by removing the...", safety: "safe" }, + { pkg: "com.huawei.fastapp", label: "Fastapp", description: "Quick App Center", safety: "caution", deps: ["com.huawei.hwid"] }, + ], + }, + { + name: "OnePlus/Oppo", + packages: [ + { pkg: "com.oneplus.backuprestore", label: "Backuprestore", description: "OnePlus Switch (https://play.google.com/store/apps/details?id=com.oneplus.backuprestore)", safety: "safe" }, + { pkg: "com.oneplus.brickmode", label: "Brickmode", description: "OnePlus Zen Mode (https://play.google.com/store/apps/details?id=com.oneplus.brickmode)", safety: "safe" }, + { pkg: "com.oneplus.bttestmode", label: "Bttestmode", description: "OnePlus Bluetooth test mode", safety: "safe" }, + { pkg: "com.oneplus.card", label: "Card", description: "Card Package", safety: "safe" }, + { pkg: "com.oneplus.carrierlocation", label: "Carrierlocation", description: "Carrier Location Access", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.android", label: "Android", description: "Android System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.android.networkstack.inprocess", label: "Inprocess", description: "Theming for Android system parts?", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.android.networkstack.inprocess.cn", label: "Cn", description: "Theming for Android system parts?", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.android.systemui", label: "Systemui", description: "System UI Theme pack", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.android.wifi.resources", label: "Resources", description: "System Wi-Fi resources Theme pack", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.google.android.networkstack", label: "Networkstack", description: "Network manager Theme pack", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.google.android.networkstack.cn", label: "Cn", description: "Network manager Theme pack", safety: "caution" }, + { pkg: "com.oneplus.commonoverlay.com.oneplus", label: "Oneplus", description: "Oneplus System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.communication.data", label: "Data", description: "Oneplus call recorder service. Feature accessible from the stock dialer app", safety: "caution" }, + { pkg: "com.oneplus.cota", label: "Cota", description: "Carrier Update", safety: "caution" }, + { pkg: "com.oneplus.engmode", label: "Engmode", description: "Some kind of Engineer mode? I've no clue.", safety: "caution" }, + { pkg: "com.oneplus.factorymode", label: "Factorymode", description: "FactoryMode", safety: "safe" }, + { pkg: "com.oneplus.factorymode.specialtest", label: "Specialtest", description: "Engineering Mode Special Test", safety: "safe" }, + { pkg: "com.oneplus.gamespace", label: "Gamespace", description: "OnePlus Game Space", safety: "safe", deps: ["com.oplus.cosa"] }, + { pkg: "com.oneplus.note", label: "Note", description: "OnePlus Notes app", safety: "caution" }, + { pkg: "com.oneplus.opbugreportlite", label: "Opbugreportlite", description: "OPBugReportLite", safety: "safe" }, + { pkg: "com.oneplus.productoverlay.android", label: "Android", description: "Android System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.productoverlay.com.oneplus", label: "Oneplus", description: "Oneplus System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.productoverlay.com.android.providers.settings", label: "Settings", description: "Settings Storage Theme pack", safety: "caution" }, + { pkg: "com.oneplus.providers.media", label: "Media", description: "OnePlus Media Storage", safety: "safe" }, + { pkg: "com.oneplus.soundrecorder", label: "Soundrecorder", description: "Recorder", safety: "caution" }, + { pkg: "net.oneplus.commonlogtool", label: "Commonlogtool", description: "OnePlus Common Log Tool", safety: "safe" }, + { pkg: "net.oneplus.forums", label: "Forums", description: "OnePlus Community (https://play.google.com/store/apps/details?id=net.oneplus.forums)", safety: "safe" }, + { pkg: "com.oneplus.opsports", label: "Opsports", description: "Cricket Scores (https://play.google.com/store/apps/details?id=com.oneplus.opsports)", safety: "safe" }, + { pkg: "com.oneplus.orm", label: "Orm", description: "Seems to be Oneplus' Memory Management System according to a press-kit/-release they made for Android 11 (m...", safety: "caution" }, + { pkg: "net.oneplus.odm.provider", label: "Provider", description: "Insight Provider", safety: "safe" }, + { pkg: "net.oneplus.odm", label: "Odm", description: "\"OnePlus System Service\"", safety: "safe" }, + { pkg: "net.oneplus.provider.appcategoryprovider", label: "Appcategoryprovider", description: "AppCategoryProvider", safety: "safe" }, + { pkg: "net.oneplus.push", label: "Push", description: "Push", safety: "safe" }, + { pkg: "net.oneplus.wallpaperresources", label: "Wallpaperresources", description: "Resources for some live wall papers? Not sure.", safety: "caution" }, + { pkg: "net.oneplus.weather", label: "Weather", description: "OnePlus Weather (https://play.google.com/store/apps/details?id=net.oneplus.weather)", safety: "safe" }, + { pkg: "net.oneplus.widget", label: "Widget", description: "OnePlus Widget", safety: "safe" }, + { pkg: "com.oneplus.opshelf", label: "Opshelf", description: "OnePlus Shelf (https://play.google.com/store/apps/details?id=com.oneplus.opshelf)", safety: "safe" }, + { pkg: "com.oneplus.iconpack.circle", label: "Circle", description: "OnePlus Icon Pack - Round (https://play.google.com/store/apps/details?id=com.oneplus.iconpack.circle)", safety: "caution" }, + { pkg: "com.oneplus.iconpack.oneplus", label: "Oneplus", description: "OnePlus Icon Pack (https://play.google.com/store/apps/details?id=com.oneplus.iconpack.oneplus)", safety: "caution" }, + { pkg: "com.oneplus.iconpack.square", label: "Square", description: "OnePlus Icon Pack - Square (https://play.google.com/store/apps/details?id=com.oneplus.iconpack.square)", safety: "caution" }, + { pkg: "com.oneplus.filemanager", label: "Filemanager", description: "File manager", safety: "caution" }, + { pkg: "com.oneplus", label: "Oneplus", description: "Oneplus System", safety: "caution" }, + { pkg: "com.oneplus.accessory", label: "Accessory", description: "Oneplus Link", safety: "safe" }, + { pkg: "com.oneplus.account", label: "Account", description: "OnePlus Account", safety: "caution" }, + { pkg: "com.oneplus.account.basiccolorblack.overlay", label: "Overlay", description: "Dark theme for Oneplus Account?", safety: "caution" }, + { pkg: "com.oneplus.account.basiccolorwhite.overlay", label: "Overlay", description: "Light theme for Oneplus Account?", safety: "caution" }, + { pkg: "com.oneplus.android.cellbroadcast.overlay", label: "Overlay", description: "Wireless emergency alerts Theme pack", safety: "caution" }, + { pkg: "com.oneplus.aod", label: "Aod", description: "Always On Display / Ambient Display", safety: "safe" }, + { pkg: "com.oneplus.aod.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for AOD? (Always On Display)", safety: "caution" }, + { pkg: "com.oneplus.aod.basiccolorwhite.overlay", label: "Overlay", description: "Theme overlay for AOD? (Always On Display)", safety: "caution" }, + { pkg: "com.oneplus.aodnotification.overlay.gold", label: "Gold", description: "System UI Theme pack", safety: "caution" }, + { pkg: "com.oneplus.aodnotification.overlay.purple", label: "Purple", description: "System UI Theme pack", safety: "caution" }, + { pkg: "com.oneplus.aodnotification.overlay.red", label: "Red", description: "System UI Theme pack", safety: "caution" }, + { pkg: "com.oneplus.applocker", label: "Applocker", description: "Encrypts and locks apps behind password access.", safety: "caution" }, + { pkg: "com.oneplus.appupgrader", label: "Appupgrader", description: "Built-in App Updates", safety: "caution" }, + { pkg: "com.oneplus.backuprestore.remoteservice", label: "Remoteservice", description: "Likely a backend service for OnePlus Switch(com.oneplus.backuprestore).", safety: "caution" }, + { pkg: "com.oneplus.calculator", label: "Calculator", description: "Stock Oneplus Calculator app.", safety: "caution" }, + { pkg: "com.oneplus.calculator.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for Oneplus Calculator app?", safety: "caution" }, + { pkg: "com.oneplus.calendar.black.overlay", label: "Overlay", description: "Theme overlay for stock Calendar app?", safety: "caution" }, + { pkg: "com.oneplus.calendar.white.overlay", label: "Overlay", description: "Theme overlay for stock Calendar app?", safety: "caution" }, + { pkg: "com.oneplus.camera", label: "Camera", description: "Camera", safety: "caution" }, + { pkg: "com.oneplus.camera.service", label: "Service", description: "Runs in the background on some phones.", safety: "safe" }, + { pkg: "com.oneplus.card.black.overlay", label: "Overlay", description: "Theme overlay for Oneplus Card package?", safety: "caution" }, + { pkg: "com.oneplus.card.white.overlay", label: "Overlay", description: "Theme overlay for Oneplus Card package?", safety: "caution" }, + { pkg: "com.oneplus.cloud.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for some Oneplus Cloud thing?", safety: "caution" }, + { pkg: "com.oneplus.cloud.basiccolorwhite.overlay", label: "Overlay", description: "Theme overlay for some Oneplus Cloud thing?", safety: "caution" }, + { pkg: "com.oneplus.config", label: "Config", description: "OPConfig", safety: "caution" }, + { pkg: "com.oneplus.contacts.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for Oneplus Contacts?", safety: "caution" }, + { pkg: "com.oneplus.contacts.basiccolorwhite.overlay", label: "Overlay", description: "Theme overlay for Oneplus Contacts?", safety: "caution" }, + { pkg: "com.oneplus.coreservice", label: "Coreservice", description: "Android System", safety: "caution" }, + { pkg: "com.oneplus.dataoptimization", label: "Dataoptimization", description: "OPDataOptimization", safety: "caution" }, + { pkg: "com.oneplus.deskclock", label: "Deskclock", description: "Clock", safety: "caution" }, + { pkg: "com.oneplus.deskclock.black.overlay", label: "Overlay", description: "Theme overlay for Oneplus Clock app?", safety: "caution" }, + { pkg: "com.oneplus.deskclock.white.overlay", label: "Overlay", description: "Theme overlay for Oneplus Clock app?", safety: "caution" }, + { pkg: "com.oneplus.diagnosemanager", label: "Diagnosemanager", description: "Logging app for diagnosis/troubleshooting when the SIM card state change. Only used on devices running Oxyg...", safety: "caution" }, + { pkg: "com.oneplus.dirac.simplemanager", label: "Simplemanager", description: "Runs in the background.", safety: "caution" }, + { pkg: "com.oneplus.dirac.simplemanager.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for Dirac?", safety: "caution" }, + { pkg: "com.oneplus.dirac.simplemanager.basiccolorwhite.overlay", label: "Overlay", description: "Theme overlay for Dirac?", safety: "caution" }, + { pkg: "com.oneplus.faceunlock", label: "Faceunlock", description: "Face Unlock", safety: "safe" }, + { pkg: "com.oneplus.filemanager.black.overlay", label: "Overlay", description: "Theme overlay for Oneplus File manager app?", safety: "caution" }, + { pkg: "com.oneplus.filemanager.white.overlay", label: "Overlay", description: "Theme overlay for Oneplus File manager app?", safety: "caution" }, + { pkg: "com.oneplus.gallery", label: "Gallery", description: "Oneplus Gallery (https://play.google.com/store/apps/details?id=com.oneplus.gallery)", safety: "caution" }, + { pkg: "com.oneplus.gamespace.black.overlay", label: "Overlay", description: "Theme overlay for Game Space?", safety: "caution" }, + { pkg: "com.oneplus.gamespace.white.overlay", label: "Overlay", description: "Theme overlay for Game Space?", safety: "caution" }, + { pkg: "com.oneplus.ifaaservice", label: "Ifaaservice", description: "IFAA = (China\u2019s) Internet Finance Authentication Alliance", safety: "safe" }, + { pkg: "com.oneplus.minidumpoptimization", label: "Minidumpoptimization", description: "OPMinidumpOptimization", safety: "safe" }, + { pkg: "com.oneplus.mms", label: "Mms", description: "OnePlus Messages (https://play.google.com/store/apps/details?id=com.oneplus.mms)", safety: "caution" }, + { pkg: "com.oneplus.mms.basiccolorblack.overlay", label: "Overlay", description: "Dark theme overlay for Oneplus Messages app?", safety: "caution" }, + { pkg: "com.oneplus.mms.basiccolorwhite.overlay", label: "Overlay", description: "Light theme overlay for Oneplus Messages app?", safety: "caution" }, + { pkg: "com.oneplus.note.black.overlay", label: "Overlay", description: "Dark theme overlay for Oneplus Notes app?", safety: "caution" }, + { pkg: "com.oneplus.note.white.overlay", label: "Overlay", description: "Light theme overlay for Oneplus Notes app?", safety: "caution" }, + { pkg: "com.oneplus.odmoverlay.android", label: "Android", description: "Android System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.odmoverlay.com.oneplus", label: "Oneplus", description: "Oneplus System Theme pack", safety: "caution" }, + { pkg: "com.oneplus.odmoverlay.com.android.settings", label: "Settings", description: "Settings Theme pack", safety: "caution" }, + { pkg: "com.oneplus.odmoverlay.com.android.systemui", label: "Systemui", description: "System UI Theme pack", safety: "caution" }, + { pkg: "com.oneplus.opbackup", label: "Opbackup", description: "System Update", safety: "caution" }, + { pkg: "com.oneplus.opbackup.black.overlay", label: "Overlay", description: "Theme overlay for System Update?", safety: "caution" }, + { pkg: "com.oneplus.opbackup.white.overlay", label: "Overlay", description: "Theme overlay for System Update?", safety: "caution" }, + { pkg: "com.oneplus.opwlb", label: "Opwlb", description: "Work-Life Balance", safety: "safe" }, + { pkg: "com.oneplus.opwlb.black.overlay", label: "Overlay", description: "Theme overlay for Oneplus Work-Life Balance?", safety: "caution" }, + { pkg: "com.oneplus.opwlb.white.overlay", label: "Overlay", description: "Theme overlay for Oneplus Work-Life Balance?", safety: "caution" }, + { pkg: "com.oneplus.screenrecord", label: "Screenrecord", description: "Screen Recorder", safety: "caution" }, + { pkg: "com.oneplus.screenrecord.black.overlay", label: "Overlay", description: "Theme overlay for Oneplus Screenrecord?", safety: "caution" }, + { pkg: "com.oneplus.screenrecord.white.overlay", label: "Overlay", description: "Theme overlay for Oneplus Screenrecord?", safety: "caution" }, + { pkg: "com.oneplus.security", label: "Security", description: "Dashboard", safety: "caution" }, + { pkg: "com.oneplus.security.black.overlay", label: "Overlay", description: "Dark theme overlay for com.oneplus.security?", safety: "caution" }, + { pkg: "com.oneplus.security.white.overlay", label: "Overlay", description: "Light theme overlay for com.oneplus.security?", safety: "caution" }, + { pkg: "com.oneplus.ses", label: "Ses", description: "OPSes", safety: "caution" }, + { pkg: "com.oneplus.setupwizard", label: "Setupwizard", description: "The Oneplus portion of the first-boot setup.", safety: "safe" }, + { pkg: "com.oneplus.simcontacts", label: "Simcontacts", description: "SimContacts Manager", safety: "safe" }, + { pkg: "com.oneplus.simcontacts.basiccolorblack.overlay", label: "Overlay", description: "Dark theme overlay for Oneplus SimContacts Manager app?", safety: "caution" }, + { pkg: "com.oneplus.simcontacts.basiccolorwhite.overlay", label: "Overlay", description: "Light theme overlay for Oneplus SimContacts Manager app?", safety: "caution" }, + { pkg: "com.oneplus.soundrecorder.black.overlay", label: "Overlay", description: "Theme overlay for Soundrecorder app?", safety: "caution" }, + { pkg: "com.oneplus.soundrecorder.white.overlay", label: "Overlay", description: "Theme overlay for Soundrecorder app?", safety: "caution" }, + { pkg: "com.oneplus.telephonyoptimization", label: "Telephonyoptimization", description: "OPTelephonyOptimization", safety: "caution" }, + { pkg: "com.oneplus.twspods", label: "Twspods", description: "OnePlus Buds (https://play.google.com/store/apps/details?id=com.oneplus.twspods)", safety: "safe" }, + { pkg: "com.oneplus.wallpaper", label: "Wallpaper", description: "Pack of live wallpapers from Oneplus.", safety: "caution" }, + { pkg: "com.oneplus.wifiapsettings", label: "Wifiapsettings", description: "Wi-Fi Access Point Settings?", safety: "caution" }, + { pkg: "com.oneplus.wifiapsettings.basiccolorblack.overlay", label: "Overlay", description: "Dark theme for Wi-Fi Access Point Settings?", safety: "caution" }, + { pkg: "com.oneplus.wifiapsettings.basiccolorwhite.overlay", label: "Overlay", description: "Light theme for Wi-Fi Access Point Settings?", safety: "caution" }, + { pkg: "net.oneplus.launcher", label: "Launcher", description: "Oneplus Launcher", safety: "caution" }, + { pkg: "net.oneplus.launcher.black.overlay", label: "Overlay", description: "Theme overlay for the Oneplus Launcher?", safety: "caution" }, + { pkg: "net.oneplus.launcher.white.overlay", label: "Overlay", description: "Theme overlay for the Oneplus Launcher?", safety: "caution" }, + { pkg: "net.oneplus.weather.basiccolorblack.overlay", label: "Overlay", description: "Theme overlay for Oneplus Weather app?", safety: "caution" }, + { pkg: "net.oneplus.weather.basiccolorwhite.overlay", label: "Overlay", description: "Theme overlay for Oneplus Weather app?", safety: "caution" }, + { pkg: "com.coloros.appmanager", label: "Appmanager", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.assistantscreen", label: "Assistantscreen", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.backuprestore", label: "Backuprestore", description: "Most likely Oppo backup/restore feature", safety: "safe" }, + { pkg: "com.coloros.childrenspace", label: "Childrenspace", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.cloud", label: "Cloud", description: "Oppo Cloud", safety: "safe" }, + { pkg: "com.coloros.directui", label: "Directui", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.findmyphone", label: "Findmyphone", description: "Find my phone service", safety: "safe" }, + { pkg: "com.coloros.gamespace", label: "Gamespace", description: "Game Space", safety: "safe" }, + { pkg: "com.coloros.healthcheck", label: "Healthcheck", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.weather.service", label: "Service", description: "colorOS weather service. Removal seems to trigger a bootloop on some phones.", safety: "keep" }, + { pkg: "com.coloros.weather2", label: "Weather2", description: "ColorOS weather app. Removal seems to trigger a bootloop on some phones. You should try, several users remo...", safety: "caution" }, + { pkg: "com.coloros.mcs", label: "Mcs", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.ocrscanner", label: "Ocrscanner", description: "ColorOS Optical character recognition scanner", safety: "safe" }, + { pkg: "com.coloros.oppomultiapp", label: "Oppomultiapp", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.phonenoareainquire", label: "Phonenoareainquire", description: "Number Origin", safety: "safe" }, + { pkg: "com.coloros.smartdrive", label: "Smartdrive", description: "No description available", safety: "safe" }, + { pkg: "com.coloros.soundrecorder", label: "Soundrecorder", description: "ColorOS Sound Recorder", safety: "caution" }, + { pkg: "com.coloros.speechassist", label: "Speechassist", description: "ColorOS Speech Assistant", safety: "safe" }, + { pkg: "com.coloros.widget.smallweather", label: "Smallweather", description: "No description available", safety: "safe" }, + { pkg: "com.nearme.atlas", label: "Atlas", description: "Secure payment", safety: "safe" }, + { pkg: "com.nearme.browser", label: "Browser", description: "Default web browser", safety: "safe" }, + { pkg: "com.nearme.instant.platform", label: "Platform", description: "No description available", safety: "safe" }, + { pkg: "com.nearme.themestore", label: "Themestore", description: "Themes store", safety: "safe" }, + { pkg: "com.oppo.fingerprints.fingerprintsensortest", label: "Fingerprintsensortest", description: "Fingerprint sensort test", safety: "safe" }, + { pkg: "com.oppo.logkitservice", label: "Logkitservice", description: "Probably same as \"com.oem.oemlogkit\", which is a shady logging package on Oneplus devices.", safety: "safe" }, + { pkg: "com.oppo.logkit", label: "Logkit", description: "No description available", safety: "safe" }, + { pkg: "com.oppo.market", label: "Market", description: "Oppo App Market", safety: "safe" }, + { pkg: "com.oppo.music", label: "Music", description: "Oppo Music app", safety: "safe" }, + { pkg: "com.oppo.ovoicemanager", label: "Ovoicemanager", description: "No description available", safety: "safe" }, + { pkg: "com.oppo.oppopowermonitor", label: "Oppopowermonitor", description: "No description available", safety: "safe" }, + { pkg: "com.oppo.quicksearchbox", label: "Quicksearchbox", description: "Single swipe from top to bottom search that has lots of Chinese in it", safety: "safe" }, + { pkg: "com.oppo.securepay", label: "Securepay", description: "Payment Protection", safety: "safe" }, + { pkg: "com.coloros.wallet", label: "Wallet", description: "Oppo Wallet", safety: "safe" }, + { pkg: "com.realme.findphone.client2", label: "Client2", description: "Find my phone client app", safety: "safe" }, + { pkg: "com.coloros.filemanager", label: "Filemanager", description: "ColorOS File Manager", safety: "caution" }, + { pkg: "com.coloros.pictorial", label: "Pictorial", description: "LockscreenMagazine", safety: "keep" }, + { pkg: "com.coloros.securitypermission", label: "Securitypermission", description: "Handles app permission management. DO NOT REMOVE THIS", safety: "keep" }, + { pkg: "com.oppo.freefallingmonitor", label: "Freefallingmonitor", description: "Provides protection for camera slider in the event of a fall.", safety: "keep" }, + { pkg: "com.oppo.webview", label: "Webview", description: "Oppo Webview", safety: "caution" }, + { pkg: "com.oneplus.sound.tuner", label: "Tuner", description: "Dolby Atmos", safety: "caution" }, + { pkg: "com.oplus.cosa", label: "Cosa", description: "App Enhancement Services", safety: "safe", neededBy: ["com.oneplus.gamespace"] }, + { pkg: "com.oplus.synergy", label: "Synergy", description: "HeySynergy", safety: "caution", deps: ["com.heytap.mcs", "com.heytap.accessory"] }, + { pkg: "com.oplus.games", label: "Games", description: "Games (https://play.google.com/store/apps/details?id=com.oplus.games)", safety: "safe" }, + { pkg: "com.oppo.partnerbrowsercustomizations", label: "Partnerbrowsercustomizations", description: "Oppo Bookmarks", safety: "safe" }, + { pkg: "com.nearme.deamon", label: "Deamon", description: "Package needed by com.nearme.statistics.rom to run service in background at every boot even though the app ...", safety: "safe", neededBy: ["com.nearme.statistics.rom"] }, + { pkg: "com.nearme.statistics.rom", label: "Rom", description: "User Experience Program", safety: "safe" }, + { pkg: "com.coloros.compass2", label: "Compass2", description: "ColorOS default compass app", safety: "caution" }, + { pkg: "com.coloros.gamespaceui", label: "Gamespaceui", description: "GameSpace", safety: "safe" }, + { pkg: "com.coloros.onekeylockscreen", label: "Onekeylockscreen", description: "Lock your phone if you click on the app icon. Completely useless unless your physical power button is damaged.", safety: "safe" }, + { pkg: "com.coloros.oshare", label: "Oshare", description: "Oppo Share", safety: "caution" }, + { pkg: "com.coloros.phonemanager", label: "Phonemanager", description: "Phone Manager", safety: "safe" }, + { pkg: "com.coloros.securepay", label: "Securepay", description: "Payment system from Oppo allowing you to pay with your phone", safety: "safe" }, + { pkg: "com.coloros.systemclone", label: "Systemclone", description: "System Cloner", safety: "caution" }, + { pkg: "com.coloros.video", label: "Video", description: "Video Player", safety: "safe" }, + { pkg: "com.oplus.kekepay", label: "Kekepay", description: "Chinese pay service? Safe to remove but no documentation found online", safety: "safe" }, + { pkg: "com.oplus.logkit", label: "Logkit", description: "Logs service and bug reporting app", safety: "safe" }, + { pkg: "com.oplus.multiapp", label: "Multiapp", description: "App Cloner. Allows to clone an app. Have access to all installed apps. Is bundled with OnePlus analytics", safety: "caution" }, + { pkg: "com.oplus.pay", label: "Pay", description: "Secure Payment", safety: "safe" }, + { pkg: "com.oplus.securitykeyboard", label: "Securitykeyboard", description: "Secure Keyboard", safety: "safe" }, + { pkg: "com.oplus.statistics.rom", label: "Rom", description: "User Experience Program", safety: "safe" }, + { pkg: "com.oplus.sos", label: "Sos", description: "Emergency Alert service by clicking power button 5 times. It will automatically call contacts (and/or send ...", safety: "caution" }, + { pkg: "com.realme.link", label: "Link", description: "RealMe Link (https://play.google.com/store/apps/details?id=com.realme.link)", safety: "safe" }, + { pkg: "com.realme.securitycheck", label: "Securitycheck", description: "Security Analysis", safety: "safe" }, + { pkg: "com.oppo.operationManual", label: "Operationmanual", description: "Oppo User Manual", safety: "safe" }, + { pkg: "com.oppo.sos", label: "Sos", description: "Emergency Alert service by clicking power button 5 times. It will automatically call contacts (and/or send ...", safety: "caution" }, + { pkg: "com.oneplus.chargingpilar", label: "Chargingpilar", description: "Geolocates the phone to find OnePlus charging stations nearby. Connects to 'gateway.oneplus.net'", safety: "safe" }, + { pkg: "com.coloros.activation", label: "Activation", description: "E-warranty card", safety: "caution" }, + { pkg: "com.oplus.appplatform", label: "Appplatform", description: "App Services", safety: "caution" }, + { pkg: "com.oplus.athena", label: "Athena", description: "OnePlus background process manager. Removing it will solve the notification delay you can have but will dis...", safety: "caution" }, + { pkg: "com.oplus.atlas", label: "Atlas", description: "Atlas Service", safety: "caution" }, + { pkg: "com.oplus.crashbox", label: "Crashbox", description: "Sends system failure data to developers. Automatically runs at boot.", safety: "safe" }, + { pkg: "com.oplus.exsystemservice", label: "Exsystemservice", description: "[NEED MORE INFO / APK NEEDED] Lots of permissions. The screenshot function will stop working when the app i...", safety: "caution" }, + { pkg: "com.oplus.stdid", label: "Stdid", description: "StdID", safety: "caution", neededBy: ["com.oneplus.gamespace", "com.coloros.gamespace"] }, + { pkg: "com.oplus.lfeh", label: "Lfeh", description: "Seems to be related to the the logging suite.", safety: "safe" }, + { pkg: "com.oplus.ocar", label: "Ocar", description: "Car+", safety: "safe" }, + { pkg: "com.oplus.wifibackuprestore", label: "Wifibackuprestore", description: "Lets you backup your wifi credentials to the cloud. This app has obviously access to your wifi credential a...", safety: "safe" }, + { pkg: "com.oneplus.geoiptime", label: "Geoiptime", description: "Sets the Timezone (it is not an NTP client). Automatically starts at boot and connects to `checkip.amazonaw...", safety: "caution" }, + { pkg: "com.oneplus.dialer", label: "Dialer", description: "OnePlus Dialer used in OxygenOS 11 and lower.", safety: "caution" }, + ], + }, + { + name: "Sony", + packages: [ + { pkg: "com.sony.tvsideview.videoph", label: "Videoph", description: "Video & TV SideView (replaced by https://play.google.com/store/apps/details?id=com.sony.tvsideview.phone)", safety: "safe" }, + { pkg: "com.sonyericsson.android.addoncamera.artfilter", label: "Artfilter", description: "Sony Creative effect", safety: "caution" }, + { pkg: "com.sonyericsson.android.omacp", label: "Omacp", description: "omacp = OMA Client Provisioning. It is a protocol specified by the Open Mobile Alliance (OMA).", safety: "caution" }, + { pkg: "com.sonyericsson.conversations.res.overlay", label: "Overlay", description: "Used to display a overlay notification (= on top of others app) when you receive a SMS with Sony SMS app ?", safety: "caution" }, + { pkg: "com.sonyericsson.idd.agent", label: "Agent", description: "Anonymous Usage Stats", safety: "safe" }, + { pkg: "com.sonyericsson.mtp", label: "Mtp", description: "MTP extension service", safety: "caution" }, + { pkg: "com.sonyericsson.mtp.extension.backuprestore", label: "Backuprestore", description: "Backup/Restore Sony feature.", safety: "caution" }, + { pkg: "com.sonyericsson.mtp.extension.update", label: "Update", description: "Update service for MTP Extension.", safety: "caution" }, + { pkg: "com.sonyericsson.music", label: "Music", description: "Sony music player (https://play.google.com/store/apps/details?id=com.sonyericsson.music)", safety: "caution" }, + { pkg: "com.sonyericsson.settings.res.overlay_305", label: "Overlay 305", description: "Some overlay for settings? Overlays are usually themes.", safety: "caution" }, + { pkg: "com.sonyericsson.startupflagservice", label: "Startupflagservice", description: "Startup Flag Service", safety: "safe" }, + { pkg: "com.sonyericsson.textinput.chinese", label: "Chinese", description: "Sony chinese keyboard", safety: "safe" }, + { pkg: "com.sonyericsson.trackid.res.overlay_305", label: "Overlay 305", description: "Overlay for TrackID. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.sonyericsson.trackid.res.overlay", label: "Overlay", description: "Some overlay for TrackID. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.sonyericsson.unsupportedheadsetnotifier", label: "Unsupportedheadsetnotifier", description: "Given its name, I think it diplays a notification when you insert a headset not compatible with your phone.", safety: "caution" }, + { pkg: "com.sonyericsson.wappush", label: "Wappush", description: "WAP Push", safety: "safe" }, + { pkg: "com.sonyericsson.xhs", label: "Xhs", description: "Sony Xperia Lounge (discontinued by Sony on August 2019)", safety: "safe" }, + { pkg: "com.sonymobile.advancedlogging", label: "Advancedlogging", description: "Advanced Logging", safety: "safe" }, + { pkg: "com.sonymobile.advancedwidget.topcontacts", label: "Topcontacts", description: "Top Contacts widget", safety: "safe" }, + { pkg: "com.sonymobile.android.addoncamera.soundphoto", label: "Soundphoto", description: "Sony Sound Photo", safety: "safe" }, + { pkg: "com.sonymobile.androidapp.cameraaddon.areffect", label: "Areffect", description: "Old package for AR Effect (https://play.google.com/store/apps/details?id=com.sonymobile.androidapp.cameraad...", safety: "safe" }, + { pkg: "com.sonymobile.android.externalkeyboard", label: "Externalkeyboard", description: "International keyboard layouts", safety: "caution" }, + { pkg: "com.sonymobile.android.contacts.res.overlay_305", label: "Overlay 305", description: "Overlay for Sony contacts. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.sonymobile.android.externalkeyboardjp", label: "Externalkeyboardjp", description: "Japanese layout for Sony keyboard.", safety: "caution" }, + { pkg: "com.sonymobile.anondata", label: "Anondata", description: "Anonymous Usage Stats (yes just as com.sonyericsson.idd.agent but it's for other phones)", safety: "safe" }, + { pkg: "com.sonymobile.apnupdater", label: "Apnupdater", description: "Automatically updates APN settings if your carrier changes them? I thought that was the role of com.android...", safety: "caution" }, + { pkg: "com.sonymobile.apnupdater.res.overlay_305", label: "Overlay 305", description: "Overlay for APN Updater. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.sonymobile.aptx.notifier", label: "Notifier", description: "Aptx Notifier", safety: "caution" }, + { pkg: "com.sonymobile.assist", label: "Assist", description: "Xperia Assist (https://play.google.com/store/apps/details?id=com.sonymobile.assist)", safety: "safe" }, + { pkg: "com.sonymobile.assist.persistent", label: "Persistent", description: "Related to Xperia Assist (see just above) but I don't know its purpose.", safety: "safe" }, + { pkg: "com.sonymobile.cameracommon.wearablebridge", label: "Wearablebridge", description: "Camera Wearable bridge", safety: "safe" }, + { pkg: "com.sonymobile.cellbroadcast.notification", label: "Notification", description: "Cell information", safety: "caution" }, + { pkg: "com.sonymobile.coverapp2", label: "Coverapp2", description: "Style Cover", safety: "safe" }, + { pkg: "com.sonymobile.demoappchecker", label: "Demoappchecker", description: "Demo app checker", safety: "safe" }, + { pkg: "com.sonymobile.deviceconfigtool", label: "Deviceconfigtool", description: "Configuration agent", safety: "safe" }, + { pkg: "com.sonymobile.dualshockmanager", label: "Dualshockmanager", description: "DUALSHOCK", safety: "safe" }, + { pkg: "com.sonymobile.email", label: "Email", description: "Sony Email app", safety: "safe" }, + { pkg: "com.sonymobile.entrance", label: "Entrance", description: "What's New (discontinued in 2014)", safety: "safe" }, + { pkg: "com.sonymobile.getmore.client", label: "Client", description: "Xperia Tips (https://play.google.com/store/apps/details?id=com.sonymobile.getmore.client)", safety: "safe" }, + { pkg: "com.sonymobile.getset", label: "Getset", description: "Xperia Actions (discontinued)", safety: "safe" }, + { pkg: "com.sonymobile.getset.priv", label: "Priv", description: "Xperia Actions System", safety: "safe" }, + { pkg: "com.sonymobile.gettoknowit", label: "Gettoknowit", description: "Introduction to Xperia (discontinued)", safety: "safe" }, + { pkg: "com.sonymobile.glovemode", label: "Glovemode", description: "Sony Glove mode", safety: "safe" }, + { pkg: "com.sonymobile.googleanalyticsproxy", label: "Googleanalyticsproxy", description: "Google Analytics Proxy", safety: "safe" }, + { pkg: "com.sonymobile.intelligent.backlight", label: "Backlight", description: "Smart backlight control", safety: "safe" }, + { pkg: "com.sonymobile.indeviceintelligence", label: "Indeviceintelligence", description: "Xperia Intelligence Engine", safety: "safe" }, + { pkg: "com.sonymobile.intelligent.gesture", label: "Gesture", description: "Smart call handling", safety: "safe" }, + { pkg: "com.sonymobile.intelligent.iengine", label: "Iengine", description: "According to a sony user it is part of Smart Screen rotation (auto screen rotation based on the gyroscope).", safety: "safe" }, + { pkg: "com.sonymobile.intelligent.observer", label: "Observer", description: "IntelligentObserver", safety: "safe" }, + { pkg: "com.sonymobile.lifelog", label: "Lifelog", description: "Lifelog (https://play.google.com/store/apps/details?id=com.sonymobile.lifelog)", safety: "safe" }, + { pkg: "com.sonymobile.moviecreator.rmm", label: "Rmm", description: "Movie Creator (https://play.google.com/store/apps/details?id=com.sonymobile.moviecreator.rmm)", safety: "safe" }, + { pkg: "com.sonymobile.mtp.extension.fotaupdate", label: "Fotaupdate", description: "fota update service", safety: "caution" }, + { pkg: "com.sonymobile.music.googlelyricsplugin", label: "Googlelyricsplugin", description: "Google lyrics plugin", safety: "safe" }, + { pkg: "com.sonymobile.music.wikipediaplugin", label: "Wikipediaplugin", description: "Wikipedia plugin for sony music app", safety: "safe" }, + { pkg: "com.sonymobile.music.youtubekaraokeplugin", label: "Youtubekaraokeplugin", description: "YouTube karaoke plugin for sony music app", safety: "safe" }, + { pkg: "com.sonymobile.music.youtubeplugin", label: "Youtubeplugin", description: "YouTube plugin for sony music app", safety: "safe" }, + { pkg: "com.sonymobile.pip", label: "Pip", description: "Sony pip (Picture in Picture)", safety: "safe" }, + { pkg: "com.sonymobile.pobox", label: "Pobox", description: "Xperia Japanese keyboard", safety: "safe" }, + { pkg: "com.sonymobile.prediction", label: "Prediction", description: "Sony text prediction (for Sony keyboard)", safety: "safe" }, + { pkg: "com.sonymobile.retaildemo", label: "Retaildemo", description: "Retail Demo", safety: "safe" }, + { pkg: "com.sonymobile.scan3d", label: "Scan3D", description: "Sony 3D Creator (https://play.google.com/store/apps/details?id=com.sonymobile.scan3d)", safety: "safe" }, + { pkg: "com.sonymobile.simlockunlockapp", label: "Simlockunlockapp", description: "Sim Lock", safety: "safe" }, + { pkg: "com.sonymobile.smartcharger", label: "Smartcharger", description: "Battery Care", safety: "safe" }, + { pkg: "com.sonymobile.support", label: "Support", description: "Sony Support (https://play.google.com/store/apps/details?id=com.sonymobile.support)", safety: "safe" }, + { pkg: "com.sonymobile.synchub", label: "Synchub", description: "Sony Backup & restore feature to/from Google drive ?", safety: "safe" }, + { pkg: "com.sonymobile.themes.xperialoops2", label: "Xperialoops2", description: "Sony themes", safety: "caution" }, + { pkg: "com.sonymobile.xperialounge.services", label: "Services", description: "Xperia\u2122 Lounge Pass service (discontinued)", safety: "safe" }, + { pkg: "com.sonymobile.xperiaxlivewallpaper.product.res.overlay", label: "Overlay", description: "Some overlay for a live wallaper from Sony? Overlays are usually themes, but not sure about this one as the...", safety: "caution" }, + { pkg: "com.sonymobile.xperiaservices", label: "Xperiaservices", description: "Xperia services", safety: "safe" }, + { pkg: "com.sonymobile.xperiatransfermobile", label: "Xperiatransfermobile", description: "Xperia Transfer Mobile (https://play.google.com/store/apps/details?id=com.sonymobile.xperiatransfermobile)", safety: "safe" }, + { pkg: "com.sonymobile.xperiaweather", label: "Xperiaweather", description: "Sony weather app (https://play.google.com/store/apps/details?id=com.sonymobile.xperiaweather)", safety: "safe" }, + { pkg: "com.sonyericsson.album", label: "Album", description: "Sony gallery app (https://play.google.com/store/apps/details?id=com.sonyericsson.album)", safety: "caution" }, + { pkg: "com.sonymobile.camera", label: "Camera", description: "Sony camera app", safety: "caution" }, + { pkg: "com.sonyericsson.android.camera3d", label: "Camera3D", description: "Sony camera app (on older phones)", safety: "caution" }, + { pkg: "com.sonymobile.android.contacts", label: "Contacts", description: "Sony contacts", safety: "caution" }, + { pkg: "com.sonyericsson.conversations.res.overlay_305", label: "Overlay 305", description: "Used to display a overlay notification (= on top of others app) when you receive a SMS with Sony SMS app ?", safety: "safe" }, + { pkg: "com.sonyericsson.warrantytime", label: "Warrantytime", description: "Lets you see some info about your warranty and how long it will last.", safety: "safe" }, + { pkg: "com.sonymobile.themes.sou.cid18.black", label: "Black", description: "Sony themes", safety: "caution" }, + { pkg: "com.sonymobile.themes.sou.cid19.silver", label: "Silver", description: "Sony themes", safety: "caution" }, + { pkg: "com.sonymobile.themes.sou.cid20.blue", label: "Blue", description: "Sony themes", safety: "caution" }, + { pkg: "com.sonymobile.themes.sou.cid21.pink", label: "Pink", description: "Sony themes", safety: "caution" }, + { pkg: "com.sonymobile.xperiaxlivewallpaper", label: "Xperiaxlivewallpaper", description: "Xperia Loops", safety: "safe" }, + ], + }, + { + name: "Motorola", + packages: [ + { pkg: "com.motorola.android.fmradio", label: "Fmradio", description: "FMRadioService", safety: "safe" }, + { pkg: "com.motorola.android.jvtcmd", label: "Jvtcmd", description: "Java Tcmd Helper", safety: "safe" }, + { pkg: "com.motorola.android.nativedropboxagent", label: "Nativedropboxagent", description: "Native DropBox Agent.", safety: "safe" }, + { pkg: "com.motorola.android.providers.chromehomepage", label: "Chromehomepage", description: "Seems to provide the \"Home\"-button functionality in Chrome.", safety: "safe" }, + { pkg: "com.motorola.android.provisioning", label: "Provisioning", description: "OMA Client Provisioning", safety: "caution" }, + { pkg: "com.motorola.android.settings.diag_mdlog", label: "Diag Mdlog", description: "Diag_mdlog is a small proprietary Qualcomm program which can store DIAG logs on the filesystem.", safety: "safe" }, + { pkg: "com.motorola.android.settings.modemdebug", label: "Modemdebug", description: "Provide modem debug settings menu ?", safety: "safe" }, + { pkg: "com.motorola.appdirectedsmsproxy", label: "Appdirectedsmsproxy", description: "An Application directed SMS (or rather a Port directed SMS) is an SMS directed to a specific port.", safety: "safe" }, + { pkg: "com.motorola.bach.modemstats", label: "Modemstats", description: "ModemStatsService", safety: "safe" }, + { pkg: "com.motorola.brapps", label: "Brapps", description: "Motorola App Box (https://play.google.com/store/apps/details?id=com.motorola.brapps)", safety: "safe" }, + { pkg: "com.motorola.bug2go", label: "Bug2Go", description: "Bugs reporting app that sends info about crash report.", safety: "safe" }, + { pkg: "com.motorola.ccc.devicemanagement", label: "Devicemanagement", description: "Mobile Device Management (MDM) allows company\u2019s IT department to reach inside your phone in the background,...", safety: "safe" }, + { pkg: "com.motorola.ccc.mainplm", label: "Mainplm", description: "plm = Product Lifecycle Management ? No noticeable consequences after removal", safety: "safe" }, + { pkg: "com.motorola.ccc.notification", label: "Notification", description: "Motorola Notifications (https://play.google.com/store/apps/details?id=com.motorola.ccc.notification)", safety: "safe" }, + { pkg: "com.motorola.contacts.preloadcontacts", label: "Preloadcontacts", description: "Preloaded Contacts", safety: "safe" }, + { pkg: "com.motorola.demo", label: "Demo", description: "Moto Demo Mode", safety: "safe" }, + { pkg: "com.motorola.demo.env", label: "Env", description: "Needed for Moto Demo Mode", safety: "safe" }, + { pkg: "com.motorola.email", label: "Email", description: "Motorola Easy Prefix (https://play.google.com/store/apps/details?id=com.motorola.easyprefix)", safety: "safe" }, + { pkg: "com.motorola.fmplayer", label: "Fmplayer", description: "FM Radio (https://play.google.com/store/apps/details?id=com.motorola.fmplayer)", safety: "safe" }, + { pkg: "com.motorola.frameworks.singlehand", label: "Singlehand", description: "Provide the Single/One hand mode", safety: "safe" }, + { pkg: "com.motorola.genie", label: "Genie", description: "Device Help (previously Moto Help) (https://play.google.com/store/apps/details?id=com.motorola.genie)", safety: "safe" }, + { pkg: "com.motorola.gesture", label: "Gesture", description: "Gesture navigation tutorial added in Android 10.", safety: "safe" }, + { pkg: "com.motorola.help", label: "Help", description: "Moto feedback (https://play.google.com/store/apps/details?id=com.motorola.help)", safety: "safe" }, + { pkg: "com.motorola.lifetimedata", label: "Lifetimedata", description: "Not 100% sure but it's most likely the Total Call Timer or more generally it handles info like the date of ...", safety: "safe" }, + { pkg: "com.motorola.hiddenmenuapp", label: "Hiddenmenuapp", description: "Added in Android 10. Safe to remove.", safety: "safe" }, + { pkg: "com.motorola.moto", label: "Moto", description: "Moto (https://play.google.com/store/apps/details?id=com.motorola.moto)", safety: "safe" }, + { pkg: "com.motorola.motocare", label: "Motocare", description: "Moto Care was renamed in \"Moto Help\" and then in \"Device Help\"", safety: "safe" }, + { pkg: "com.motorola.motocit", label: "Motocit", description: "CQATest", safety: "safe" }, + { pkg: "com.motorola.motodisplay", label: "Motodisplay", description: "Moto Display (https://play.google.com/store/apps/details?id=com.motorola.motodisplay)", safety: "safe" }, + { pkg: "com.motorola.paks", label: "Paks", description: "ADB: Package Protected.", safety: "safe" }, + { pkg: "com.motorola.programmenu", label: "Programmenu", description: "Programming Menu", safety: "safe" }, + { pkg: "com.motorola.ptt.prip", label: "Prip", description: "Prip (https://play.google.com/store/apps/details?id=com.motorola.ptt.prip)", safety: "safe" }, + { pkg: "com.motorola.setup", label: "Setup", description: "Related to Motorola Account setup (only during first boot ?)", safety: "safe" }, + { pkg: "com.motorola.slpc_sys", label: "Slpc Sys", description: "Motorola Slpc System", safety: "safe" }, + { pkg: "com.motorola.timeweatherwidget", label: "Timeweatherwidget", description: "Provides time/weather widget on the home screen.", safety: "safe" }, + { pkg: "com.motorola.camera2", label: "Camera2", description: "Moto Camera 2 (https://play.google.com/store/apps/details?id=com.motorola.camera)", safety: "caution" }, + { pkg: "com.motorola.actions", label: "Actions", description: "Moto Actions (https://play.google.com/store/apps/details?id=com.motorola.actions)", safety: "safe" }, + { pkg: "com.motorola.carriersettingsext", label: "Carriersettingsext", description: "Seems safe to remove for now.", safety: "safe" }, + { pkg: "com.motorola.callredirectionservice", label: "Callredirectionservice", description: "Added in Android 10. Provide support for call redirection/cancellation if your Carrier supports it (when so...", safety: "safe" }, + { pkg: "com.motorola.ccc.ota", label: "Ota", description: "Motorola Update Services", safety: "caution" }, + { pkg: "com.motorola.comcast.settings.extensions", label: "Extensions", description: "Most likely provides a special settings menu for Comcast stuff.", safety: "safe" }, + { pkg: "com.motorola.entitlement", label: "Entitlement", description: "Enable WiFi tethering/hotspot functionality.", safety: "caution" }, + { pkg: "com.motorola.faceunlock", label: "Faceunlock", description: "Moto Face Unlock (https://play.google.com/store/apps/details?id=com.motorola.faceunlock)", safety: "caution" }, + { pkg: "com.motorola.faceunlocktrustagent", label: "Faceunlocktrustagent", description: "Motorola Face Unlock Agent", safety: "caution" }, + { pkg: "com.motorola.imagertuning_lake", label: "Imagertuning Lake", description: "Imager Tuning (https://play.google.com/store/apps/details?id=com.motorola.imagertuning_athene)", safety: "caution" }, + { pkg: "com.motorola.invisiblenet", label: "Invisiblenet", description: "Invisible net", safety: "caution" }, + { pkg: "com.motorola.launcher3", label: "Launcher3", description: "Motorola system launcher", safety: "caution" }, + { pkg: "com.motorola.launcherconfig", label: "Launcherconfig", description: "Config file of the motorola launcher?", safety: "caution" }, + { pkg: "com.motorola.launcher.secondarydisplay", label: "Secondarydisplay", description: "Appears to enable support for a secondary display with Moto's launcher.", safety: "caution" }, + { pkg: "com.motorola.motosignature.app", label: "App", description: "Appears safe to remove.", safety: "caution" }, + { pkg: "com.motorola.nfc", label: "Nfc", description: "Support for NFC protocol.", safety: "caution" }, + { pkg: "com.motorola.omadm.service", label: "Service", description: "Appears safe to remove.", safety: "safe" }, + { pkg: "com.motorola.pgmsystem2", label: "Pgmsystem2", description: "Appears safe to remove", safety: "safe" }, + { pkg: "com.motorola.systemserver", label: "Systemserver", description: "Appears safe to remove. Maybe it's only needed for Motorola apps?", safety: "safe" }, + { pkg: "com.motorola.VirtualUiccPayment", label: "Virtualuiccpayment", description: "Virtual UICC Payment", safety: "caution" }, + { pkg: "com.motorola.config.wifi", label: "Wifi", description: "Appears safe to remove.", safety: "safe" }, + { pkg: "com.motorola.coresettingsext", label: "Coresettingsext", description: "Core Settings extension", safety: "safe" }, + { pkg: "com.motorola.android.providers.settings", label: "Settings", description: "Removal causes bootloop. Which is common with settings providers.", safety: "keep" }, + { pkg: "com.motorola.msimsettings", label: "Msimsettings", description: "Dual SIM Settings", safety: "keep" }, + { pkg: "com.motorola.timezonedata", label: "Timezonedata", description: "/!\\ Causes bootloop on Moto G7 Power (Android 9/10)", safety: "keep" }, + { pkg: "com.motorola.audiofx", label: "Audiofx", description: "/!\\ Removal causes bootloop on Moto G7 Power (Android 10)", safety: "keep" }, + { pkg: "com.motorola.easyprefix", label: "Easyprefix", description: "Motorola Easy Prefix (https://play.google.com/store/apps/details?id=com.motorola.easyprefix)", safety: "safe" }, + { pkg: "com.motorola.motocare.internal", label: "Internal", description: "Core stuff for the package above I guess.", safety: "safe" }, + { pkg: "com.motorola.comcastext", label: "Comcastext", description: "See above. Provides special (useless) features from Comcast? App title is \"Activation\". Safe to remove (tes...", safety: "safe" }, + ], + }, + { + name: "LG", + packages: [ + { pkg: "com.lge.appbox.client", label: "Client", description: "LG Application manager", safety: "safe" }, + { pkg: "com.lge.bnr", label: "Bnr", description: "LG Backup", safety: "safe" }, + { pkg: "com.lge.cic.eden.service", label: "Service", description: "Memories album", safety: "safe" }, + { pkg: "com.lge.drmservice", label: "Drmservice", description: "DRM Service", safety: "safe" }, + { pkg: "com.lge.easyhome", label: "Easyhome", description: "LG EasyHome", safety: "safe" }, + { pkg: "com.lge.eltest", label: "Eltest", description: "ELTest", safety: "safe" }, + { pkg: "com.lge.email", label: "Email", description: "LG Email app", safety: "safe" }, + { pkg: "com.lge.eula", label: "Eula", description: "LG EULA (Terms of Use) accessible in the settings.", safety: "safe" }, + { pkg: "com.lge.eulaprovider", label: "Eulaprovider", description: "License Provider", safety: "safe" }, + { pkg: "com.lge.fmradio", label: "Fmradio", description: "FM radio app", safety: "safe" }, + { pkg: "com.lge.friendsmanager", label: "Friendsmanager", description: "LG Friends Manager (https://play.google.com/store/apps/details?id=com.lge.friendsmanager)", safety: "safe" }, + { pkg: "com.lge.gallery.collagewallpaper", label: "Collagewallpaper", description: "LG Collage Wallpapers", safety: "safe" }, + { pkg: "com.lge.gallery.vr.wallpaper", label: "Wallpaper", description: "LG 360 Image Wallpaper", safety: "safe" }, + { pkg: "com.lge.gcuv", label: "Gcuv", description: "GCUV", safety: "safe" }, + { pkg: "com.lge.gestureanswering", label: "Gestureanswering", description: "Answer me 2.0", safety: "safe" }, + { pkg: "com.lge.gnss.airtest", label: "Airtest", description: "GNSS Air Test", safety: "safe" }, + { pkg: "com.lge.gnsslogcat", label: "Gnsslogcat", description: "GNSS Logcat", safety: "safe" }, + { pkg: "com.lge.gnsspostest", label: "Gnsspostest", description: "GNSS Position test", safety: "safe" }, + { pkg: "com.lge.gnsstest", label: "Gnsstest", description: "GNSS Test", safety: "safe" }, + { pkg: "com.lge.hifirecorder", label: "Hifirecorder", description: "LG Audio Recorder", safety: "safe" }, + { pkg: "com.lge.hotspotlauncher", label: "Hotspotlauncher", description: "LG Mobile Hotspot", safety: "caution" }, + { pkg: "com.lge.ia.task.incalagent", label: "Incalagent", description: "InCalAgent", safety: "safe" }, + { pkg: "com.lge.ia.task.smartcare", label: "Smartcare", description: "LIA SmartDoctor Engine", safety: "safe" }, + { pkg: "com.lge.ia.task.smartsetting", label: "Smartsetting", description: "SmartSetting", safety: "safe" }, + { pkg: "com.lge.iftttmanager", label: "Iftttmanager", description: "LG Smart settings", safety: "safe" }, + { pkg: "com.lge.ime", label: "Ime", description: "LG Stock Keyboard", safety: "caution" }, + { pkg: "com.lge.ime.solution.handwriting", label: "Handwriting", description: "Handwriting feature on the LG keyboard", safety: "safe" }, + { pkg: "com.lge.ime.solution.text", label: "Text", description: "XT9", safety: "caution" }, + { pkg: "com.lge.launcher2.theme.optimus", label: "Optimus", description: "\"Optimus\" theme for the LG launcher (v2)", safety: "caution" }, + { pkg: "com.lge.leccp", label: "Leccp", description: "LG Connectivity Service", safety: "safe" }, + { pkg: "com.lge.lgaccount", label: "Lgaccount", description: "LG Account", safety: "safe" }, + { pkg: "com.lge.lgdrm.permission", label: "Permission", description: "Handle permissions for LG DRM (com.lge.drmservice).", safety: "caution" }, + { pkg: "com.lge.lginstallservies", label: "Lginstallservies", description: "LG Install Service", safety: "safe" }, + { pkg: "com.lge.lgmapui", label: "Lgmapui", description: "LGMapUI", safety: "safe" }, + { pkg: "com.lge.LGSetupView", label: "Lgsetupview", description: "Setup View", safety: "safe" }, + { pkg: "com.lge.lgworld", label: "Lgworld", description: "LG SmartWorld", safety: "safe" }, + { pkg: "com.lge.lifetracker", label: "Lifetracker", description: "LG Health (https://play.google.com/store/apps/details?id=com.lge.lifetracker)", safety: "safe" }, + { pkg: "com.lge.mirrorlink", label: "Mirrorlink", description: "MirrorLink", safety: "safe" }, + { pkg: "com.lge.mlt", label: "Mlt", description: "LG MLT", safety: "safe" }, + { pkg: "com.lge.mtalk.sf", label: "Sf", description: "Voice Mate Speech Pack", safety: "safe" }, + { pkg: "com.lge.musicshare", label: "Musicshare", description: "LG Audio Share", safety: "safe" }, + { pkg: "com.lge.myplace", label: "Myplace", description: "My Place", safety: "safe" }, + { pkg: "com.lge.myplace.engine", label: "Engine", description: "My Places Engine", safety: "safe" }, + { pkg: "com.lge.phonemanagement", label: "Phonemanagement", description: "Smart Doctor App", safety: "safe" }, + { pkg: "com.lge.privacylock", label: "Privacylock", description: "LG Content lock", safety: "safe" }, + { pkg: "com.lge.qhelp", label: "Qhelp", description: "Quick Help", safety: "safe" }, + { pkg: "com.lge.qhelp.application", label: "Application", description: "Quick Help application", safety: "safe" }, + { pkg: "com.lge.qmemoplus", label: "Qmemoplus", description: "LG QuickMemo+", safety: "safe" }, + { pkg: "com.lge.remote.setting", label: "Setting", description: "LG AirDrive", safety: "safe" }, + { pkg: "com.lge.sizechangable.weather", label: "Weather", description: "Music widget", safety: "safe" }, + { pkg: "com.lge.sizechangable.weather.platform", label: "Platform", description: "Weather Service", safety: "safe" }, + { pkg: "com.lge.sizechangable.weather.theme.optimus", label: "Optimus", description: "\"Optimus\" theme for the weather app/widget.", safety: "caution" }, + { pkg: "com.lge.smartdoctor.webview", label: "Webview", description: "Smart Doctor Webview", safety: "safe" }, + { pkg: "com.lge.smartshare", label: "Smartshare", description: "SmartShare", safety: "safe" }, + { pkg: "com.lge.smartshare.provider", label: "Provider", description: "Provider for Smart Share.", safety: "safe" }, + { pkg: "com.lge.smartsharepush", label: "Smartsharepush", description: "Smart Share Push", safety: "safe" }, + { pkg: "com.lge.snappage", label: "Snappage", description: "Snap Page", safety: "safe" }, + { pkg: "com.lge.springcleaning", label: "Springcleaning", description: "Smart cleaning", safety: "safe" }, + { pkg: "com.lge.sync", label: "Sync", description: "LG Bridge Service", safety: "safe" }, + { pkg: "com.lge.video.vr.wallpaper", label: "Wallpaper", description: "Video Wallpaper", safety: "safe" }, + { pkg: "com.lge.videoplayer", label: "Videoplayer", description: "LG Video Player", safety: "safe" }, + { pkg: "com.lge.videostudio", label: "Videostudio", description: "Quick Video Editor", safety: "safe" }, + { pkg: "com.lge.voicecare", label: "Voicecare", description: "LG Voice care", safety: "safe" }, + { pkg: "com.lge.vrplayer", label: "Vrplayer", description: "LG VR player", safety: "safe" }, + { pkg: "com.lge.wernicke", label: "Wernicke", description: "QVoice Engine", safety: "safe" }, + { pkg: "com.lge.wernicke.nlp", label: "Nlp", description: "Natural-language processing for LG intelligent assistant.", safety: "safe" }, + { pkg: "com.lge.wfd.spmirroring.source", label: "Source", description: "Provide wifi-direct feature", safety: "caution" }, + { pkg: "com.lge.wfds.service.v3", label: "V3", description: "Wifi-direct service (v3)", safety: "caution" }, + { pkg: "com.lge.wifi.p2p", label: "P2P", description: "LG P2p Service", safety: "safe" }, + { pkg: "com.lge.lgfmservice", label: "Lgfmservice", description: "Wifi Hotspot service", safety: "caution" }, + { pkg: "com.lge.bnr.launcher", label: "Launcher", description: "LG Mobile Switch Launcher", safety: "safe" }, + { pkg: "com.lge.clock", label: "Clock", description: "LG Clock app", safety: "caution" }, + { pkg: "com.lge.filemanager", label: "Filemanager", description: "Stock file manager", safety: "caution" }, + { pkg: "com.lge.homeselector", label: "Homeselector", description: "LG Home selector", safety: "safe" }, + { pkg: "com.lge.launcher2", label: "Launcher2", description: "LG Home (v2)", safety: "caution" }, + { pkg: "com.lge.launcher3", label: "Launcher3", description: "LG Home (v3)", safety: "caution" }, + { pkg: "com.lge.music", label: "Music", description: "Stock music player", safety: "safe" }, + { pkg: "com.lge.floatingbar", label: "Floatingbar", description: "LG Floating bar", safety: "safe" }, + { pkg: "com.lge.theme.titan", label: "Titan", description: "LG Titan theme (labelled 'Platinum' in the theming app).", safety: "caution" }, + { pkg: "com.lge.updatecenter", label: "Updatecenter", description: "LG Update Center", safety: "caution" }, + { pkg: "com.lge.theme.black", label: "Black", description: "LG Black theme.", safety: "caution" }, + { pkg: "com.lge.theme.white", label: "White", description: "LG White theme.", safety: "caution" }, + { pkg: "com.lge.theme.highcontrast", label: "Highcontrast", description: "LG High Contrast theme.", safety: "caution" }, + { pkg: "com.lge.signboard", label: "Signboard", description: "Always On Display.", safety: "caution" }, + { pkg: "com.lge.equalizer", label: "Equalizer", description: "Equalizer settings.", safety: "caution" }, + { pkg: "com.lge.exchange", label: "Exchange", description: "It looks like the Microsoft outlook/email in the logo. Believe this is some sort of microsoft integration.", safety: "caution" }, + { pkg: "com.lge.task", label: "Task", description: "Task storage", safety: "caution" }, + { pkg: "com.lge.gametuner", label: "Gametuner", description: "Settings/features for games, such as resolution and frame rate limiting.", safety: "caution" }, + { pkg: "com.lge.touchcontrol", label: "Touchcontrol", description: "I have never seen this menu in the settings app. I say its safe to remove. I can't think of any use case fo...", safety: "caution" }, + { pkg: "com.lge.wapservice", label: "Wapservice", description: "Icon looks like email configuration. I'd say it's safe to remove. Probably related to the stock email app.", safety: "caution" }, + { pkg: "com.lge.rcs.sharedsketch", label: "Sharedsketch", description: "I have no idea what it is, maybe some drawing program related to rcs. I removed it.", safety: "caution" }, + { pkg: "com.lge.faceglance.trustagent", label: "Trustagent", description: "Face Recognition", safety: "caution" }, + { pkg: "com.lge.app.floating.res", label: "Res", description: "Multitasking framework", safety: "caution" }, + ], + }, + { + name: "Nokia/HMD", + packages: [ + { pkg: "com.hmdglobal.datago.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for a Nokia telemetry package?", safety: "caution" }, + { pkg: "com.hmdglobal.support", label: "Support", description: "My Phone (https://play.google.com/store/apps/details?id=com.hmdglobal.support)", safety: "safe" }, + { pkg: "com.hmdglobal.camera2", label: "Camera2", description: "Nokia camera (https://play.google.com/store/apps/details?id=com.hmdglobal.camera2)", safety: "caution" }, + { pkg: "com.hmdglobal.datago", label: "Datago", description: "Sends diagnostic data to HMD (Company behind Nokia)?", safety: "safe" }, + { pkg: "com.hmdglobal.datago.overlay.base", label: "Base", description: "Theme overlay for a Nokia telemetry package?", safety: "caution" }, + ], + }, + { + name: "Asus", + packages: [ + { pkg: "com.asus.calculator", label: "Calculator", description: "Calculator - unit converter (https://play.google.com/store/apps/details?id=com.asus.calculator)", safety: "safe" }, + { pkg: "com.asus.ia.asusapp", label: "Asusapp", description: "My Asus (https://play.google.com/store/apps/details?id=com.asus.ia.asusapp)", safety: "safe" }, + { pkg: "com.asus.soundrecorder", label: "Soundrecorder", description: "ASUS Sound recorder (https://play.google.com/store/apps/details?id=com.asus.soundrecorder)", safety: "safe" }, + { pkg: "com.asus.easylauncher", label: "Easylauncher", description: "Asus Easy Mode (https://play.google.com/store/apps/details?id=com.asus.easylauncher)", safety: "safe" }, + { pkg: "com.asus.userfeedback", label: "Userfeedback", description: "ZenUI Help (https://play.google.com/store/apps/details?id=com.asus.userfeedback)", safety: "safe" }, + ], + }, + { + name: "Carriers", + packages: [ + { pkg: "com.mobitv.client.tmobiletvhd", label: "Tmobiletvhd", description: "T-Mobile TV (discontinued, replaced by nl.tmobiletv.vinson) provided by mobitv (https://en.wikipedia.org/wi...", safety: "safe" }, + { pkg: "com.tmobile.pr.adapt", label: "Adapt", description: "Diagnostic tool.", safety: "safe" }, + { pkg: "com.tmobile.pr.mytmobile", label: "Mytmobile", description: "T-mobile app (https://play.google.com/store/apps/details?id=com.tmobile.pr.mytmobile)", safety: "safe" }, + { pkg: "com.tmobile.services.nameid", label: "Nameid", description: "Name ID T-Mobile (powered by Hiya or cequint if on Samsung devices)", safety: "safe" }, + { pkg: "com.tmobile.simlock", label: "Simlock", description: "Device Unlock.", safety: "safe" }, + { pkg: "com.tmobile.vvm.application", label: "Application", description: "T-Mobile Visual VoiceMail (https://play.google.com/store/apps/details?id=com.tmobile.vvm.application)", safety: "safe" }, + { pkg: "com.whitepages.nameid.tmobile", label: "Tmobile", description: "T-mobile NAME ID by WhitePages (https://www.whitepages.com/)", safety: "safe" }, + { pkg: "us.com.dt.iq.appsource.tmobile", label: "Tmobile", description: "App Source (discontinued)", safety: "safe" }, + { pkg: "com.asurion.android.verizon.vms", label: "Vms", description: "Verizon Digital Secure (https://play.google.com/store/apps/details?id=com.asurion.android.verizon.vms)", safety: "safe" }, + { pkg: "com.customermobile.preload.vzw", label: "Vzw", description: "Verizon Store/Retail Demo Mode", safety: "safe" }, + { pkg: "com.LogiaGroup.LogiaDeck", label: "Logiadeck", description: "Mobile Services Manager", safety: "safe" }, + { pkg: "com.motricity.verizon.ssodownloadable", label: "Ssodownloadable", description: "Verizon Login by Motricity (now Voltari)", safety: "safe" }, + { pkg: "com.securityandprivacy.android.verizon.vms", label: "Vms", description: "Digital Secure (https://play.google.com/store/apps/details?id=com.securityandprivacy.android.verizon.vms&hl...", safety: "safe" }, + { pkg: "com.telecomsys.directedsms.android.SCG", label: "Scg", description: "Verizon Location Agent", safety: "safe" }, + { pkg: "com.vcast.mediamanager", label: "Mediamanager", description: "Verizon Cloud (https://play.google.com/store/apps/details?id=com.vcast.mediamanager)", safety: "safe" }, + { pkg: "com.verizon.llkagent", label: "Llkagent", description: "Used for Verizon store demo mode.", safety: "safe" }, + { pkg: "com.verizon.loginengine.unbranded", label: "Unbranded", description: "Carrier Login Engine", safety: "safe" }, + { pkg: "com.verizon.messaging.vzmsgs", label: "Vzmsgs", description: "Verizon Messages (https://play.google.com/store/apps/details?id=com.verizon.messaging.vzmsgs)", safety: "safe" }, + { pkg: "com.verizon.mips.services", label: "Services", description: "My Verizon Services", safety: "caution" }, + { pkg: "com.verizon.obdm_permissions", label: "Obdm Permissions", description: "D-MAT.", safety: "safe" }, + { pkg: "com.verizon.permissions.vzwappapn", label: "Vzwappapn", description: "Custom permissions used to set Verizon APN?", safety: "safe" }, + { pkg: "com.verizon.vzwavs", label: "Vzwavs", description: "Has a scary list of permissions. Does seems to break anything if removed", safety: "safe" }, + { pkg: "com.verizontelematics.verizonhum", label: "Verizonhum", description: "Hum Family Locator (https://play.google.com/store/apps/details?id=com.verizontelematics.verizonhum)", safety: "safe" }, + { pkg: "com.vznavigator.Generic", label: "Generic", description: "VZ Navigator (GPS app) (https://play.google.com/store/apps/details?id=com.vznavigator.Generic)", safety: "safe" }, + { pkg: "com.vzw.apnlib", label: "Apnlib", description: "Kind of library for Verizon APN ?", safety: "safe" }, + { pkg: "com.vzw.apnservice", label: "Apnservice", description: "APN Services.", safety: "caution" }, + { pkg: "com.vzw.hss.myverizon", label: "Myverizon", description: "Verizon Call Filter (https://play.google.com/store/apps/details?id=com.vzw.ecid)", safety: "safe" }, + { pkg: "com.vzw.hss.widgets.infozone.large", label: "Large", description: "My InfoZone Widget", safety: "safe" }, + { pkg: "com.vzw.qualitydatalog", label: "Qualitydatalog", description: "Logging stuff", safety: "safe" }, + { pkg: "com.motorola.vzw.mot5gmod", label: "Mot5Gmod", description: "5G Moto Mod (https://play.google.com/store/apps/details?id=com.motorola.mot5gmod)", safety: "safe" }, + { pkg: "com.motorola.vzw.phone.extensions", label: "Extensions", description: "Free HD wallpaper from verizon", safety: "safe" }, + { pkg: "com.motorola.service.vzw.entitlement", label: "Entitlement", description: "Deleting this package whill disable Hotspot functionality if you're a Verizon client.", safety: "caution" }, + { pkg: "com.motorola.vzw.cloudsetup", label: "Cloudsetup", description: "Cloud setup", safety: "safe" }, + { pkg: "com.motorola.ltebroadcastservices_vzw", label: "Ltebroadcastservices Vzw", description: "LTE Broadcast services from Verizon. Allows your phone to receive broadcast message from Verizon?", safety: "safe" }, + { pkg: "com.motorola.vzw.loader", label: "Loader", description: "????", safety: "safe" }, + { pkg: "com.motorola.omadm.vzw", label: "Vzw", description: "OMA Device Management for Verizon", safety: "safe" }, + { pkg: "com.motorola.vzw.provider", label: "Provider", description: "????", safety: "safe" }, + { pkg: "com.motorola.visualvoicemail", label: "Visualvoicemail", description: "Verizon Visual Voicemail (https://play.google.com/store/apps/details?id=com.motorola.visualvoicemail)", safety: "caution" }, + { pkg: "com.android.sprint.hiddenmenuapp", label: "Hiddenmenuapp", description: "Lets you access hidden features tests/settings (you need to type a special code in the dialer)", safety: "safe" }, + { pkg: "com.asurion.home.sprint.vpl", label: "Vpl", description: "Tech Expert (for VPL devices/employees) ?", safety: "safe" }, + { pkg: "com.asurion.home.sprint", label: "Sprint", description: "Sprint Protect", safety: "safe" }, + { pkg: "com.hyperlync.Sprint.Backup", label: "Backup", description: "Sprint Backup\" (https://play.google.com/store/apps/details?id=com.hyperlync.Sprint.Backup)", safety: "safe" }, + { pkg: "com.hyperlync.Sprint.CloudBinder", label: "Cloudbinder", description: "Sprint Cloud Binder (https://play.google.com/store/apps/details?id=com.hyperlync.Sprint.CloudBinder)", safety: "safe" }, + { pkg: "com.locationlabs.finder.sprint", label: "Sprint", description: "Sprint Family Locator (https://play.google.com/store/apps/details?id=com.locationlabs.finder.sprint)", safety: "safe" }, + { pkg: "com.mobitv.client.sprinttvng", label: "Sprinttvng", description: "Sprint TV & Movies provided by mobitv (https://en.wikipedia.org/wiki/MobiTV)", safety: "safe" }, + { pkg: "com.motorola.omadm.sprint", label: "Sprint", description: "Configuration of the device (including first time use), enabling and disabling features provided by carriers.", safety: "safe" }, + { pkg: "com.motorola.sprintwfc", label: "Sprintwfc", description: "Sprint Wifi Calling", safety: "safe" }, + { pkg: "com.sec.sprint.wfcstub", label: "Wfcstub", description: "Seems to be related to Wifi-Calling on Samsung phone.", safety: "safe" }, + { pkg: "com.sprint.android.musicplus2033.vpl", label: "Vpl", description: "Sprint Music Plus (https://play.google.com/store/apps/details?id=com.sprint.android.musicplus2033)", safety: "safe" }, + { pkg: "com.sprint.ecid", label: "Ecid", description: "Enhanced Caller ID", safety: "safe" }, + { pkg: "com.sprint.care", label: "Care", description: "My Sprint (https://play.google.com/store/apps/details?id=com.sprint.care)", safety: "safe" }, + { pkg: "com.sprint.ce.updater", label: "Updater", description: "Mobile Installer", safety: "safe" }, + { pkg: "com.sprint.fng", label: "Fng", description: "Sprint Spot (https://play.google.com/store/apps/details?id=com.sprint.fng)", safety: "safe" }, + { pkg: "com.sprint.international.message", label: "Message", description: "Sprint Worldwide", safety: "safe" }, + { pkg: "com.sprint.psdg.sw", label: "Sw", description: "Carrier Setup Wizard", safety: "safe" }, + { pkg: "com.sprint.ms.cdm", label: "Cdm", description: "Sprint Device Manager", safety: "safe" }, + { pkg: "com.sprint.ms.cnap", label: "Cnap", description: "Caller ID", safety: "safe" }, + { pkg: "com.sprint.ms.smf.services", label: "Services", description: "Sprint Hub (https://play.google.com/store/apps/details?id=com.sprint.ms.smf.services)", safety: "safe" }, + { pkg: "com.sprint.safefound.vpl", label: "Vpl", description: "Safe & Found (https://play.google.com/store/apps/details?id=com.sprint.safefound)", safety: "safe" }, + { pkg: "com.sprint.topup", label: "Topup", description: "Doesn't exist anymore? Now Sprint Pay (https://play.google.com/store/apps/details?id=com.sprintpay)", safety: "safe" }, + { pkg: "com.sprint.w.installer", label: "Installer", description: "Sprint ID", safety: "safe" }, + { pkg: "com.sprint.w.v8", label: "V8", description: "Old app Discover App (discontinued / new package name)", safety: "safe" }, + { pkg: "com.sprint.zone", label: "Zone", description: "My Sprint Launcher?", safety: "safe" }, + { pkg: "com.aetherpal.attdh.se", label: "Se", description: "Device Help for AT&T Samsung device", safety: "safe" }, + { pkg: "com.aetherpal.attdh.zte", label: "Zte", description: "Device Help for AT&T ZTE devices.", safety: "safe" }, + { pkg: "net.aetherpal.device", label: "Device", description: "AT&T Remote Support provided by aetherpal (was acquired by VMware)", safety: "safe" }, + { pkg: "com.asurion.android.mobilerecovery.att", label: "Att", description: "AT&T Protect Plus (discontinued. Replaced by AT&T ProTech : com.asurion.android.protech.att)", safety: "safe" }, + { pkg: "com.asurion.android.protech.att", label: "Att", description: "AT&T ProTech (https://play.google.com/store/apps/details?id=com.asurion.android.protech.att)", safety: "safe" }, + { pkg: "com.att.android.attsmartwifi", label: "Attsmartwifi", description: "AT&T Smart Wi-Fi (https://play.google.com/store/apps/details?id=com.att.android.attsmartwifi)", safety: "safe" }, + { pkg: "com.att.callprotect", label: "Callprotect", description: "AT&T Call Protect (https://play.google.com/store/apps/details?id=com.att.callprotect)", safety: "safe" }, + { pkg: "com.att.csoiam.mobilekey", label: "Mobilekey", description: "AT&T Sign in Helper (https://play.google.com/store/apps/details?id=com.att.csoiam.mobilekey)", safety: "safe" }, + { pkg: "com.att.dh", label: "Dh", description: "Device Help (https://play.google.com/store/apps/details?id=com.att.dh)", safety: "safe" }, + { pkg: "com.att.dtv.shaderemote", label: "Shaderemote", description: "DIRECTV Remote App (https://play.google.com/store/apps/details?id=com.att.dtv.shaderemote)", safety: "safe" }, + { pkg: "com.att.iqi", label: "Iqi", description: "Carrier IQ / Device Health", safety: "safe" }, + { pkg: "com.att.mobiletransfer", label: "Mobiletransfer", description: "AT&T Mobile Transfer", safety: "safe" }, + { pkg: "com.att.myWireless", label: "Mywireless", description: "My AT&T (https://play.google.com/store/apps/details?id=com.att.myWireless)", safety: "safe" }, + { pkg: "com.att.mobilesecurity", label: "Mobilesecurity", description: "AT&T Mobile Security (https://play.google.com/store/apps/details?id=com.att.mobilesecurity)", safety: "safe" }, + { pkg: "com.att.mobile.android.vvm", label: "Vvm", description: "AT&T Visual Voicemail (https://play.google.com/store/apps/details?id=com.att.mobile.android.vvm)", safety: "safe" }, + { pkg: "com.att.personalcloud", label: "Personalcloud", description: "AT&T Personal Cloud (https://play.google.com/store/apps/details?id=com.att.personalcloud)", safety: "safe" }, + { pkg: "com.att.tv", label: "Tv", description: "AT&T TV (https://play.google.com/store/apps/details?id=com.att.tv)", safety: "safe" }, + { pkg: "com.att.tv.watchtv", label: "Watchtv", description: "AT&T WatchTV (https://play.google.com/store/apps/details?id=com.att.tv.watchtv)", safety: "safe" }, + { pkg: "com.matchboxmobile.wisp", label: "Wisp", description: "AT&T Hot Spots", safety: "safe" }, + { pkg: "com.dti.att", label: "Att", description: "AT&T App Select", safety: "safe" }, + { pkg: "com.locationlabs.cni.att", label: "Att", description: "AT&T Smart Limits", safety: "safe" }, + { pkg: "com.motorola.att.phone.extensions", label: "Extensions", description: "Provide acess to AT&T extensions in you dialer. I'm not sure tho. It's only a supposition.", safety: "safe" }, + { pkg: "com.motorola.attvowifi", label: "Attvowifi", description: "AT&T Wifi-calling", safety: "safe" }, + { pkg: "com.wavemarket.waplauncher", label: "Waplauncher", description: "AT&T Secure Family (https://play.google.com/store/apps/details?id=com.wavemarket.waplauncher)", safety: "safe" }, + { pkg: "com.samsung.attvvm", label: "Attvvm", description: "Visual Voicemail", safety: "safe" }, + { pkg: "com.sec.android.app.ewidgetatt", label: "Ewidgetatt", description: "Entertainment Widget", safety: "safe" }, + { pkg: "com.sec.omadm", label: "Omadm", description: "OMADM", safety: "caution" }, + { pkg: "com.sec.omadmspr.syncmlphoneif", label: "Syncmlphoneif", description: "OMADM Phone Interface?", safety: "caution" }, + { pkg: "com.synchronoss.dcs.att.r2g", label: "R2G", description: "AT&T Ready2Go (discontinued)", safety: "safe" }, + { pkg: "fr.bouyguestelecom.ecm.android", label: "Android", description: "Espace Client (https://play.google.com/store/apps/details?id=fr.bouyguestelecom.ecm.android)", safety: "safe" }, + { pkg: "fr.bouyguestelecom.tv.android", label: "Android", description: "B.tv (https://play.google.com/store/apps/details?id=fr.bouyguestelecom.tv.android)", safety: "safe" }, + { pkg: "fr.bouyguestelecom.vvmandroid", label: "Vvmandroid", description: "No description available", safety: "safe" }, + { pkg: "com.orange.aura.oobe", label: "Oobe", description: "Orange Manual Selector", safety: "safe" }, + { pkg: "com.orange.mail.fr", label: "Fr", description: "Mail Orange (https://play.google.com/store/apps/details?id=com.orange.mail.fr)", safety: "safe" }, + { pkg: "com.orange.miorange", label: "Miorange", description: "Lets you access to your Orange account", safety: "safe" }, + { pkg: "com.orange.mylivebox.fr", label: "Fr", description: "Ma Livebox (https://play.google.com/store/apps/details?id=com.orange.mylivebox.fr)", safety: "safe" }, + { pkg: "com.orange.mysosh", label: "Mysosh", description: "My Sosh (https://play.google.com/store/apps/details?id=com.orange.mysosh)", safety: "safe" }, + { pkg: "com.orange.orangeetmoi", label: "Orangeetmoi", description: "Orange Et Moi (https://play.google.com/store/apps/details?id=com.orange.orangeetmoi)", safety: "safe" }, + { pkg: "com.orange.owtv", label: "Owtv", description: "TV d'Orange (https://play.google.com/store/apps/details?id=com.orange.owtv)", safety: "safe" }, + { pkg: "com.orange.tdd", label: "Tdd", description: "Transfert de donn\u00e9es (https://play.google.com/store/apps/details?id=com.orange.tdd)", safety: "safe" }, + { pkg: "com.orange.update", label: "Update", description: "Handles Orange apps updates.", safety: "safe" }, + { pkg: "com.orange.update.OrangeUpdateApplication", label: "Orangeupdateapplication", description: "Obviously related to update...", safety: "safe" }, + { pkg: "com.orange.vvm", label: "Vvm", description: "Messagerie vocale visuelle (https://play.google.com/store/apps/details?id=com.orange.vvm)", safety: "safe" }, + { pkg: "com.orange.wifiorange", label: "Wifiorange", description: "Mon R\u00e9seau (https://play.google.com/store/apps/details?id=com.orange.wifiorange)", safety: "safe" }, + { pkg: "fr.orange.cineday", label: "Cineday", description: "Orange cineday (https://play.google.com/store/apps/details?id=fr.orange.cineday)", safety: "safe" }, + { pkg: "com.sfr.android.moncompte", label: "Moncompte", description: "SFR & Moi (https://play.google.com/store/apps/details?id=com.sfr.android.moncompte)", safety: "safe" }, + { pkg: "com.sfr.android.sfrcloud", label: "Sfrcloud", description: "SFR Cloud (https://play.google.com/store/apps/details?id=com.sfr.android.sfrcloud)", safety: "safe" }, + { pkg: "com.sfr.android.sfrmail", label: "Sfrmail", description: "SFR Mail (https://play.google.com/store/apps/details?id=com.sfr.android.sfrmail)", safety: "safe" }, + { pkg: "com.sfr.android.sfrplay", label: "Sfrplay", description: "SFR Play (https://play.google.com/store/apps/details?id=com.sfr.android.sfrplay)", safety: "safe" }, + { pkg: "com.sfr.android.vvm", label: "Vvm", description: "SFR R\u00e9pondeur + (https://play.google.com/store/apps/details?id=com.sfr.android.vvm)", safety: "safe" }, + { pkg: "de.telekom.tsc", label: "Tsc", description: "AppEnabler", safety: "safe" }, + { pkg: "com.aura.oobe.samsung.gl", label: "Gl", description: "AppCloud", safety: "safe" }, + { pkg: "com.aura.oobe.samsung", label: "Samsung", description: "AppCloud", safety: "safe" }, + { pkg: "com.verizon.obdm", label: "Obdm", description: "It's a set of metrics-related modules. Google Play uses the version of the Telemetry module to determine", safety: "safe" }, + { pkg: "com.verizon.permissions.appdirectedsms", label: "Appdirectedsms", description: "Custom permissions for some verizon stuff?", safety: "safe" }, + { pkg: "com.vzw.ecid", label: "Ecid", description: "Verizon Call Filter (https://play.google.com/store/apps/details?id=com.vzw.ecid)", safety: "safe" }, + { pkg: "com.motorola.mot5gmod", label: "Mot5Gmod", description: "5G Moto Mod (https://play.google.com/store/apps/details?id=com.motorola.mot5gmod)", safety: "safe" }, + { pkg: "com.motorola.vzw.pco.extensions.pcoreceiver", label: "Pcoreceiver", description: "Protocol Configuration Options.", safety: "safe" }, + { pkg: "com.asurion.android.mobilerecovery.sprint.vpl", label: "Vpl", description: "Sprint Protect", safety: "safe" }, + { pkg: "com.asurion.android.mobilerecovery.sprint", label: "Sprint", description: "Sprint Protect", safety: "safe" }, + { pkg: "com.locationlabs.finder.sprint.vpl", label: "Vpl", description: "Sprint Family Locator (https://play.google.com/store/apps/details?id=com.locationlabs.finder.sprint)", safety: "safe" }, + { pkg: "com.mobolize.sprint.securewifi", label: "Securewifi", description: "Secure Wifi (https://play.google.com/store/apps/details?id=com.mobolize.sprint.securewifi)", safety: "safe" }, + { pkg: "com.sprint.android.musicplus2033", label: "Musicplus2033", description: "Sprint Music Plus (https://play.google.com/store/apps/details?id=com.sprint.android.musicplus2033)", safety: "safe" }, + { pkg: "com.sprint.safefound", label: "Safefound", description: "Safe & Found (https://play.google.com/store/apps/details?id=com.sprint.safefound)", safety: "safe" }, + { pkg: "uk.co.ee.myee", label: "Myee", description: "Myee app (https://play.google.com/store/apps/details?id=uk.co.ee.myee)", safety: "safe" }, + { pkg: "ca.bell.wt.android.tunesappswidget", label: "Tunesappswidget", description: "App Widget (https://play.google.com/store/apps/details?id=ca.bell.wt.android.tunesappswidget)", safety: "safe" }, + ], + }, + { + name: "AOSP", + packages: [ + { pkg: "com.android.bluetoothmidiservice", label: "Bluetoothmidiservice", description: "Provides classes for using the MIDI protocol over Bluetooth. Safe to remove if you don't plan to connect MI...", safety: "safe" }, + { pkg: "com.android.bookmarkprovider", label: "Bookmarkprovider", description: "Only exists for compatibility reasons to prevent apps querying it from getting null cursors they do not exp...", safety: "caution" }, + { pkg: "com.android.carrierdefaultapp", label: "Carrierdefaultapp", description: "This package is a generic solution that allows carriers to indicate when a device has run OOB(Out Of Balanc...", safety: "caution" }, + { pkg: "com.android.companiondevicemanager", label: "Companiondevicemanager", description: "Companion Device Manager", safety: "caution" }, + { pkg: "com.android.dreams.basic", label: "Basic", description: "Daydream (not Google Daydream VR) is an interactive screensaver mode built into Android.", safety: "caution" }, + { pkg: "com.android.dreams.phototable", label: "Phototable", description: "Photographic screensavers", safety: "safe" }, + { pkg: "com.android.dreams.phototable.overlay", label: "Overlay", description: "Overlay for the phototable daydream? Overlays are usually themes, but not sure about this one.", safety: "caution" }, + { pkg: "com.android.egg", label: "Egg", description: "Android's easter egg feature (spam-tap on the android version in the settings)", safety: "safe" }, + { pkg: "com.android.galaxy4", label: "Galaxy4", description: "Built-in Dynamic wallpaper", safety: "safe" }, + { pkg: "com.android.htmlviewer", label: "Htmlviewer", description: "Allows apps to load URLs into the WebView, which allows web content to be displayed directly in the app..", safety: "caution" }, + { pkg: "com.android.magicsmoke", label: "Magicsmoke", description: "\"Magic smoke\" Live wallpaper.", safety: "safe" }, + { pkg: "com.android.musicvis", label: "Musicvis", description: "Music Visualization Wallpapers", safety: "safe" }, + { pkg: "com.android.noisefield", label: "Noisefield", description: "\"Noise filed\" live wallpaper.", safety: "safe" }, + { pkg: "com.android.phasebeam", label: "Phasebeam", description: "\"Phase beam\" live wallpaper", safety: "safe" }, + { pkg: "com.android.providers.partnerbookmarks", label: "Partnerbookmarks", description: "Provides bookmarks about partners of Google in Chrome.", safety: "safe" }, + { pkg: "com.android.runintest.ddrtest", label: "Ddrtest", description: "DDR Test", safety: "safe" }, + { pkg: "com.android.simappdialog", label: "Simappdialog", description: "Sim App Dialog", safety: "caution" }, + { pkg: "com.android.soundrecorder", label: "Soundrecorder", description: "AOSP Sound recorder. OEMs often use their own solution", safety: "caution" }, + { pkg: "com.android.stk2", label: "Stk2", description: "SIM toolkit", safety: "caution" }, + { pkg: "com.android.stk", label: "Stk", description: "SIM toolkit", safety: "caution" }, + { pkg: "com.android.traceur", label: "Traceur", description: "System Tracing", safety: "safe" }, + { pkg: "com.android.wallpaper.holospiral", label: "Holospiral", description: "\"Holo spiral\" Live wallpaper.", safety: "caution" }, + { pkg: "com.android.wallpaper.livepicker.overlay", label: "Overlay", description: "Overlay for live wallpaper picker? Overlays are usually themes, but not sure about this one.", safety: "caution" }, + { pkg: "com.android.wallpapercropper", label: "Wallpapercropper", description: "Wallpaper cropper.", safety: "caution" }, + { pkg: "com.example.android.notepad", label: "Notepad", description: "(Bad) notepad app.", safety: "caution" }, + { pkg: "android.auto_generated_vendor_", label: "Auto Generated Vendor ", description: "Auto generated vendor's stuff for Android Auto (https://www.android.com/intl/en_en/auto/)", safety: "safe" }, + { pkg: "android.auto_generated_rro__", label: "Auto Generated Rro ", description: "rro = Runtime Resources Overlay.", safety: "safe" }, + { pkg: "com.android.apps.tag", label: "Tag", description: "Support for NFC tags interactions (5 permissions, Contacts/Phone On by default).", safety: "caution" }, + { pkg: "com.android.backupconfirm", label: "Backupconfirm", description: "Restores Google settings with Google Backup restore.", safety: "caution" }, + { pkg: "com.android.bio.face.service", label: "Service", description: "Handles facial regognition.", safety: "caution" }, + { pkg: "com.android.bluetooth", label: "Bluetooth", description: "Bluetooth service", safety: "caution" }, + { pkg: "com.android.browser", label: "Browser", description: "Mi Browser", safety: "caution" }, + { pkg: "com.android.browser.provider", label: "Provider", description: "Old package (2014). Chrome bookmarks provider? Injects Picasa URL (http://picasaweb.google.com) in the Chro...", safety: "caution" }, + { pkg: "com.android.calendar", label: "Calendar", description: "AOSP Calendar app", safety: "caution" }, + { pkg: "com.android.calculator2", label: "Calculator2", description: "AOSP calculator app", safety: "caution" }, + { pkg: "com.android.calllogbackup", label: "Calllogbackup", description: "Call Logs Backup/Restore feature.", safety: "safe" }, + { pkg: "com.android.captiveportallogin", label: "Captiveportallogin", description: "Support for captive portal: https://en.wikipedia.org/wiki/Captive_portal", safety: "caution" }, + { pkg: "com.android.carrierconfig", label: "Carrierconfig", description: "Dynamically provides configuration for the carrier network.", safety: "caution" }, + { pkg: "com.android.cellbroadcastreceiver", label: "Cellbroadcastreceiver", description: "Cell broadcast is designed to deliver messages to multiple users in an area.", safety: "caution" }, + { pkg: "com.android.contacts", label: "Contacts", description: "AOSP Contacts", safety: "caution" }, + { pkg: "com.android.cts.priv.ctsshim", label: "Ctsshim", description: "Compatibility Test Service. Verifies certain upgrade scenarios. Disabling could mess with OTA updates.", safety: "caution" }, + { pkg: "com.android.deskclock", label: "Deskclock", description: "AOSP Clock app", safety: "caution" }, + { pkg: "com.android.email", label: "Email", description: "Xiaomi closed-source email app based on the AOSP version. Really confusing package name.", safety: "caution" }, + { pkg: "com.android.emergency", label: "Emergency", description: "Emergency rescue", safety: "caution" }, + { pkg: "com.android.exchange", label: "Exchange", description: "Handles all aspects of starting, maintaining, and stopping the various sync adapters for the email accounts.", safety: "caution" }, + { pkg: "com.android.facelock", label: "Facelock", description: "Face Unlock", safety: "caution" }, + { pkg: "com.android.gallery3d", label: "Gallery3D", description: "Xiaomi Gallery app", safety: "caution" }, + { pkg: "com.android.hotspot2", label: "Hotspot2", description: "Provides wifi tethering (lets you share your mobile device's Internet connection with other devices)", safety: "caution" }, + { pkg: "com.android.inputdevices", label: "Inputdevices", description: "Only contains a receiver named \"Android keyboard\", possibly for an external keyboard.", safety: "caution" }, + { pkg: "com.android.inputmethod.latin", label: "Latin", description: "AOSP keyboard (not Google Keyboard)", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.corner", label: "Corner", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.double", label: "Double", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.hole", label: "Hole", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.noCutout", label: "Nocutout", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.tall", label: "Tall", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.display.cutout.emulation.waterfall", label: "Waterfall", description: "Display cutout variant", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.gestural", label: "Gestural", description: "Gesture navigation", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.gestural_extra_wide_back", label: "Gestural Extra Wide Back", description: "Enables a setting increasing how far you need to move your finger to trigger the back gesture.", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.gestural_narrow_back", label: "Gestural Narrow Back", description: "Enables a setting decreasing how far you need to move your finger to trigger the back gesture.", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.gestural_wide_back", label: "Gestural Wide Back", description: "Enables a setting increasing how far you need to move your finger to trigger the back gesture.", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.twobutton", label: "Twobutton", description: "Enables a setting for using just 2 buttons in the system navbar?", safety: "caution" }, + { pkg: "com.android.internal.systemui.navbar.threebutton", label: "Threebutton", description: "The default system navbar? It's what you use when you don't use gesture navigation.", safety: "caution" }, + { pkg: "com.android.musicfx", label: "Musicfx", description: "Audio EQ(equalizer). Some 3rd-party music apps can use it to provide you EQ features.", safety: "caution" }, + { pkg: "com.android.mms", label: "Mms", description: "AOSP SMS app.", safety: "safe" }, + { pkg: "com.android.nfc", label: "Nfc", description: "NFC Service", safety: "caution" }, + { pkg: "com.android.ons", label: "Ons", description: "Opportunistic Network Service", safety: "caution" }, + { pkg: "com.android.managedprovisioning", label: "Managedprovisioning", description: "Work Setup/Work profile setup", safety: "caution" }, + { pkg: "com.android.otaprovisioningclient", label: "Otaprovisioningclient", description: "OTA Access Point Configuration", safety: "caution" }, + { pkg: "com.android.pacprocessor", label: "Pacprocessor", description: "PAC (Proxy Auto-Config) is a file which defines how an app can automatically find the correct proxy server ...", safety: "caution" }, + { pkg: "com.android.phone.recorder", label: "Recorder", description: "AOSP Call recorder function. Most of the time OEM use their own code for this.", safety: "caution" }, + { pkg: "com.android.printservice.recommendation", label: "Recommendation", description: "Recommends 3rd-party print services apps in the PlayStore. Printing will probably still works without (by u...", safety: "caution" }, + { pkg: "com.android.printspooler", label: "Printspooler", description: "Print Spooler", safety: "caution" }, + { pkg: "com.android.providers.blockednumber", label: "Blockednumber", description: "Handles blocked number storage.", safety: "caution" }, + { pkg: "com.android.providers.calendar", label: "Calendar", description: "Calendar Storage", safety: "caution" }, + { pkg: "com.android.providers.drm", label: "Drm", description: "DRM Protected Content Storage", safety: "caution" }, + { pkg: "com.android.providers.userdictionary", label: "Userdictionary", description: "Handles user dictionary for keyboard apps.", safety: "caution" }, + { pkg: "com.android.proxyhandler", label: "Proxyhandler", description: "Handles proxy config.", safety: "caution" }, + { pkg: "com.android.quicksearchbox", label: "Quicksearchbox", description: "Google quick search box.", safety: "safe" }, + { pkg: "com.android.se", label: "Se", description: "SecureElementApplication", safety: "caution" }, + { pkg: "com.android.settings.intelligence", label: "Intelligence", description: "Settings Suggestions", safety: "caution" }, + { pkg: "com.android.sharedstoragebackup", label: "Sharedstoragebackup", description: "Used during backup. Backs up the shared storage? (files accessible by every app with STORAGE permission)", safety: "caution" }, + { pkg: "com.android.smspush", label: "Smspush", description: "This service is used to push/send specially formatted SMS messages that display an alert message to the use...", safety: "caution" }, + { pkg: "com.android.systemui.theme.dark", label: "Dark", description: "Enables you to use Android dark theme.", safety: "caution" }, + { pkg: "com.android.theme.icon_pack.rounded.systemui", label: "Systemui", description: "Android icons pack [Rounded].", safety: "caution" }, + { pkg: "com.android.timezone.updater", label: "Updater", description: "Time Zone Updater", safety: "caution" }, + { pkg: "com.android.voicedialer", label: "Voicedialer", description: "AOSP Voice dialer. Lets you call someone or open an app with your voice from the dialer.", safety: "caution" }, + { pkg: "com.android.wallpaperpicker", label: "Wallpaperpicker", description: "Enables you to pick a wallpaper.", safety: "caution" }, + { pkg: "com.android.wallpaperbackup", label: "Wallpaperbackup", description: "Backup your wallapaper and load this backup instead of the original file in case you delete it.", safety: "caution" }, + { pkg: "com.android.webview", label: "Webview", description: "AOSP webview", safety: "caution" }, + { pkg: "com.android.certinstaller", label: "Certinstaller", description: "Certificate installer", safety: "keep" }, + { pkg: "com.android.defcontainer", label: "Defcontainer", description: "Package Access Helper", safety: "keep" }, + { pkg: "com.android.documentsui", label: "Documentsui", description: "Same as com.google.android.documentsui? Here's that description:", safety: "caution" }, + { pkg: "com.android.documentsui.a_overlay", label: "A Overlay", description: "Some overlay for for \"Files\"?", safety: "caution" }, + { pkg: "com.android.dynsystem", label: "Dynsystem", description: "Dynamic System Updates", safety: "keep" }, + { pkg: "com.android.externalstorage", label: "Externalstorage", description: "Needed by apps to access external storage (like memory cards).", safety: "caution" }, + { pkg: "com.android.keychain", label: "Keychain", description: "Enables apps to use system wide credential KeyChain (shared credentials between apps)", safety: "keep" }, + { pkg: "com.android.localtransport", label: "Localtransport", description: "Backup transport for stashing stuff into a known location on disk, and later restoring from there.", safety: "keep" }, + { pkg: "com.android.location.fused", label: "Fused", description: "Manages underlying location technologies, such as GPS and Wi-Fi.", safety: "keep" }, + { pkg: "com.android.mms.service", label: "Service", description: "Provides support for sending MMS.", safety: "keep" }, + { pkg: "com.android.mtp", label: "Mtp", description: "MTP Host", safety: "keep" }, + { pkg: "com.android.packageinstaller", label: "Packageinstaller", description: "Handles installation, upgrade, and removal of applications.", safety: "keep" }, + { pkg: "com.android.provision", label: "Provision", description: "Provisioning is the process of setting up a network connection that will allow new users.", safety: "keep" }, + { pkg: "com.android.phone.a_overlay", label: "A Overlay", description: "AOSP code for dialer app features.", safety: "keep" }, + { pkg: "com.android.providers.applications", label: "Applications", description: "Provides a list of installed applications.", safety: "keep" }, + { pkg: "com.android.providers.contacts", label: "Contacts", description: "Contacts Storage", safety: "caution" }, + { pkg: "com.android.providers.downloads", label: "Downloads", description: "Downloads Manager", safety: "keep" }, + { pkg: "com.android.providers.downloads.ui", label: "Ui", description: "Downloads", safety: "keep" }, + { pkg: "com.android.providers.media", label: "Media", description: "Provider of media files (images, videos and such).", safety: "caution" }, + { pkg: "com.android.providers.settings", label: "Settings", description: "Provider for settings app data.", safety: "keep" }, + { pkg: "com.android.providers.telephony", label: "Telephony", description: "Provider for telephony data.", safety: "keep" }, + { pkg: "com.android.server.telecom", label: "Telecom", description: "Manages calls via your network provider or SIM and controls the phone modem?", safety: "keep" }, + { pkg: "com.android.server.telecom.a_overlay", label: "A Overlay", description: "Overlay for com.android.server.telecom?", safety: "keep" }, + { pkg: "com.android.settings", label: "Settings", description: "AOSP Settings app.", safety: "keep" }, + { pkg: "com.android.shell", label: "Shell", description: "Shell", safety: "keep" }, + { pkg: "com.android.statementservice", label: "Statementservice", description: "Intent Filter Verification Service", safety: "keep" }, + { pkg: "com.android.storagemanager", label: "Storagemanager", description: "Storage manager (Maintenance/Storage panel in the settings)", safety: "keep" }, + { pkg: "com.android.systemui", label: "Systemui", description: "Everything you see in Android that's not an app. User interface of Android", safety: "keep" }, + { pkg: "com.android.vpndialogs", label: "Vpndialogs", description: "Provide VPN support to Android", safety: "caution" }, + { pkg: "com.android.protips", label: "Protips", description: "Home screen tips", safety: "safe" }, + { pkg: "com.android.dialer", label: "Dialer", description: "AOSP Dialer/Phone app", safety: "caution" }, + { pkg: "com.android.cellbroadcastreceiver.basiccolorblack.overlay", label: "Overlay", description: "Dark theme overlay for com.android.cellbroadcastreceiver", safety: "caution", deps: ["com.android.cellbroadcastreceiver"] }, + { pkg: "com.android.cellbroadcastreceiver.basiccolorwhite.overlay", label: "Overlay", description: "Light theme overlay for com.android.cellbroadcastreceiver", safety: "caution", deps: ["com.android.cellbroadcastreceiver"] }, + { pkg: "com.android.cellbroadcastreceiver.overlay.common", label: "Common", description: "com.android.cellbroadcastreceiver Theme pack", safety: "caution" }, + { pkg: "com.android.theme.icon.circle", label: "Circle", description: "Android icons pack [Circle].", safety: "caution" }, + { pkg: "com.android.theme.icon.square", label: "Square", description: "Android icons pack [Square].", safety: "caution" }, + { pkg: "com.android.wifi.resources", label: "Resources", description: "System Wi-Fi resources", safety: "caution" }, + { pkg: "com.android.theme.icon.pebble", label: "Pebble", description: "Android icons pack [Pebble].", safety: "caution" }, + { pkg: "com.android.theme.icon.taperedrect", label: "Taperedrect", description: "Android icons pack [Taperedrect].", safety: "caution" }, + { pkg: "com.android.theme.icon.vessel", label: "Vessel", description: "Android icons pack [Vessel].", safety: "caution" }, + { pkg: "com.android.theme.icon_pack.rounded.themepicker", label: "Themepicker", description: "Obviously related to the \"rounded\" icon pack but the full package is strange. A themepicker class only for ...", safety: "caution" }, + { pkg: "com.google.android.cellbroadcastreceiver", label: "Cellbroadcastreceiver", description: "Wireless emergency alerts", safety: "caution", deps: ["com.google.android.cellbroadcastservice"] }, + { pkg: "com.google.android.cellbroadcastservice", label: "Cellbroadcastservice", description: "Cell broadcast is designed to deliver messages to multiple users in an area.", safety: "caution", neededBy: ["com.google.android.cellbroadcastreceiver"] }, + { pkg: "com.google.android.overlay.modules.documentsui", label: "Documentsui", description: "Files Theme pack", safety: "caution" }, + { pkg: "com.android.bips", label: "Bips", description: "Default Print Service.", safety: "caution" }, + { pkg: "com.android.email.partnerprovider", label: "Partnerprovider", description: "Lets Google partners (OEM in most of the case) to customize the default email settings.", safety: "safe" }, + { pkg: "com.android.wallpaper.livepicker", label: "Livepicker", description: "Enables you to pick a live wallpaper. Removing it will break some weather applications (especially ones wit...", safety: "caution" }, + { pkg: "android", label: "Android", description: "Android System", safety: "keep" }, + { pkg: "com.android.phone", label: "Phone", description: "AOSP Dialer", safety: "keep" }, + { pkg: "com.android.fmradio", label: "Fmradio", description: "FM Radio", safety: "safe" }, + { pkg: "com.android.modulemetadata", label: "Modulemetadata", description: "It's used to manage and store metadata about installed modules, and is accessed by the system server. Break...", safety: "caution" }, + ], + }, + { + name: "Misc", + packages: [ + { pkg: "com.qti.diagservices", label: "Diagservices", description: "Starts process when plugged into a PC (with debugging on, haven't tried off) and then runs until stopped.", safety: "caution" }, + { pkg: "com.qti.ltebc", label: "Ltebc", description: "LTE Broadcast Manager", safety: "caution" }, + { pkg: "com.qualcomm.qti.biometrics.fingerprint.service", label: "Service", description: "Probably the background service for handling fingerprint authentication. Will likely break that if disabled.", safety: "caution" }, + { pkg: "com.qualcomm.qtil.aptxals", label: "Aptxals", description: "Something to do with the AptX bluetooh audio streaming codec?", safety: "caution" }, + { pkg: "com.qualcomm.qtil.aptxalsOverlay", label: "Aptxalsoverlay", description: "com.qualcomm.qtil.aptxalsOverlay Theme pack", safety: "caution" }, + { pkg: "com.qualcomm.qtil.aptxui", label: "Aptxui", description: "Something to do with selecting codec for bluetooh audio streaming?", safety: "caution" }, + { pkg: "com.roaming.android.gsimbase", label: "Gsimbase", description: "gsim = Global SIM? (SIM = Subscriber Identity Module, as in SIM-card)", safety: "caution" }, + { pkg: "com.roaming.android.gsimcontentprovider", label: "Gsimcontentprovider", description: "gsim = Global SIM? (SIM = Subscriber Identity Module, as in SIM-card)", safety: "caution" }, + { pkg: "com.qti.qualcomm.deviceinfo", label: "Deviceinfo", description: "Device Info", safety: "caution" }, + { pkg: "com.qualcomm.qti.cne", label: "Cne", description: "CneApp (Connectivity Engine)", safety: "caution" }, + { pkg: "com.qualcomm.qti.ims", label: "Ims", description: "IMS(Ip Multimedia Subsystem) is an open industry standard for voice and multimedia communications over pack...", safety: "caution" }, + { pkg: "com.qualcomm.qti.performancemode", label: "Performancemode", description: "Performance Mode", safety: "caution" }, + { pkg: "com.qualcomm.qti.poweroffalarm", label: "Poweroffalarm", description: "Probably what enables alarms to start the device from an off state.", safety: "caution" }, + { pkg: "com.qualcomm.qti.qdma", label: "Qdma", description: "QDMA = Quadrature-Division Multiple Access", safety: "caution" }, + { pkg: "com.qualcomm.qti.gpudrivers.kona.api30", label: "Api30", description: "Adreno Graphics Drivers", safety: "keep" }, + { pkg: "com.qualcomm.qti.gpudrivers.lahaina.api30", label: "Api30", description: "Adreno Graphics Drivers", safety: "keep" }, + { pkg: "com.qualcomm.qti.gpudrivers.lito.api30", label: "Api30", description: "Adreno Graphics Drivers", safety: "keep" }, + { pkg: "com.qualcomm.qti.seccamservice", label: "Seccamservice", description: "SecCamService, stands for Secure Camera Service?", safety: "caution" }, + { pkg: "com.qualcomm.qti.smq", label: "Smq", description: "QTR (Qualcomm Technology Reporting)", safety: "safe" }, + { pkg: "vendor.qti.hardware.cacert.server", label: "Server", description: "CACertApp", safety: "caution" }, + { pkg: "com.amazon.appmanager", label: "Appmanager", description: "Mobile Device Information Provider", safety: "safe" }, + { pkg: "com.amazon.avod.thirdpartyclient", label: "Thirdpartyclient", description: "Amazon Prime Video (https://play.google.com/store/apps/details?id=com.amazon.avod.thirdpartyclient)", safety: "safe" }, + { pkg: "com.amazon.mShop.android", label: "Android", description: "Amazon Shopping (https://play.google.com/store/apps/details?id=com.amazon.mShop.android.shopping)", safety: "safe" }, + { pkg: "com.amazon.fv", label: "Fv", description: "Amazon App suite. Provides access to Amazon digital content", safety: "safe" }, + { pkg: "com.amazon.kindle", label: "Kindle", description: "Amazon Kindle (https://play.google.com/store/apps/details?id=com.amazon.kindle)", safety: "safe" }, + { pkg: "com.amazon.mp3", label: "Mp3", description: "Amazon Music (https://play.google.com/store/apps/details?id=com.amazon.mp3)", safety: "safe" }, + { pkg: "com.amazon.venezia", label: "Venezia", description: "Amazon AppStore", safety: "safe" }, + { pkg: "com.amazon.aa", label: "Aa", description: "Amazon Assistant app. Nice spyware !", safety: "safe" }, + { pkg: "com.amazon.aa.attribution", label: "Attribution", description: "Amazon Assistant Attribution. A spyware again !", safety: "safe" }, + { pkg: "com.amazon.mShop.android.shopping.vpl", label: "Vpl", description: "Amazon Shopping (https://play.google.com/store/apps/details?id=com.amazon.mShop.android.shopping)", safety: "safe" }, + { pkg: "com.amazon.mShop.android.shopping", label: "Shopping", description: "Amazon Shopping (https://play.google.com/store/apps/details?id=com.amazon.mShop.android.shopping)", safety: "safe" }, + { pkg: "com.amazon.clouddrive.photos", label: "Photos", description: "Amazon Photos (https://play.google.com/store/apps/details?id=com.amazon.clouddrive.photos)", safety: "safe" }, + { pkg: "in.amazon.mShop.android.shopping", label: "Shopping", description: "Amazon India (https://play.google.com/store/apps/details?id=in.amazon.mShop.android.shopping)", safety: "safe" }, + { pkg: "com.facebook.katana", label: "Katana", description: "Facebook app (https://play.google.com/store/apps/details?id=com.facebook.katana)", safety: "safe" }, + { pkg: "com.facebook.system", label: "System", description: "Facebook App Installer (empty shell app which incites you to install the Facebook app)", safety: "safe" }, + { pkg: "com.facebook.appmanager", label: "Appmanager", description: "Facebook app manager handles Facebook apps updates.", safety: "safe" }, + { pkg: "com.facebook.services", label: "Services", description: "Facebook Services is a tool that lets you manage different Facebook services automatically using your Andro...", safety: "safe" }, + { pkg: "com.facebook.orca", label: "Orca", description: "Facebook Messenger (https://play.google.com/store/apps/details?id=com.facebook.orca)", safety: "safe" }, + { pkg: "com.instagram.android", label: "Android", description: "Instagram (https://play.google.com/store/apps/details?id=com.instagram.android)", safety: "safe" }, + { pkg: "com.whatsapp", label: "Whatsapp", description: "Whatsapp (https://play.google.com/store/apps/details?id=com.whatsapp)", safety: "safe" }, + { pkg: "com.microsoft.skydrive", label: "Skydrive", description: "Microsoft OneDrive (Cloud) (https://play.google.com/store/apps/details?id=com.microsoft.skydrive)", safety: "safe" }, + { pkg: "com.skype.raider", label: "Raider", description: "Skype (https://play.google.com/store/apps/details?id=com.skype.raider)", safety: "safe" }, + { pkg: "com.microsoft.office.powerpoint", label: "Powerpoint", description: "No description available", safety: "safe" }, + { pkg: "com.skype.m2", label: "M2", description: "Skype Lite (https://play.google.com/store/apps/details?id=com.skype.m2)", safety: "safe" }, + { pkg: "com.microsoft.office.officehubhl", label: "Officehubhl", description: "Office Mobile hub (on Samsung Phone)", safety: "safe" }, + { pkg: "com.microsoft.office.officehub", label: "Officehub", description: "Microsoft Office Mobile", safety: "safe" }, + { pkg: "com.microsoft.office.officehubrow", label: "Officehubrow", description: "Microsoft Mobile Office Beta", safety: "safe" }, + { pkg: "com.microsoft.appmanager", label: "Appmanager", description: "Your Phone Companion - Link to Windows (https://play.google.com/store/apps/details?id=com.microsoft.appmana...", safety: "safe" }, + { pkg: "com.microsoft.translator", label: "Translator", description: "Microsoft Translator app (https://play.google.com/store/apps/details?id=com.microsoft.translator)", safety: "safe" }, + { pkg: "com.caf.fmradio", label: "Fmradio", description: "https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/fm/tree/fmapp2/src/com/caf/fmradio", safety: "safe" }, + { pkg: "org.codeaurora.gps.gpslogsave", label: "Gpslogsave", description: "Saves GPS logs.", safety: "safe" }, + { pkg: "org.codeaurora.bluetooth", label: "Bluetooth", description: "https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/bluetooth", safety: "caution" }, + { pkg: "org.codeaurora.ims", label: "Ims", description: "IMS(Ip Multimedia Subsystem) is an open industry standard for voice and multimedia communications over pack...", safety: "caution" }, + { pkg: "com.qti.qualcomm.datastatusnotification", label: "Datastatusnotification", description: "Sends you a message when you reach a specified data limit?", safety: "caution" }, + { pkg: "com.qti.confuridialer", label: "Confuridialer", description: "Conference URI dialer", safety: "caution" }, + { pkg: "com.qti.service.colorservice", label: "Colorservice", description: "Something to do with colors?", safety: "caution" }, + { pkg: "com.qti.snapdragon.qdcm_ff", label: "Qdcm Ff", description: "Qualcomm Display Color Management tool", safety: "caution" }, + { pkg: "com.qualcomm.qti.qcolor", label: "Qcolor", description: "Something to do with colors?", safety: "caution" }, + { pkg: "com.qualcomm.atfwd", label: "Atfwd", description: "Used to send AT command messages from/to the modem", safety: "safe" }, + { pkg: "com.qualcomm.cabl", label: "Cabl", description: "Content Adaptative Backlight Settings", safety: "safe" }, + { pkg: "com.qualcomm.embms", label: "Embms", description: "Runs on boot, but not in the background beyond that?", safety: "safe" }, + { pkg: "com.qualcomm.fastdormancy", label: "Fastdormancy", description: "Provide Fast Dormancy feature/setting in the dialer (reduce battery consumption and network utilization dur...", safety: "caution" }, + { pkg: "com.qualcomm.location", label: "Location", description: "LocationServices", safety: "caution" }, + { pkg: "com.qualcomm.qcrilmsgtunnel", label: "Qcrilmsgtunnel", description: "Long-form name: Qualcomm Radio Interface Layer Message Tunnel.", safety: "caution" }, + { pkg: "com.qualcomm.simcontacts", label: "Simcontacts", description: "Sim Contacts", safety: "safe" }, + { pkg: "com.qualcomm.svi", label: "Svi", description: "Sunlight Visibility Improvement", safety: "caution" }, + { pkg: "com.qualcomm.uimremoteserver", label: "Uimremoteserver", description: "Contains a service by the same name, but I've never seen it run.", safety: "caution" }, + { pkg: "com.qualcomm.uimremoteclient", label: "Uimremoteclient", description: "Contains a service by the same name, but I've never seen it run.", safety: "caution" }, + { pkg: "com.qualcomm.wfd.service", label: "Service", description: "Wfd Service", safety: "caution" }, + { pkg: "com.qualcomm.qti.auth.fidocryptoservice", label: "Fidocryptoservice", description: "Qualcomm FIDO implementation.", safety: "safe" }, + { pkg: "com.qualcomm.qti.autoregistration", label: "Autoregistration", description: "Collects device activation data to remotely activate phone warranty.", safety: "safe" }, + { pkg: "com.qualcomm.qti.callenhancement", label: "Callenhancement", description: "Supposed to enhance call quality (I'll let you test if it really does)", safety: "safe" }, + { pkg: "com.qualcomm.qti.callfeaturessetting", label: "Callfeaturessetting", description: "Not mandatory according to some XDA users.", safety: "caution" }, + { pkg: "com.qualcomm.qti.confdialer", label: "Confdialer", description: "ConfDialer", safety: "caution" }, + { pkg: "com.qti.dpmserviceapp", label: "Dpmserviceapp", description: "Data Power Manager for the radio.", safety: "caution" }, + { pkg: "com.qualcomm.qti.networksetting", label: "Networksetting", description: "Network operators (hidden settings menu)", safety: "caution" }, + { pkg: "com.qualcomm.qti.optinoverlay", label: "Optinoverlay", description: "Overlay for opting into something? Probably safe to disable?", safety: "safe" }, + { pkg: "com.qualcomm.qti.qms.service.trustzoneaccess", label: "Trustzoneaccess", description: "Handles access to Qualcomm/ARM Trustzone?", safety: "keep" }, + { pkg: "com.qualcomm.qti.perfdump", label: "Perfdump", description: "Performance dump (logging)", safety: "safe" }, + { pkg: "com.qualcomm.qti.qms.service.connectionsecurity", label: "Connectionsecurity", description: "Telemetry service", safety: "safe" }, + { pkg: "com.qualcomm.qti.qms.service.telemetry", label: "Telemetry", description: "Qualcomm Mobile Security", safety: "safe" }, + { pkg: "com.qualcomm.qti.qtisystemservice", label: "Qtisystemservice", description: "Seems to only log stuff related to telephony?", safety: "caution" }, + { pkg: "com.qualcomm.qti.roamingsettings", label: "Roamingsettings", description: "Hidden settings menu for tweaking roaming settings? How exactly do you access this menu?", safety: "caution" }, + { pkg: "com.qualcomm.qti.rcsimsbootstraputil", label: "Rcsimsbootstraputil", description: "RCS Service", safety: "safe" }, + { pkg: "com.qualcomm.qti.uceshimservice", label: "Uceshimservice", description: "UCE shim service", safety: "caution" }, + { pkg: "com.qualcomm.qti.uceShimService", label: "Uceshimservice", description: "UCE shim service", safety: "caution" }, + { pkg: "com.qualcomm.timeservice", label: "Timeservice", description: "Qualcomm Time Service", safety: "caution" }, + { pkg: "com.qti.xdivert", label: "Xdivert", description: "Smart-Divert", safety: "safe" }, + { pkg: "com.quicinc.cne.CNEService", label: "Cneservice", description: "Qualcomm Connectivity Engine", safety: "caution" }, + { pkg: "com.quicinc.voice.activation", label: "Activation", description: "Qualcomm Voice Assist (https://play.google.com/store/apps/details?id=com.quicinc.voice.activation)", safety: "safe" }, + { pkg: "com.qualcomm.qti.dynamicddsservice", label: "Dynamicddsservice", description: "Dynamic DDS Service", safety: "caution" }, + { pkg: "com.qualcomm.qti.lpa", label: "Lpa", description: "lpa = Local Profile Assistants", safety: "caution" }, + { pkg: "com.qualcomm.qti.remoteSimlockAuth", label: "Remotesimlockauth", description: "Authentication for locking/unlocking eSIM remotely?", safety: "caution" }, + { pkg: "com.qualcomm.qti.simsettings", label: "Simsettings", description: "Related to SIM settings? Exact nature is unclear.", safety: "caution" }, + { pkg: "com.qualcomm.qti.telephonyservice", label: "Telephonyservice", description: "Sound processing during phonecalls.", safety: "keep" }, + { pkg: "com.qualcomm.qti.telephony.vodafonepack", label: "Vodafonepack", description: "Related to Vodafone Prepaid Recharge Plan", safety: "caution" }, + { pkg: "com.qualcomm.qti.uim", label: "Uim", description: "Runs \"RemoteSimLockService\" in the background.", safety: "safe" }, + { pkg: "com.qualcomm.qti.uimGbaApp", label: "Uimgbaapp", description: "Contains a \"GbaService\", but I've never seen it run.", safety: "caution" }, + { pkg: "com.quicinc.fmradio", label: "Fmradio", description: "FM Radio app by Qualcomm", safety: "caution" }, + { pkg: "com.qualcomm.qti.qmmi", label: "Qmmi", description: "QMMI is a test app made by Qualcomm. It is used by service center to test the working of the various device...", safety: "safe" }, + { pkg: "cci.usage", label: "Usage", description: "My Consumer Cellular (https://play.google.com/store/apps/details?id=cci.usage)", safety: "safe" }, + { pkg: "com.android.ld.appstore", label: "Appstore", description: "LD Gaming Appstore", safety: "safe" }, + { pkg: "com.aspiro.tidal", label: "Tidal", description: "Tidal Music (https://play.google.com/store/apps/details?id=com.aspiro.tidal)", safety: "safe" }, + { pkg: "com.audible.application", label: "Application", description: "Cover Audible Audiobooks (https://play.google.com/store/apps/details?id=com.audible.application)", safety: "safe" }, + { pkg: "com.bleacherreport.android.teamstream", label: "Teamstream", description: "Bleacher Report (https://play.google.com/store/apps/details?id=com.bleacherreport.android.teamstream)", safety: "safe" }, + { pkg: "com.blurb.checkout", label: "Checkout", description: "Blurb Checkout", safety: "safe" }, + { pkg: "com.booking", label: "Booking", description: "Booking.com app (https://play.google.com/store/apps/details?id=com.booking)", safety: "safe" }, + { pkg: "com.cequint.ecid", label: "Ecid", description: "Caller ID from Cequint (https://www.cequint.com/)", safety: "safe" }, + { pkg: "com.cnn.mobile.android.phone", label: "Phone", description: "CNN Breaking US & World News app (https://play.google.com/store/apps/details?id=com.cnn.mobile.android.phone)", safety: "safe" }, + { pkg: "com.contextlogic.wish", label: "Wish", description: "Wish Shopping (https://play.google.com/store/apps/details?id=com.contextlogic.wish)", safety: "safe" }, + { pkg: "com.cootek.smartinputv5.language.spanishus", label: "Spanishus", description: "TouchPal Keyboard by Cootek a chinese company.", safety: "safe" }, + { pkg: "com.cootek.smartinputv5.language.englishgb", label: "Englishgb", description: "TouchPal Keyboard by Cootek a chinese company.", safety: "safe" }, + { pkg: "com.crowdcare.agent.k", label: "K", description: "Crowdcare is now Wysdom.AI (https://nitter.42l.fr/wysdomai)", safety: "safe" }, + { pkg: "com.devhd.feedly", label: "Feedly", description: "Feedly (https://play.google.com/store/apps/details?id=com.devhd.feedly)", safety: "safe" }, + { pkg: "com.diotek.sec.lookup.dictionary", label: "Dictionary", description: "Samsung dictionary from Diotek (Korean company)", safety: "safe" }, + { pkg: "com.directv.dvrscheduler", label: "Dvrscheduler", description: "DIRECTV (https://play.google.com/store/apps/details?id=com.directv.dvrscheduler)", safety: "safe" }, + { pkg: "com.discoveryscreen", label: "Discoveryscreen", description: "Appflash (https://play.google.com/store/apps/details?id=com.discoveryscreen)", safety: "safe" }, + { pkg: "com.dna.solitaireapp", label: "Solitaireapp", description: "Solitaire Game app from DNA company ?", safety: "safe" }, + { pkg: "com.drivemode", label: "Drivemode", description: "DraftKings - Daily Fantasy Sports for Cash", safety: "safe" }, + { pkg: "com.ebay.mobile", label: "Mobile", description: "Ebay app (https://play.google.com/store/apps/details?id=com.ebay.mobile)", safety: "safe" }, + { pkg: "com.ebay.carrier", label: "Carrier", description: "Kind of weird ebay apps pre-installed by carriers.", safety: "safe" }, + { pkg: "com.ehernandez.radiolainolvidable", label: "Radiolainolvidable", description: "Radio La Inolvidable Peru (no longer exist)", safety: "safe" }, + { pkg: "com.emoji.keyboard.touchpal", label: "Touchpal", description: "TouchPal Emoji Keyboard by Cootek a chinese company", safety: "safe" }, + { pkg: "com.eterno", label: "Eterno", description: "Daily hunts News. (https://play.google.com/store/apps/details?id=com.eterno&hl=en)", safety: "safe" }, + { pkg: "com.evernote", label: "Evernote", description: "Evernote app (https://play.google.com/store/apps/details?id=com.evernote)", safety: "safe" }, + { pkg: "com.galaxyfirsatlari", label: "Galaxyfirsatlari", description: "Galaxy F\u0131rsatlar\u0131 (https://play.google.com/store/apps/details?id=com.galaxyfirsatlari)", safety: "safe" }, + { pkg: "com.generalmobi.go2pay", label: "Go2Pay", description: "Go2Pay (https://play.google.com/store/apps/details?id=com.generalmobi.go2pay)", safety: "safe" }, + { pkg: "com.gotv.nflgamecenter.us.lite", label: "Lite", description: "Football NFL (https://play.google.com/store/apps/details?id=com.gotv.nflgamecenter.us.lite)", safety: "safe" }, + { pkg: "com.groupon", label: "Groupon", description: "Groupon (https://play.google.com/store/apps/details?id=com.groupon)", safety: "safe" }, + { pkg: "com.hancom.office.editor.hidden", label: "Hidden", description: "Legacy Hancom Office Editor (Korean alternative to Microsoft Office). Featured in Samsung and LG phones", safety: "safe" }, + { pkg: "com.handmark.expressweather.vpl", label: "Vpl", description: "1Weather (https://play.google.com/store/apps/details?id=com.handmark.expressweather)", safety: "safe" }, + { pkg: "com.hulu.plus", label: "Plus", description: "Hulu (https://play.google.com/store/apps/details?id=com.hulu.plus&hl)", safety: "safe" }, + { pkg: "com.ideashower.readitlater.pro", label: "Pro", description: "Pocket (https://play.google.com/store/apps/details?id=com.ideashower.readitlater.pro)", safety: "safe" }, + { pkg: "com.imdb.mobile", label: "Mobile", description: "IMDb mobile app (https://play.google.com/store/apps/details?id=com.imdb.mobile)", safety: "safe" }, + { pkg: "com.infraware.polarisoffice5", label: "Polarisoffice5", description: "Polaris Office from US Infraware Inc company (Microsoft Office like)", safety: "safe" }, + { pkg: "com.ironsource.appcloud.oobe", label: "Oobe", description: "AppCloud (discontinued) from ironSource, an advertising company.", safety: "safe" }, + { pkg: "com.ironsource.appcloud.oobe.huawei", label: "Huawei", description: "Essentials apps", safety: "safe" }, + { pkg: "com.king.candycrush4", label: "Candycrush4", description: "Candy Crush Friends Saga (https://play.google.com/store/apps/details?id=com.king.candycrush4)", safety: "safe" }, + { pkg: "com.king.candycrushsodasaga", label: "Candycrushsodasaga", description: "Candy Crush Soda Saga (https://play.google.com/store/apps/details?id=com.king.candycrushsodasaga)", safety: "safe" }, + { pkg: "com.king.candycrushsaga", label: "Candycrushsaga", description: "Candy Crush Saga (https://play.google.com/store/apps/details?id=com.king.candycrushsaga)", safety: "safe" }, + { pkg: "com.linkedin.android", label: "Android", description: "Linkedin app (https://play.google.com/store/apps/details?id=com.linkedin.android)", safety: "safe" }, + { pkg: "com.lookout", label: "Lookout", description: "Lookout Security & Antivirus (https://play.google.com/store/apps/details?id=com.lookout)", safety: "safe" }, + { pkg: "com.micredit.in", label: "In", description: "Mi Credit (https://play.google.com/store/apps/details?id=com.micredit.in.gp)", safety: "safe" }, + { pkg: "com.netflix.mediaclient", label: "Mediaclient", description: "Netflix app (https://play.google.com/store/apps/details?id=com.netflix.mediaclient)", safety: "safe" }, + { pkg: "com.netflix.partner.activation", label: "Activation", description: "Apk file name: By_3rd_NetflixActivationOverSeas", safety: "safe" }, + { pkg: "com.niksoftware.snapseed", label: "Snapseed", description: "Snapseed (https://play.google.com/store/apps/details?id=com.niksoftware.snapseed)", safety: "safe" }, + { pkg: "com.nuance.swype.input", label: "Input", description: "Swype keyboard by Nuance", safety: "safe" }, + { pkg: "com.opera.branding", label: "Branding", description: "Opera Branding Provider", safety: "safe" }, + { pkg: "com.opera.branding.news", label: "News", description: "Opera News Branding Provider", safety: "safe" }, + { pkg: "com.opera.mini.native", label: "Native", description: "Opera Mini web browser (https://play.google.com/store/apps/details?id=com.opera.mini.native)", safety: "safe" }, + { pkg: "com.opera.preinstall", label: "Preinstall", description: "Opera Preinstall Data", safety: "safe" }, + { pkg: "com.opera.max.preinstall", label: "Preinstall", description: "Opera Max (discontinued)", safety: "safe" }, + { pkg: "com.particlenews.newsbreak", label: "Newsbreak", description: "News Break: Local & Breaking (https://play.google.com/store/apps/details?id=com.particlenews.newsbreak)", safety: "safe" }, + { pkg: "com.phonepe.app", label: "App", description: "PhonePe (https://play.google.com/store/apps/details?id=com.phonepe.app)", safety: "safe" }, + { pkg: "com.pinsight.v1", label: "V1", description: "App Spotlight", safety: "safe" }, + { pkg: "com.playphone.gamestore", label: "Gamestore", description: "Playphone Gamestore (https://www.playphone.com/)", safety: "safe" }, + { pkg: "com.playphone.gamestore.loot", label: "Loot", description: "Loot", safety: "safe" }, + { pkg: "com.pure.indosat.care", label: "Care", description: "myIM3 (https://play.google.com/store/apps/details?id=com.pure.indosat.care)", safety: "safe" }, + { pkg: "com.huaqin.FM", label: "Fm", description: "Radio app from huaqin a chinese company", safety: "safe" }, + { pkg: "com.nextradioapp.nextradio", label: "Nextradio", description: "NextRadio (https://play.google.com/store/apps/details?id=com.nextradioapp.nextradio)", safety: "safe" }, + { pkg: "com.pinsight.dw", label: "Dw", description: "App Stack", safety: "safe" }, + { pkg: "com.realvnc.android.remote", label: "Remote", description: "Remote controle service by Realvnc (https://en.wikipedia.org/wiki/RealVNC)", safety: "safe" }, + { pkg: "com.remotefairy4", label: "Remotefairy4", description: "AnyMote Universal Remote + Wifi Smart Home Control (https://play.google.com/store/apps/details?id=com.remot...", safety: "safe" }, + { pkg: "com.republicwireless.tel", label: "Tel", description: "Republic (https://play.google.com/store/apps/details?id=com.republicwireless.tel&hl)", safety: "safe" }, + { pkg: "com.rhapsody.vpl", label: "Vpl", description: "Napster Music (https://play.google.com/store/apps/details?id=com.rhapsody)", safety: "safe" }, + { pkg: "com.rhapsody", label: "Rhapsody", description: "Napster Music (https://play.google.com/store/apps/details?id=com.rhapsody)", safety: "safe" }, + { pkg: "com.sem.factoryapp", label: "Factoryapp", description: "SEMFactoryApp", safety: "safe" }, + { pkg: "com.servicemagic.consumer", label: "Consumer", description: "HomeAdvisor: Contractors for Home Improvement (https://play.google.com/store/apps/details?id=com.servicemag...", safety: "safe" }, + { pkg: "com.setk.widget", label: "Widget", description: "Galaxy Bizz (https://play.google.com/store/apps/details?id=com.setk.widget)", safety: "safe" }, + { pkg: "com.sharecare.askmd", label: "Askmd", description: "AskMD (discontinued) provided by Sharecare", safety: "safe" }, + { pkg: "com.slacker.radio", label: "Radio", description: "LiveXLive - Streaming Music and Live Events (https://play.google.com/store/apps/details?id=com.slacker.radio)", safety: "safe" }, + { pkg: "com.shopee.id", label: "Id", description: "Shopee 2.2 (https://play.google.com/store/apps/details?id=com.shopee.id)", safety: "safe" }, + { pkg: "com.smithmicro.netwise.director.comcast.oem", label: "Oem", description: "XFINITY Wifi settings (https://play.google.com/store/apps/details?id=com.smithmicro.netwise.director.comcas...", safety: "safe" }, + { pkg: "com.spotify.music", label: "Music", description: "Spotify app (https://play.google.com/store/apps/details?id=com.spotify.music)", safety: "safe" }, + { pkg: "com.swiftkey.swiftkeyconfigurator", label: "Swiftkeyconfigurator", description: "SwiftKey factory settings", safety: "safe" }, + { pkg: "com.s.antivirus", label: "Antivirus", description: "AVG Antivirus (https://play.google.com/store/apps/details?id=com.s.antivirus) for Sony Xperia.", safety: "safe" }, + { pkg: "com.telenav.app.android.cingular", label: "Cingular", description: "AT&T Navigator (https://play.google.com/store/apps/details?id=com.telenav.app.android.cingular)", safety: "safe" }, + { pkg: "com.telenav.app.android.scout_us", label: "Scout Us", description: "Scout GPS Navigation & Meet Up (https://play.google.com/store/apps/details?id=com.telenav.app.android.scout...", safety: "safe" }, + { pkg: "com.touchtype.swiftkey", label: "Swiftkey", description: "Swiftkey Keyboard (https://play.google.com/store/apps/details?id=com.touchtype.swiftkey)", safety: "caution" }, + { pkg: "com.touchtype.swiftkey.res.overlay", label: "Overlay", description: "Some overlay for Swiftkey? Overlays are usually themes, but not sure about this one.", safety: "caution" }, + { pkg: "com.tracker.t", label: "T", description: "WTF is this ?? Given its name I think you can take the risk to delete it.", safety: "safe" }, + { pkg: "com.turner.cnvideoapp", label: "Cnvideoapp", description: "Cartoon network App (https://play.google.com/store/apps/details?id=com.turner.cnvideoapp)", safety: "safe" }, + { pkg: "com.tripadvisor.tripadvisor", label: "Tripadvisor", description: "Trip advisor (https://play.google.com/store/apps/details?id=com.tripadvisor.tripadvisor)", safety: "safe" }, + { pkg: "com.ubercab.eats", label: "Eats", description: "Uber (https://play.google.com/store/apps/details?id=com.ubercab)", safety: "safe" }, + { pkg: "com.ubercab.driver", label: "Driver", description: "Uber (https://play.google.com/store/apps/details?id=com.ubercab)", safety: "safe" }, + { pkg: "com.ubercab", label: "Ubercab", description: "Uber (https://play.google.com/store/apps/details?id=com.ubercab)", safety: "safe" }, + { pkg: "com.UCMobile.intl", label: "Intl", description: "UC Browser by Alibaba (https://play.google.com/store/apps/details?id=com.UCMobile.intl)", safety: "safe" }, + { pkg: "com.ume.browser.northamerica", label: "Northamerica", description: "UME Web Browser (https://play.google.com/store/apps/details?id=com.ume.browser.northamerica)", safety: "safe" }, + { pkg: "com.wb.goog.got.conquest", label: "Conquest", description: "Game of Thrones: Conquest (https://play.google.com/store/apps/details?id=com.wb.goog.got.conquest)", safety: "safe" }, + { pkg: "com.yahoo.mobile.client.android.liveweather", label: "Liveweather", description: "Yahoo Weather (https://play.google.com/store/apps/details?id=com.yahoo.mobile.client.android.weather)", safety: "safe" }, + { pkg: "com.yellowpages.android.ypmobile", label: "Ypmobile", description: "Yellow Pages (https://play.google.com/store/apps/details?id=com.yellowpages.android.ypmobile)", safety: "safe" }, + { pkg: "com.zhiliaoapp.musically", label: "Musically", description: "Yelp (https://play.google.com/store/apps/details?id=com.yelp.android)", safety: "safe" }, + { pkg: "de.axelspringer.yana.zeropage", label: "Zeropage", description: "Upday news for Samsung (https://play.google.com/store/apps/details?id=de.axelspringer.yana)", safety: "safe" }, + { pkg: "flipboard.app", label: "App", description: "Flipboard News App (https://play.google.com/store/apps/details?id=flipboard.app)", safety: "safe" }, + { pkg: "flipboard.boxer.app", label: "App", description: "Briefing app (https://play.google.com/store/apps/details?id=flipboard.boxer.app)", safety: "safe" }, + { pkg: "id.co.babe", label: "Babe", description: "BaBe (https://play.google.com/store/apps/details?id=id.co.babe)", safety: "safe" }, + { pkg: "in.mohalla.sharechat", label: "Sharechat", description: "ShareChat (https://play.google.com/store/apps/details?id=in.mohalla.sharechat)", safety: "safe" }, + { pkg: "in.playsimple.wordtrip", label: "Wordtrip", description: "World Trip (https://play.google.com/store/apps/details?id=in.playsimple.wordtrip)", safety: "safe" }, + { pkg: "jp.co.omronsoft.openwnn", label: "Openwnn", description: "Japanese keyboard/IME (don't know why it's pre-installed on US/european devices)", safety: "safe" }, + { pkg: "jp.gocro.smartnews.android", label: "Android", description: "SmartNews: Local Breaking News (https://play.google.com/store/apps/details?id=jp.gocro.smartnews.android)", safety: "safe" }, + { pkg: "msgplus.jibe.sca.vpl", label: "Vpl", description: "Messaging Plus. Messings using the RCS protocol (https://en.wikipedia.org/wiki/Rich_Communication_Services)", safety: "safe" }, + { pkg: "net.sharewire.parkmobilev2", label: "Parkmobilev2", description: "ParkMobile - Find Parking (https://play.google.com/store/apps/details?id=net.sharewire.parkmobilev2)", safety: "safe" }, + { pkg: "pl.zdunex25.updater", label: "Updater", description: "Updater for the zdnex25's theme", safety: "safe" }, + { pkg: "tv.fubo.mobile.vpl", label: "Vpl", description: "fuboTV (https://play.google.com/store/apps/details?id=tv.fubo.mobile)", safety: "safe" }, + { pkg: "tv.peel.app", label: "App", description: "Peel Universal Smart TV Remote Control (discontinued)", safety: "safe" }, + { pkg: "zpub.res", label: "Res", description: "third-party app pre-installed on ZTE phones.", safety: "safe" }, + { pkg: "com.monotype.android.font.rosemary", label: "Rosemary", description: "Font", safety: "safe" }, + { pkg: "com.dsi.ant.sample.acquirechannels", label: "Acquirechannels", description: "I don't know why there is \"sample\" in the name. Is this package really useful to find ANT channels ?", safety: "safe" }, + { pkg: "com.dsi.ant.server", label: "Server", description: "ANT HAL(Hardware Abstraction Layer) Server", safety: "caution" }, + { pkg: "com.dsi.ant.service.socket", label: "Socket", description: "ANT Radio Service (https://play.google.com/store/apps/details?id=com.dsi.ant.service.socket)", safety: "caution" }, + { pkg: "co.sitic.pp", label: "Pp", description: "Designed to remotely lock the phone (by sending a simple SMS) in case you don't pay your bill", safety: "safe" }, + { pkg: "com.gd.mobicore.pa", label: "Pa", description: "Mobicore is now Trustonic", safety: "caution" }, + { pkg: "com.trustonic.teeservice", label: "Teeservice", description: "TEE = Trusted Execution Environment", safety: "caution" }, + { pkg: "com.trustonic.tuiservice", label: "Tuiservice", description: "tuiService (Trusted User Interface) is a security layer by Trustonic.", safety: "caution" }, + { pkg: "org.simalliance.openmobileapi.uicc2terminal", label: "Uicc2Terminal", description: "Open Mobile API (\"interface\") to access UICC secure elements", safety: "caution" }, + { pkg: "org.simalliance.openmobileapi.service", label: "Service", description: "The SmartCard API is a reference implementation of the SIMalliance Open Mobile API specification that enabl...", safety: "caution" }, + { pkg: "com.mediatek", label: "Mediatek", description: "Mediatek is a Taiwanese chipset manufacturer.", safety: "caution" }, + { pkg: "com.mediatek.atmwifimeta", label: "Atmwifimeta", description: "wifi data logger you don't want.", safety: "safe" }, + { pkg: "com.mediatek.callrecorder", label: "Callrecorder", description: "This is not the kind of feature expected from a Soc company.", safety: "safe" }, + { pkg: "com.mediatek.engineermode", label: "Engineermode", description: "Engineer mode you can access by dialing a secret code (*#*#3646633#*#* on some Xiaomi phones for instance)", safety: "safe" }, + { pkg: "com.mediatek.gpslocationupdate", label: "Gpslocationupdate", description: "I wonder if it is really only a logging app.", safety: "caution" }, + { pkg: "com.mediatek.location.lppe.main", label: "Main", description: "LPPE = LTE Positioning Protocol enhancements/extensions (LTE = \"4G\")", safety: "caution" }, + { pkg: "com.mediatek.ims", label: "Ims", description: "Mediatek's implementation of IMS (low-level implementation?)", safety: "caution" }, + { pkg: "com.mediatek.mdmconfig", label: "Mdmconfig", description: "Mobile Device Management (MDM) allows company\u2019s IT department to reach inside your phone in the background,...", safety: "safe" }, + { pkg: "com.mediatek.mtklogger", label: "Mtklogger", description: "Logs debug data. Has a lot of permissions and run in background all the time.", safety: "safe" }, + { pkg: "com.mediatek.nlpservice", label: "Nlpservice", description: "Mediatek Network Location Provider", safety: "caution" }, + { pkg: "com.mediatek.omacp", label: "Omacp", description: "omacp = OMA Client Provisioning. A protocol specified by the Open Mobile Alliance (OMA).", safety: "caution" }, + { pkg: "com.mediatek.providers.drm", label: "Drm", description: "DRM provider (actually Beep Science is MediaTek\u2019s default DRM vendor)", safety: "caution" }, + { pkg: "com.mediatek.wfo.impl", label: "Impl", description: "According to olorin (https://www.olorin.me/2019/09/08/debloating-the-umidigi-f1-play/) it's a MediaTek\u2019s de...", safety: "safe" }, + { pkg: "com.microsoft.office.excel", label: "Excel", description: "Excel", safety: "safe" }, + { pkg: "com.microsoft.office.word", label: "Word", description: "Word", safety: "safe" }, + { pkg: "com.microsoft.office.outlook", label: "Outlook", description: "Outlook", safety: "safe" }, + { pkg: "com.microsoft.office.onenote", label: "Onenote", description: "OneNote (https://play.google.com/store/apps/details?id=com.microsoft.office.onenote)", safety: "safe" }, + { pkg: "com.aaa.android.discounts", label: "Discounts", description: "AAA Mobile (https://play.google.com/store/apps/details?id=com.aaa.android.discounts)", safety: "safe" }, + { pkg: "com.aaa.android.discounts.vpl", label: "Vpl", description: "AAA Mobile (https://play.google.com/store/apps/details?id=com.aaa.android.discounts)", safety: "safe" }, + { pkg: "com.aspiro.tidal.vpl", label: "Vpl", description: "Tidal Music (https://play.google.com/store/apps/details?id=com.aspiro.tidal)", safety: "safe" }, + { pkg: "com.draftkings.dknativermgGP.vpl", label: "Vpl", description: "DraftKings - Daily Fantasy Sports for Cash", safety: "safe" }, + { pkg: "com.handmark.expressweather", label: "Expressweather", description: "1Weather (https://play.google.com/store/apps/details?id=com.handmark.expressweather)", safety: "safe" }, + { pkg: "com.opera.max.oem", label: "Oem", description: "Opera Max (discontinued)", safety: "safe" }, + { pkg: "com.til.timesnews", label: "Timesnews", description: "India News (https://play.google.com/store/apps/details?id=com.til.timesnews)", safety: "safe" }, + { pkg: "com.yelp.android", label: "Android", description: "Yelp (https://play.google.com/store/apps/details?id=com.yelp.android)", safety: "safe" }, + { pkg: "com.monotype.android.font.chococooky", label: "Chococooky", description: "Font", safety: "safe" }, + { pkg: "com.monotype.android.font.cooljazz", label: "Cooljazz", description: "Font", safety: "safe" }, + { pkg: "com.monotype.android.font.foundation", label: "Foundation", description: "Font", safety: "safe" }, + { pkg: "com.dsi.ant.plugins.antplus", label: "Antplus", description: "ANT+ plugin service (https://play.google.com/store/apps/details?id=com.dsi.ant.plugins.antplus)", safety: "safe" }, + { pkg: "com.tmobile.echolocate", label: "Echolocate", description: "T-Mobile Diagnostics", safety: "safe" }, + { pkg: "com.dolby.daxservice", label: "Daxservice", description: "Dolby", safety: "caution" }, + { pkg: "com.zaz.translate", label: "Translate", description: "Hi Translate (https://play.google.com/store/apps/details?id=com.zaz.translate)", safety: "safe" }, + { pkg: "com.rlk.weathers", label: "Weathers", description: "Daily Weather (https://play.google.com/store/apps/details?id=com.rlk.weathers)", safety: "safe" }, + { pkg: "com.talpa.hibrowser", label: "Hibrowser", description: "Hi Browser (https://play.google.com/store/apps/details?id=com.talpa.hibrowser)", safety: "safe" }, + { pkg: "com.talpa.share", label: "Share", description: "XShare Mini", safety: "safe" }, + { pkg: "net.bat.store", label: "Store", description: "AHA Games", safety: "safe" }, + { pkg: "com.idea.questionnare", label: "Questionnare", description: "[NEED MORE INFO / NEED APK] Quizz app from MobileIdea company?", safety: "safe" }, + { pkg: "com.heytap.accessory", label: "Accessory", description: "Accessory Framework", safety: "caution", deps: ["com.heytap.mcs"], neededBy: ["com.oplus.synergy"] }, + { pkg: "com.heytap.mcs", label: "Mcs", description: "System messages", safety: "safe", neededBy: ["com.heytap.cloud", "com.heytap.market", "com.oplus.synergy", "com.heytap.accessory"] }, + { pkg: "com.redteamobile.roaming", label: "Roaming", description: "ORoaming", safety: "safe", deps: ["com.redteamobile.roaming.deamon"] }, + { pkg: "com.redteamobile.roaming.deamon", label: "Deamon", description: "ORoaming", safety: "safe", neededBy: ["com.redteamobile.roaming"] }, + { pkg: "com.finshell.fin", label: "Fin", description: "FinShell Pay (https://play.google.com/store/apps/details?id=com.finshell.fin)", safety: "safe" }, + { pkg: "com.glance.internet", label: "Internet", description: "Displays unsolicited \"trending\" stories on Lockscreen", safety: "safe" }, + { pkg: "com.opos.cs", label: "Cs", description: "Hot Apps", safety: "safe" }, + { pkg: "com.tripledot.solitaire", label: "Solitaire", description: "Solitaire (https://play.google.com/store/apps/details?id=com.tripledot.solitaire)", safety: "safe" }, + { pkg: "net.supertreat.solitaire", label: "Solitaire", description: "Solitaire (https://play.google.com/store/apps/details?id=net.supertreat.solitaire)", safety: "safe" }, + { pkg: "air.com.playtika.slotomania", label: "Slotomania", description: "Slotomania (https://play.google.com/store/apps/details?id=air.com.playtika.slotomania)", safety: "safe" }, + { pkg: "com.staplegames.blocksClassicSGGP", label: "Blocksclassicsggp", description: "Block (https://play.google.com/store/apps/details?id=com.staplegames.blocksClassicSGGP)", safety: "safe" }, + { pkg: "in.playsimple.tripcross", label: "Tripcross", description: "Crossword Jam (https://play.google.com/store/apps/details?id=in.playsimple.tripcross)", safety: "safe" }, + { pkg: "com.tripledot.woodoku", label: "Woodoku", description: "Woodoku (https://play.google.com/store/apps/details?id=com.tripledot.woodoku)", safety: "safe" }, + { pkg: "com.pandora.android", label: "Android", description: "Pandora (https://play.google.com/store/apps/details?id=com.pandora.android)", safety: "safe" }, + { pkg: "com.digitalturbine.toolbar", label: "Toolbar", description: "Digital Turbine", safety: "safe" }, + { pkg: "com.tiqiaa.remote", label: "Remote", description: "ZazaRemote (https://play.google.com/store/apps/details?id=com.tiqiaa.remote)", safety: "safe" }, + { pkg: "com.agui.toolbox", label: "Toolbox", description: "Toolbox", safety: "safe" }, + { pkg: "com.haoba.btsmart", label: "Btsmart", description: "Agui Unibuds", safety: "safe" }, + { pkg: "com.mediatek.simprocessor", label: "Simprocessor", description: "This controls and imports contacts saved on a SIM card. Not needed if you don't store your contacts on the ...", safety: "caution" }, + { pkg: "com.mediatek.ims.pco", label: "Pco", description: "Protocol Configuration Options service for IMS", safety: "caution" }, + ], + }, + { + name: "Other OEM", + packages: [ + { pkg: "com.android.keyguard", label: "Keyguard", description: "I NEVER HAD AN HUAWEI DEVICE ON HAND. THIS LIST WAS MADE POSSIBLE BY @REDSKULL23", safety: "safe" }, + { pkg: "com.android.hwmirror", label: "Hwmirror", description: "Mirror", safety: "safe" }, + { pkg: "com.baidu.input_huawei", label: "Input Huawei", description: "Woh! 51 permissions!", safety: "safe" }, + { pkg: "com.bjbyhd.screenreader_huawei", label: "Screenreader Huawei", description: "An accessibility feature for visually impaired people", safety: "safe" }, + { pkg: "com.iflytek.speechsuite", label: "Speechsuite", description: "Default voice input method from iflytek, a big chinese company (https://en.wikipedia.org/wiki/IFlytek)", safety: "safe" }, + { pkg: "com.nuance.swype.emui", label: "Emui", description: "Huawei Swype functions.", safety: "safe" }, + { pkg: "com.android.mediacenter", label: "Mediacenter", description: "Huawei music app. (Yeah they messed up with the package name)", safety: "safe" }, + { pkg: "com.android.messaging", label: "Messaging", description: "Android default messaging app", safety: "caution" }, + { pkg: "android.autoinstalls.config.motorola.layout", label: "Layout", description: "Device configuration for Motorola", safety: "safe" }, + { pkg: "com.lenovo.lsf.user", label: "User", description: "Lenovo ID adds an option in Settings>Accounts where you can login to a Lenovo ID account.", safety: "safe" }, + { pkg: "com.lmi.motorola.rescuesecurity", label: "Rescuesecurity", description: "Rescue Security by LogMeIn (https://www.logmeinrescue.com/)", safety: "safe" }, + { pkg: "android.autoinstalls.config.samsung", label: "Samsung", description: "AutoInstalls a set of OEM apps on device setup (first boot/factory reset).", safety: "safe" }, + { pkg: "com.cnn.mobile.android.phone.edgepanel", label: "Edgepanel", description: "CNN Edge panel. Twitter trends, and news from CNN.", safety: "safe" }, + { pkg: "com.enhance.gameservice", label: "Gameservice", description: "Legacy game Optimizing Service (was replaced by com.samsung.android.game.gos)", safety: "safe" }, + { pkg: "com.mygalaxy", label: "Mygalaxy", description: "My Galaxy (https://play.google.com/store/apps/details?id=com.mygalaxy)", safety: "safe" }, + { pkg: "com.mobeam.barcodeService", label: "Barcodeservice", description: "The Beaming Service enables your device to beam (relay) barcodes, as found on digital coupons, event ticket...", safety: "safe" }, + { pkg: "com.android.screenshot", label: "Screenshot", description: "Default android screenshot tool", safety: "caution" }, + { pkg: "com.skms.android.agent", label: "Agent", description: "Samsung KMS agent service a client application for Android devices to support eSE-based (embedded secure el...", safety: "safe" }, + { pkg: "com.monotype.android.font.samsungone", label: "Samsungone", description: "Samsung One font", safety: "safe" }, + { pkg: "com.vlingo.midas", label: "Midas", description: "Speech recognition app for the Vlingo personal assistant", safety: "safe" }, + { pkg: "com.wsomacp", label: "Wsomacp", description: "omacp = OMA Client Provisioning. It is a protocol specified by the Open Mobile Alliance (OMA).", safety: "safe" }, + { pkg: "com.wssnps", label: "Wssnps", description: "Samsung Backup and restore Manager (on Samsung Galaxy S7)", safety: "safe" }, + { pkg: "tv.peel.samsung.app", label: "App", description: "Peel Smart Remote (WatchON)", safety: "safe" }, + { pkg: "com.osp.app.signin", label: "Signin", description: "Samsung Account app", safety: "caution" }, + { pkg: "com.policydm", label: "Policydm", description: "Samsung security policy update (https://play.google.com/store/apps/details?id=com.policydm)", safety: "caution" }, + { pkg: "com.wssyncmldm", label: "Wssyncmldm", description: "Software update", safety: "caution" }, + { pkg: "com.android.email.partnerprovider.overlay", label: "Overlay", description: "Theme overlay for partnerprovider?", safety: "caution" }, + { pkg: "cn.oneplus.photos", label: "Photos", description: "Shot On OnePlus", safety: "safe" }, + { pkg: "com.example.wifirftest", label: "Wifirftest", description: "Wifi Radio Frequency test", safety: "safe" }, + { pkg: "com.fingerprints.fingerprintsensortest", label: "Fingerprintsensortest", description: "Sensor Test Tool", safety: "safe" }, + { pkg: "com.oem.autotest", label: "Autotest", description: "Auto Test Server", safety: "safe" }, + { pkg: "com.oem.logkitsdservice", label: "Logkitsdservice", description: "Used by com.oem.oemlogkit, a shady logging app.", safety: "safe" }, + { pkg: "com.oem.nfc", label: "Nfc", description: "OnePlus NFC tester", safety: "safe" }, + { pkg: "com.oem.oemlogkit", label: "Oemlogkit", description: "OnePlus LogKit", safety: "safe" }, + { pkg: "com.tencent.soter.soterserver", label: "Soterserver", description: "Soter is a biometric authentication standard and platform by Tencent.", safety: "safe" }, + { pkg: "com.wapi.wapicertmanage", label: "Wapicertmanage", description: "WAPI certificate manager", safety: "safe" }, + { pkg: "cn.oneplus.oemtcma", label: "Oemtcma", description: "TCMA = Tiered Contention Multiple Access", safety: "caution" }, + { pkg: "cn.oneplus.oem_tcma", label: "Oem Tcma", description: "TCMA = Tiered Contention Multiple Access", safety: "caution" }, + { pkg: "com.zte.assistant", label: "Assistant", description: "ZTE Voice Assistant", safety: "safe" }, + { pkg: "cn.zte.recorder", label: "Recorder", description: "ZTE Voice Recorder with... 33 permissions and talking with Baidu servers. Pithus analysis: https://beta.pit...", safety: "safe" }, + { pkg: "com.zte.videoplayer", label: "Videoplayer", description: "ZTE Video Player with INTERNET and ACCESS_NETWORK_STATE permissions", safety: "safe" }, + { pkg: "com.zte.heartyservice.strategy", label: "Strategy", description: "Process killer, unloads programs from memory.", safety: "caution" }, + { pkg: "com.zte.burntest.camera", label: "Camera", description: "Possibly a hidden stress testing app for camera.", safety: "caution" }, + { pkg: "com.zte.weather", label: "Weather", description: "ZTE Weather app.", safety: "safe" }, + { pkg: "com.zte.contacts.sub", label: "Sub", description: "Possibly related to contact sync.", safety: "caution" }, + { pkg: "com.zte.privacypolicy", label: "Privacypolicy", description: "ZTE privacy policy app.", safety: "safe" }, + { pkg: "com.android.bluetooth.tempow", label: "Tempow", description: "Implementation of a improved bluetooth protocol (developed by french company Tempow)", safety: "keep" }, + { pkg: "com.android.mmi", label: "Mmi", description: "Not an AOSP package at all", safety: "keep" }, + { pkg: "com.elephanttek.faceunlock", label: "Faceunlock", description: "Standard FaceUnlock functionality?", safety: "caution" }, + { pkg: "android.autoinstalls.config.oneplus", label: "Oneplus", description: "Device configuration", safety: "safe" }, + { pkg: "cn.oneplus.nvbackup", label: "Nvbackup", description: "NVBackupUI", safety: "caution" }, + { pkg: "cn.oneplus.opmms", label: "Opmms", description: "OPMmsLocation", safety: "safe" }, + { pkg: "com.android.mms.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.settings.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.rongcard.eid", label: "Eid", description: "eid probably means Electronic ID. This presumably handles something related to that.", safety: "caution" }, + { pkg: "com.android.wifi.resources.overlay.common", label: "Common", description: "System Wi-Fi resources Theme pack", safety: "caution" }, + { pkg: "com.android.wifi.resources.overlay.target", label: "Target", description: "System Wi-Fi resources Theme pack", safety: "caution" }, + { pkg: "com.google.android.overlay.modules.modulemetadata.forframework", label: "Forframework", description: "Android System Theme pack", safety: "caution" }, + { pkg: "android.autoinstalls.config.TCL.PAI", label: "Pai", description: "AutoInstalls a set of OEM apps on device setup (first boot/factory reset).", safety: "safe" }, + { pkg: "com.tcl.faceunlock", label: "Faceunlock", description: "Standard FaceUnlock functionality?", safety: "caution" }, + { pkg: "com.tct.endusertest", label: "Endusertest", description: "Unused device issue feedback app.", safety: "safe" }, + { pkg: "com.tct.faceunlock", label: "Faceunlock", description: "Standard FaceUnlock functionality?", safety: "caution" }, + { pkg: "com.android.LGSetupWizard", label: "Lgsetupwizard", description: "The first time you turn your device on, a Welcome screen is displayed. It guides you through the basics of ...", safety: "safe" }, + { pkg: "com.android.partnerbrowsercustomizations.btl.s600ww.overlay", label: "Overlay", description: "Theme overlay for some browser customization?", safety: "caution" }, + { pkg: "com.android.providers.calendar.overlay.base.s600ww", label: "S600Ww", description: "Some overlay for a content provider package. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.android.providers.settings.overlay.base.s600ww", label: "S600Ww", description: "Some overlay for a content provider package. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.android.providers.settings.btl.s600ww.overlay", label: "Overlay", description: "Some overlay for a content provider package. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.android.retaildemo.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Retail demonstration mode?", safety: "caution" }, + { pkg: "com.data.overlay.base.s600ww", label: "S600Ww", description: "Some kind of theme overlay for Nokia devices?", safety: "caution" }, + { pkg: "com.evenwell.apnwidget.overlay.base.s600ww", label: "S600Ww", description: "Some overlay for an APN widget. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.evenwell.AprUploadService.data.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Apr Upload Service?", safety: "caution" }, + { pkg: "com.evenwell.autoregistration.overlay.d.base.s600ww", label: "S600Ww", description: "Theme overlay for a Spyware app?", safety: "caution" }, + { pkg: "com.evenwell.batteryprotect.overlay.d.base.s600e0", label: "S600E0", description: "Theme overlay for Battery Protect?", safety: "caution" }, + { pkg: "com.evenwell.bboxsbox.app", label: "App", description: "????", safety: "safe" }, + { pkg: "com.evenwell.bokeheditor.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Bokeh Editor?", safety: "caution" }, + { pkg: "com.evenwell.CPClient.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for CPClient?", safety: "caution" }, + { pkg: "com.evenwell.customerfeedback.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Customer Feedback?", safety: "caution" }, + { pkg: "com.evenwell.dataagent.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Data Agent?", safety: "caution" }, + { pkg: "com.evenwell.DbgCfgTool.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Debug Config Tool?", safety: "caution" }, + { pkg: "com.evenwell.defaultappconfigure.overlay.base.s600ww", label: "S600Ww", description: "A theme overlay for selecting default apps or something?", safety: "caution" }, + { pkg: "com.evenwell.DeviceMonitorControl.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Device Monitor Control?", safety: "caution" }, + { pkg: "com.evenwell.email.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for email app?", safety: "caution" }, + { pkg: "com.evenwell.factorywizard.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for setup wizard?", safety: "caution" }, + { pkg: "com.evenwell.foxlauncher.partner", label: "Partner", description: "Partner Launcher Customization", safety: "safe" }, + { pkg: "com.evenwell.fqc", label: "Fqc", description: "FQC is a secret test menu. It lets you test the hardware (touch screen, speakers, SD card, SIM card, camera...", safety: "safe" }, + { pkg: "com.evenwell.legalterm.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for some terms and conditions?", safety: "caution" }, + { pkg: "com.evenwell.managedprovisioning.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Managed Provisioning?", safety: "caution" }, + { pkg: "com.evenwell.mappartner", label: "Mappartner", description: "????", safety: "safe" }, + { pkg: "com.evenwell.nps.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Net Promoter Score?", safety: "caution" }, + { pkg: "com.evenwell.pandorasbox.app", label: "App", description: "WTF is this?", safety: "safe" }, + { pkg: "com.evenwell.partnerbrowsercustomizations.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for some browser customization?", safety: "caution" }, + { pkg: "com.evenwell.permissiondetection.overlay.base.s600ww", label: "S600Ww", description: "A theme overlay for some \"permissiondetection\" package?", safety: "caution" }, + { pkg: "com.evenwell.phone.overlay.base", label: "Base", description: "Some overlay for the dialer app? Overlays are usually themes.", safety: "caution" }, + { pkg: "com.evenwell.PowerMonitor.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Power Monitor?", safety: "caution" }, + { pkg: "com.evenwell.powersaving.g3.overlay.d.base.s600e0", label: "S600E0", description: "Theme overlay for Power Saving?", safety: "caution" }, + { pkg: "com.evenwell.providers.downloads.ui.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for the downloads app?", safety: "caution" }, + { pkg: "com.evenwell.providers.partnerbookmarks.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Partner Bookmarks?", safety: "caution" }, + { pkg: "com.evenwell.providers.weather.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for weather provider?", safety: "caution" }, + { pkg: "com.evenwell.pushagent.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for pushagent?", safety: "caution" }, + { pkg: "com.evenwell.retaildemoapp.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Nokia retail demonstration mode?", safety: "caution" }, + { pkg: "com.evenwell.screenlock.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for the lock-screen?", safety: "caution" }, + { pkg: "com.evenwell.settings.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for settings?", safety: "caution" }, + { pkg: "com.evenwell.SettingsUtils.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for SettingsUtils?", safety: "caution" }, + { pkg: "com.evenwell.SetupWizard.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Setup Wizard?", safety: "caution" }, + { pkg: "com.evenwell.stbmonitor.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for STB Monitor?", safety: "caution" }, + { pkg: "com.evenwell.telecom.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for something telecom-related?", safety: "caution" }, + { pkg: "com.evenwell.UsageStatsLogReceiver.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Usage Stats Log?", safety: "caution" }, + { pkg: "com.evenwell.weatherservice.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for weather service?", safety: "caution" }, + { pkg: "com.fih.infodisplay", label: "Infodisplay", description: "Foxconn info display", safety: "safe" }, + { pkg: "com.fih.StatsdLogger", label: "Statsdlogger", description: "Foxconn stats logger", safety: "safe" }, + { pkg: "com.foxconn.ifaa", label: "Ifaa", description: "IFAA = (China\u2019s) Internet Finance Authentication Alliance", safety: "safe" }, + { pkg: "com.android.cellbroadcastreceiver.overlay.base.s600ww", label: "S600Ww", description: "Nokia theme overlay for com.android.cellbroadcastreceiver", safety: "caution", deps: ["com.android.cellbroadcastreceiver"] }, + { pkg: "com.evenwell.camera2", label: "Camera2", description: "Nokia camera by evenwell (https://play.google.com/store/apps/details?id=com.evenwell.camera2)", safety: "caution" }, + { pkg: "com.evenwell.fmradio.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Nokia radio app?", safety: "caution" }, + { pkg: "com.evenwell.hdrservice", label: "Hdrservice", description: "HDR Service (https://play.google.com/store/apps/details?id=com.evenwell.hdrservice)", safety: "caution" }, + { pkg: "com.evenwell.OTAUpdate.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for OTA Update UI?", safety: "caution" }, + { pkg: "com.coremobility.app.vnotes", label: "Vnotes", description: "Voicemail App?", safety: "caution" }, + { pkg: "com.heytap.cloud", label: "Cloud", description: "HeyTap Cloud", safety: "safe", deps: ["com.heytap.mcs"] }, + { pkg: "com.mobiletools.systemhelper", label: "Systemhelper", description: "System Helper", safety: "safe" }, + { pkg: "com.sohu.inputmethod.sogouoem", label: "Sogouoem", description: "Default keyboard", safety: "caution" }, + { pkg: "org.ifaa.aidl.manager", label: "Manager", description: "IfaaManagerService", safety: "safe" }, + { pkg: "se.dirac.acs", label: "Acs", description: "Dirac Control Service", safety: "caution" }, + { pkg: "android.autoinstalls.config.Xiaomi.cactus", label: "Cactus", description: "Cactus is the device codename.", safety: "safe" }, + { pkg: "android.autoinstalls.config.Xiaomi.cepheus", label: "Cepheus", description: "Cepheus is the device codename.", safety: "safe" }, + { pkg: "android.autoinstalls.config.Xiaomi.daisy", label: "Daisy", description: "Daisy is the device codename.", safety: "safe" }, + { pkg: "android.autoinstalls.config.Xiaomi.dipper", label: "Dipper", description: "Dipper is the device codename.", safety: "safe" }, + { pkg: "android.romstats", label: "Romstats", description: "Misleading package name. This is a Xiaomi-only package.", safety: "safe" }, + { pkg: "cn.wps.xiaomi.abroad.lite", label: "Lite", description: "Mi Doc viewer", safety: "safe" }, + { pkg: "com.android.backup", label: "Backup", description: "Xiaomi Backup and Restore feature (mislead package name).", safety: "safe" }, + { pkg: "com.android.midrive", label: "Midrive", description: "Mi Drive", safety: "safe" }, + { pkg: "com.autonavi.minimap", label: "Minimap", description: "\u9ad8\u5fb7\u5730\u56fe (Yeah no english translation) (https://play.google.com/store/apps/details?id=com.autonavi.minimap)", safety: "safe" }, + { pkg: "com.baidu.duersdk.opensdk", label: "Opensdk", description: "Duer stuff from Baidu", safety: "safe" }, + { pkg: "com.baidu.input_mi", label: "Input Mi", description: "Baidu IME (Baidu keyboard)", safety: "caution" }, + { pkg: "com.baidu.searchbox", label: "Searchbox", description: "\u767e\u5ea6 (https://play.google.com/store/apps/details?id=com.baidu.searchbox)", safety: "safe" }, + { pkg: "com.bsp.catchlog", label: "Catchlog", description: "bsp = Board support package", safety: "safe" }, + { pkg: "com.duokan.phone.remotecontroller", label: "Remotecontroller", description: "Mi Remote Controller (https://play.google.com/store/apps/details?id=com.duokan.phone.remotecontroller)", safety: "safe" }, + { pkg: "com.duokan.phone.remotecontroller.peel.plugin", label: "Plugin", description: "Peel Mi Remote (https://play.google.com/store/apps/details?id=com.duokan.phone.remotecontroller.peel.plugin)", safety: "safe" }, + { pkg: "com.facemoji.lite.xiaomi.gp", label: "Gp", description: "Facemoji Keyboard Lite for Xiaomi - Emoji & Theme (https://play.google.com/store/apps/details?id=com.facem...", safety: "safe" }, + { pkg: "com.factory.mmigroup", label: "Mmigroup", description: "Hidden super-menu accessible by dialing *#*#64633#*#*", safety: "safe" }, + { pkg: "com.fingerprints.sensortesttool", label: "Sensortesttool", description: "Sensor Test Tool", safety: "safe" }, + { pkg: "com.huaqin.diaglogger", label: "Diaglogger", description: "Secret logging menu only accessible by dialing using a \"secret code\" (*#*#CODE#*#*)", safety: "safe" }, + { pkg: "com.huaqin.factory", label: "Factory", description: "Hidden test app (dial *#*#64663#*#*)", safety: "safe" }, + { pkg: "com.huaqin.sar", label: "Sar", description: "SetTransmitPower", safety: "safe" }, + { pkg: "com.milink.service", label: "Service", description: "UniPlay Service", safety: "safe" }, + { pkg: "com.mipay.wallet.in", label: "In", description: "Mi Pay (https://play.google.com/store/apps/details?id=com.mipay.in.wallet)", safety: "safe" }, + { pkg: "com.mipay.wallet.id", label: "Id", description: "Mi Pay (https://play.google.com/store/apps/details?id=com.mipay.in.wallet)", safety: "safe" }, + { pkg: "com.mipay.wallet", label: "Wallet", description: "Mi Pay (https://play.google.com/store/apps/details?id=com.mipay.in.wallet)", safety: "safe" }, + { pkg: "com.wapi.wapicertmanager", label: "Wapicertmanager", description: "WAPI Certificates Manager", safety: "safe" }, + { pkg: "com.mfashiongallery.emag", label: "Emag", description: "Wallpapers by Xiaomi", safety: "safe" }, + { pkg: "com.qiyi.video", label: "Video", description: "IQIYI (https://play.google.com/store/apps/details?id=com.qiyi.video)", safety: "safe" }, + { pkg: "com.sohu.inputmethod.sogou.xiaomi", label: "Xiaomi", description: "Sogou keyboard for chinese only.", safety: "safe" }, + { pkg: "com.wt.secret_code_manager", label: "Secret Code Manager", description: "Hidden app which associates an action (display logging info) to a secret code.", safety: "safe" }, + { pkg: "com.android.systemui.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.systemui.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "android.telephony.overlay.cmcc", label: "Cmcc", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.mms.overlay.cmcc", label: "Cmcc", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.settings.overlay.cmcc", label: "Cmcc", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.systemui.overlay.cmcc", label: "Cmcc", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.networksettings.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.android.systemui.overlay.ct", label: "Ct", description: "Likely overlay themes from China Mobile Communications Corporation(CMCC) or China Telecom(CT).", safety: "caution" }, + { pkg: "com.wingtech.standard", label: "Standard", description: "WTStandardTest", safety: "safe" }, + { pkg: "com.android.camera2", label: "Camera2", description: "Xiaomi Camera (I don't know why they kept this package name. It's really confusing.)", safety: "caution" }, + { pkg: "com.android.fileexplorer", label: "Fileexplorer", description: "Xiaomi/Mi File Explorer (Again it's a really poor choice for a package name considering it is not the AOSP ...", safety: "caution" }, + { pkg: "com.android.globalFileexplorer", label: "Globalfileexplorer", description: "Misleading package name. It's the Xiaomi Files Manager on older phones", safety: "safe" }, + { pkg: "com.android.incallui", label: "Incallui", description: "Xiaomi (and OnePlus) Phone dialer (here we go again! Another confusing package name)", safety: "caution" }, + { pkg: "com.android.thememanager", label: "Thememanager", description: "MIUI Themes (manager)", safety: "caution" }, + { pkg: "com.android.thememanager.module", label: "Module", description: "Something related to Xiaomi's theme manager?", safety: "caution" }, + { pkg: "com.fido.xiaomi.uafclient", label: "Uafclient", description: "UAF client for FIDO.", safety: "caution" }, + { pkg: "com.android.updater", label: "Updater", description: "Mi Updater", safety: "keep" }, + { pkg: "com.lbe.security.miui", label: "Miui", description: "Permission manager", safety: "keep" }, + { pkg: "com.google.android.overlay.gmsgsaconfig", label: "Gmsgsaconfig", description: "Overlay theme for gmsgsaconfig? Probably an RRO? https://source.android.com/devices/architecture/rros", safety: "caution" }, + { pkg: "com.evenwell.AprUploadService", label: "Apruploadservice", description: "Apr Upload Service ???? [MORE INFO NEEDED]", safety: "caution" }, + { pkg: "com.evenwell.AprUploadService.data.overlay.base", label: "Base", description: "Theme overlay for Apr Upload Service?", safety: "caution" }, + { pkg: "com.evenwell.AprUploadService.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Apr Upload Service?", safety: "caution" }, + { pkg: "com.evenwell.autoregistration", label: "Autoregistration", description: "Spyware app which sends warranty details to China", safety: "safe" }, + { pkg: "com.evenwell.autoregistration.overlay.base", label: "Base", description: "Theme overlay for a Spyware app?", safety: "caution" }, + { pkg: "com.evenwell.autoregistration.overlay.base.s600id", label: "S600Id", description: "Theme overlay for a Spyware app?", safety: "caution" }, + { pkg: "com.evenwell.autoregistration.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for a Spyware app?", safety: "caution" }, + { pkg: "com.evenwell.autoregistration.overlay.d.base.s600id", label: "S600Id", description: "Theme overlay for a Spyware app?", safety: "caution" }, + { pkg: "com.evenwell.batteryprotect", label: "Batteryprotect", description: "Battery protect is advertised to improve battery performance, but in practice it drains your battery and ki...", safety: "safe" }, + { pkg: "com.evenwell.batteryprotect.overlay.base", label: "Base", description: "Theme overlay for Battery Protect?", safety: "caution" }, + { pkg: "com.evenwell.batteryprotect.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Battery Protect?", safety: "caution" }, + { pkg: "com.evenwell.batteryprotect.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Battery Protect?", safety: "caution" }, + { pkg: "com.evenwell.bboxsbox", label: "Bboxsbox", description: "??? [MORE INFO NEEDED]", safety: "safe" }, + { pkg: "com.evenwell.bokeheditor", label: "Bokeheditor", description: "Probably related to adding fake bokeh (a focus blur effect) to photos.", safety: "caution" }, + { pkg: "com.evenwell.CPClient", label: "Cpclient", description: "CP = Client Provisioning.", safety: "caution" }, + { pkg: "com.evenwell.CPClient.overlay.base", label: "Base", description: "Theme overlay for CPClient?", safety: "caution" }, + { pkg: "com.evenwell.CPClient.overlay.base.s600id", label: "S600Id", description: "Theme overlay for CPClient?", safety: "caution" }, + { pkg: "com.evenwell.custmanager", label: "Custmanager", description: "Customer manager", safety: "caution" }, + { pkg: "com.evenwell.custmanager.data.overlay.base", label: "Base", description: "Theme overlay for Customer Manager?", safety: "caution" }, + { pkg: "com.evenwell.custmanager.data.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Customer Manager?", safety: "caution" }, + { pkg: "com.evenwell.custmanager.data.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for Customer Manager?", safety: "caution" }, + { pkg: "com.evenwell.dataagent", label: "Dataagent", description: "Data agent", safety: "caution" }, + { pkg: "com.evenwell.dataagent.overlay.base", label: "Base", description: "Theme overlay for Data Agent?", safety: "caution" }, + { pkg: "com.evenwell.dataagent.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Data Agent?", safety: "caution" }, + { pkg: "com.evenwell.DbgCfgTool", label: "Dbgcfgtool", description: "Debug Config Tool?", safety: "safe" }, + { pkg: "com.evenwell.DbgCfgTool.overlay.base", label: "Base", description: "Theme overlay for Debug Config Tool?", safety: "caution" }, + { pkg: "com.evenwell.DbgCfgTool.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Debug Config Tool?", safety: "caution" }, + { pkg: "com.evenwell.DeviceMonitorControl", label: "Devicemonitorcontrol", description: "Some form of device monitoring?", safety: "caution" }, + { pkg: "com.evenwell.DeviceMonitorControl.data.overlay.base", label: "Base", description: "Theme overlay for Device Monitor Control?", safety: "caution" }, + { pkg: "com.evenwell.DeviceMonitorControl.data.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Device Monitor Control?", safety: "caution" }, + { pkg: "com.evenwell.factorywizard", label: "Factorywizard", description: "Likely part of the first-boot device setup (new/factory reset device).", safety: "safe" }, + { pkg: "com.evenwell.factorywizard.overlay.base", label: "Base", description: "Theme overlay for setup wizard?", safety: "caution" }, + { pkg: "com.evenwell.legalterm", label: "Legalterm", description: "Provides terms and conditions (legal notice)", safety: "safe" }, + { pkg: "com.evenwell.managedprovisioning", label: "Managedprovisioning", description: "Nokia implementation of com.android.managedprovisioning? If so it manages Android user accounts, allowing y...", safety: "caution" }, + { pkg: "com.evenwell.managedprovisioning.overlay.base", label: "Base", description: "Theme overlay for Managed Provisioning?", safety: "caution" }, + { pkg: "com.evenwell.managedprovisioning.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Managed Provisioning?", safety: "caution" }, + { pkg: "com.evenwell.nps", label: "Nps", description: "Net Promoter Score", safety: "safe" }, + { pkg: "com.evenwell.nps.overlay.base", label: "Base", description: "Theme overlay for Net Promoter Score?", safety: "caution" }, + { pkg: "com.evenwell.nps.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Net Promoter Score?", safety: "caution" }, + { pkg: "com.evenwell.pandorasbox", label: "Pandorasbox", description: "WTF is this? [MORE INFO NEEDED]", safety: "safe" }, + { pkg: "com.evenwell.partnerbrowsercustomizations", label: "Partnerbrowsercustomizations", description: "Adds something (Nokia-)partner-related to your browser? Probably adds bookmarks.", safety: "safe" }, + { pkg: "com.evenwell.partnerbrowsercustomizations.overlay.base", label: "Base", description: "Theme overlay for some browser customization?", safety: "caution" }, + { pkg: "com.evenwell.partnerbrowsercustomizations.overlay.base.s600id", label: "S600Id", description: "Theme overlay for some browser customization?", safety: "caution" }, + { pkg: "com.evenwell.permissiondetection", label: "Permissiondetection", description: "???? [MORE INFO NEEDED]", safety: "caution" }, + { pkg: "com.evenwell.phone.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for the dialer app?", safety: "caution" }, + { pkg: "com.evenwell.PowerMonitor", label: "Powermonitor", description: "Drains more battery than it saves.", safety: "safe" }, + { pkg: "com.evenwell.PowerMonitor.overlay.base", label: "Base", description: "Theme overlay for Power Monitor?", safety: "caution" }, + { pkg: "com.evenwell.PowerMonitor.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Power Monitor?", safety: "caution" }, + { pkg: "com.evenwell.providers.downloads.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for the downloads app?", safety: "caution" }, + { pkg: "com.evenwell.providers.weather", label: "Weather", description: "Provider for the Nokia weather app.", safety: "safe" }, + { pkg: "com.evenwell.pushagent", label: "Pushagent", description: "Related to push notifications for Nokia apps?", safety: "safe" }, + { pkg: "com.evenwell.pushagent.overlay.base", label: "Base", description: "Theme overlay for pushagent?", safety: "caution" }, + { pkg: "com.evenwell.pushagent.overlay.base.s600id", label: "S600Id", description: "Theme overlay for pushagent?", safety: "caution" }, + { pkg: "com.evenwell.retaildemoapp", label: "Retaildemoapp", description: "Nokia retail demonstration mode", safety: "safe" }, + { pkg: "com.evenwell.retaildemoapp.overlay.base", label: "Base", description: "Theme overlay for Nokia retail demonstration mode?", safety: "caution" }, + { pkg: "com.evenwell.retaildemoapp.overlay.base.s600id", label: "S600Id", description: "Theme overlay for Nokia retail demonstration mode?", safety: "caution" }, + { pkg: "com.evenwell.settings.data.overlay.base", label: "Base", description: "Overlay related to settings. Overlays are usually themes.", safety: "caution" }, + { pkg: "com.evenwell.SettingsUtils", label: "Settingsutils", description: "Settings utils", safety: "safe" }, + { pkg: "com.evenwell.SetupWizard", label: "Setupwizard", description: "The first-boot device setup wizard for new/factory reset devices.", safety: "safe" }, + { pkg: "com.evenwell.SetupWizard.overlay.base", label: "Base", description: "Theme overlay for Setup Wizard?", safety: "caution" }, + { pkg: "com.evenwell.setupwizard.btl.s600ww.overlay", label: "Overlay", description: "Theme overlay for Setup Wizard?", safety: "caution" }, + { pkg: "com.evenwell.SetupWizard.overlay.d.base.s600ww", label: "S600Ww", description: "Theme overlay for Setup Wizard?", safety: "caution" }, + { pkg: "com.evenwell.stbmonitor", label: "Stbmonitor", description: "Apparently used to stabilize phone usage.", safety: "safe" }, + { pkg: "com.evenwell.stbmonitor.data.overlay.base", label: "Base", description: "Theme overlay for STB Monitor?", safety: "caution" }, + { pkg: "com.evenwell.stbmonitor.data.overlay.base.s600id", label: "S600Id", description: "Theme overlay for STB Monitor?", safety: "caution" }, + { pkg: "com.evenwell.telecom.data.overlay.base", label: "Base", description: "Overlay related to Telecom data? Overlays are usually themes.", safety: "caution" }, + { pkg: "com.evenwell.telecom.data.overlay.base.s600id", label: "S600Id", description: "Theme overlay for something telecom-related?", safety: "caution" }, + { pkg: "com.evenwell.UsageStatsLogReceiver", label: "Usagestatslogreceiver", description: "Logging stuff", safety: "caution" }, + { pkg: "com.evenwell.UsageStatsLogReceiver.data.overlay.back.s600id", label: "S600Id", description: "Theme overlay for Usage Stats Log?", safety: "caution" }, + { pkg: "com.evenwell.weather.overlay.base.s600ww", label: "S600Ww", description: "Theme overlay for the Nokia weather app?", safety: "caution" }, + { pkg: "com.evenwell.weatherservice", label: "Weatherservice", description: "Service for the weather app", safety: "safe" }, + { pkg: "com.hiya.star", label: "Star", description: "also called android-ss-service-lib (Samsung-exclusive)", safety: "safe", neededBy: ["com.samsung.android.smartcallprovider"] }, + { pkg: "com.agui.game", label: "Game", description: "Game (From Unihertz Jelly2)", safety: "safe" }, + { pkg: "com.agui.studentmodel", label: "Studentmodel", description: "Student mode (From Unihertz Jelly2)", safety: "safe" }, + { pkg: "com.fairphone.activator", label: "Activator", description: "Fairphone activation service", safety: "safe" }, + { pkg: "com.fairphone.myfairphone", label: "Myfairphone", description: "My Fairphone app", safety: "caution" }, + { pkg: "com.fp.camera", label: "Camera", description: "Fairphone Camera app", safety: "caution" }, + { pkg: "com.tblenovo.center", label: "Center", description: "Useless dashboard related to the User Experience Program (com.lenovo.ue.device). Has 25 permissions (includ...", safety: "safe" }, + { pkg: "com.lenovo.ue.device", label: "Device", description: "User Experience Program", safety: "safe" }, + { pkg: "com.tblenovo.lenovotips", label: "Lenovotips", description: "Useless Lenovo Tips app used by Lenovo to display un-dismissable and un-mutable ads in notifications.", safety: "safe" }, + { pkg: "com.transsion.tecnospot", label: "Tecnospot", description: "TECNO SPOT (https://play.google.com/store/apps/details?id=com.transsion.tecnospot)", safety: "safe" }, + { pkg: "com.transsion.carlcare", label: "Carlcare", description: "Carlcare (https://play.google.com/store/apps/details?id=com.transsion.carlcare)", safety: "safe" }, + { pkg: "com.transsion.hiparty", label: "Hiparty", description: "Hi Party", safety: "safe" }, + { pkg: "com.transsnet.store", label: "Store", description: "Palm Store. App store with unsecure apps and probably malware. Has ads trackers and lot of intrusives permi...", safety: "safe" }, + { pkg: "com.transsion.magicshow", label: "Magicshow", description: "(Bad) video Player with Ads and weak security (including an unsecured WebView implementation that can lead ...", safety: "safe" }, + { pkg: "com.transsion.plat.appupdate", label: "Appupdate", description: "App Update", safety: "safe" }, + { pkg: "com.transsion.magazineservice.hios", label: "Hios", description: "Shows trending news, games and wallpapers on the lockscreen. Talks to ads services", safety: "safe" }, + { pkg: "com.transsion.filemanagerx", label: "Filemanagerx", description: "File Manager App (https://play.google.com/store/apps/details?id=com.transsion.filemanagerx)", safety: "caution" }, + { pkg: "com.gallery20", label: "Gallery20", description: "AI Gallery (https://play.google.com/store/apps/details?id=com.gallery20)", safety: "caution" }, + { pkg: "com.transsion.videocallenhancer", label: "Videocallenhancer", description: "Applies beauty effect in WhatsApp video calls. Lots of permissions. Talks to Google ads service.", safety: "safe" }, + { pkg: "com.transsion.magicfont", label: "Magicfont", description: "Magic Fonts (https://play.google.com/store/apps/details?id=com.transsion.magicfont)", safety: "safe" }, + { pkg: "com.transsion.kolun.assistant", label: "Assistant", description: "Smart Assistant App", safety: "safe" }, + { pkg: "com.transsion.health", label: "Health", description: "Tecno health app. Sends your personal data to Firebase google servers and Tecno servers. Those data can be ...", safety: "safe" }, + { pkg: "com.transsion.audioshare", label: "Audioshare", description: "Audio Share", safety: "safe" }, + { pkg: "com.transsion.microintelligence", label: "Microintelligence", description: "Micro Intelligence", safety: "safe" }, + { pkg: "com.transsion.phonemaster", label: "Phonemaster", description: "Phone Master.", safety: "safe" }, + { pkg: "com.transsion.smartpanel", label: "Smartpanel", description: "Smart Panel (Settings -> Smart Assistant)", safety: "safe" }, + { pkg: "com.transsion.hamal", label: "Hamal", description: "It seems to be an \"aftersales user experience logging app\". Really shady app with questionable code (judgeW...", safety: "safe" }, + { pkg: "com.transsion.agingfunction", label: "Agingfunction", description: "Quality Assurance (QA) testing app. The app is used by the manufacturer to to test the correction functionn...", safety: "safe" }, + { pkg: "com.transsion.dirac", label: "Dirac", description: "Improves audio quality depending on your surrounding environment and your headphones.", safety: "caution" }, + { pkg: "com.transsion.batterylab", label: "Batterylab", description: "Supposed to improve battery life but logs especially lots of usage info and bind it to your unique android ...", safety: "safe" }, + { pkg: "com.transsion.stasticalsales", label: "Stasticalsales", description: "Sends after-sales telemetry data (including at least the phone number and the IMSI). You don't want this. T...", safety: "safe" }, + { pkg: "com.transsion.childmode", label: "Childmode", description: "Kids Mode", safety: "safe" }, + { pkg: "com.transsion.trancare", label: "Trancare", description: "Telemetry. Makes requests (with weak crypto) to the Shalltry CDN (https://mi-test.shalltry.com). Collects I...", safety: "safe" }, + { pkg: "com.heytap.market", label: "Market", description: "Heytap/Oppo app store.There is no benefit of using this app store and you should not keep a privileged app ...", safety: "safe", deps: ["com.heytap.mcs"] }, + { pkg: "com.heytap.browser", label: "Browser", description: "Oppo Browser", safety: "safe" }, + { pkg: "com.heytap.habit.analysis", label: "Analysis", description: "Most likely used to track your habits from IoT HeyTap devices [TO BE CONFIRMED]", safety: "safe" }, + { pkg: "com.heytap.music", label: "Music", description: "Default Oppo Music App with insecure WebView Implementation (execution of user controlled code in WebView i...", safety: "caution" }, + { pkg: "com.heytap.pictorial", label: "Pictorial", description: "Lock Screen Magazine which can display ads depending on your ColorOS version", safety: "safe" }, + { pkg: "com.heytap.themestore", label: "Themestore", description: "Theme Store with 73 permissions! (including CAMERA, CALL_PHONE, READ_CONTACTS, REQUEST_INSTALL_PACKAGES...)...", safety: "safe" }, + { pkg: "com.heytap.usercenter", label: "Usercenter", description: "Login service for various HeyTap related services like HeyTap Cloud etc.", safety: "caution" }, + { pkg: "com.agui.usbcamera", label: "Usbcamera", description: "Toolbox > \"USB Camera\" Only usefull if you want to use a USB Camera", safety: "safe" }, + { pkg: "com.agui.game", label: "Game", description: "Game mode", safety: "safe" }, + { pkg: "com.agui.newsos", label: "Newsos", description: "SOS", safety: "safe" }, + { pkg: "com.agui.nfc", label: "Nfc", description: "NFC card emulation: simulates various types of unencrypted entrance cards.", safety: "safe" }, + { pkg: "com.scanning.agold.agoldscanning", label: "Agoldscanning", description: "\"Scan\" Settings > intelligent assistant: Scan. QR code & Bar code scanner.", safety: "caution" }, + { pkg: "com.agui.studentmodel", label: "Studentmodel", description: "Student Mode", safety: "safe" }, + { pkg: "com.agui.update", label: "Update", description: "\"Wireless Update\" Settings > About Phone : Sytem update.", safety: "caution", neededBy: ["com.agui.update.overlay"] }, + { pkg: "com.agui.update.overlay", label: "Overlay", description: "Overlay for com.agui.update. Overlay are usually themes.", safety: "caution", deps: ["com.agui.update"] }, + { pkg: "com.agui.screenshot", label: "Screenshot", description: "Screenshot", safety: "caution" }, + { pkg: "com.agui.batterystatsdumper", label: "Batterystatsdumper", description: "Battery Stats Dumper", safety: "caution" }, + { pkg: "com.agui.app.imei", label: "Imei", description: "IMEI Tool: Change MEID's & IMEI's of both SIM's", safety: "caution" }, + { pkg: "com.agui.appblock", label: "Appblock", description: "App blocker", safety: "caution" }, + { pkg: "com.agui.providers.pedometer", label: "Pedometer", description: "Toolbox > \"Pedometer\" Pedometer/step counter.", safety: "keep" }, + { pkg: "com.agui.app.memtester", label: "Memtester", description: "Memory tester", safety: "safe" }, + { pkg: "com.aura.oobe.kbdi", label: "Kbdi", description: "Appcloud", safety: "safe" }, + { pkg: "com.bkk.theme", label: "Theme", description: "Vivo theme (https://play.google.com/store/apps/details?id=com.bbk.theme)", safety: "safe" }, + { pkg: "com.bbk.iqoo.logsystem", label: "Logsystem", description: "User experience service", safety: "safe" }, + { pkg: "com.mobile.iroaming", label: "Iroaming", description: "Data Store", safety: "caution" }, + { pkg: "com.vivo.space", label: "Space", description: "Open Vivo official website.", safety: "safe" }, + { pkg: "com.baidu.input_vivo", label: "Input Vivo", description: "Default keyboard (Baidu IME customized for Vivo devices).", safety: "caution" }, + { pkg: "com.bbk.calendar", label: "Calendar", description: "Default calendar app.", safety: "caution" }, + { pkg: "com.vivo.share", label: "Share", description: "Vivo share", safety: "caution" }, + { pkg: "com.yozo.vivo.office", label: "Office", description: "Vivo document reader", safety: "caution" }, + { pkg: "com.vivo.browser", label: "Browser", description: "Vivo browser full of trackers (https://play.google.com/store/apps/details?id=com.vivo.browser)", safety: "safe" }, + { pkg: "com.vivo.dream.weather", label: "Weather", description: "Vivo weather app", safety: "safe" }, + { pkg: "com.vivo.hybrid", label: "Hybrid", description: "Quick App", safety: "caution" }, + { pkg: "com.vivo.puresearch", label: "Puresearch", description: "Search Widget", safety: "safe" }, + { pkg: "com.vivo.voicewakeup", label: "Voicewakeup", description: "Voice wake-up. Has a lot of permissions (REQUEST_INSTALL_PACKAGES, READ_EXTERNAL_STORAGE, RECORD_AUDIO...)....", safety: "safe" }, + { pkg: "com.bbk.appstore", label: "Appstore", description: "Vivo app store.", safety: "caution" }, + { pkg: "com.bbk.account", label: "Account", description: "Vivo account", safety: "caution" }, + { pkg: "com.google.android.wearable.assistant", label: "Assistant", description: "Google Assistant for Android wearables (https://play.google.com/store/apps/details?id=com.google.android.we...", safety: "caution" }, + { pkg: "com.google.android.wearable.batteryservices", label: "Batteryservices", description: "It's used to manage battery-related things on Android smartwatches, like monitoring the battery level, mana...", safety: "caution" }, + { pkg: "com.google.android.clockwork.oemsetup", label: "Oemsetup", description: "Installs carrier apps after the first time setup. Haven't noticed any consequences after uninstalling. I al...", safety: "safe" }, + { pkg: "com.google.android.apps.wearable.retailattractloop", label: "Retailattractloop", description: "Demo mode - you see it in the stores (the video playing while idle).", safety: "safe" }, + { pkg: "com.android.cts.ctsshim", label: "Ctsshim", description: "Compatibility Test Service. Used by developers to identify and resolve compatibility issues with Android apps.", safety: "caution" }, + { pkg: "com.google.android.wearable.healthservices", label: "Healthservices", description: "Health Services by Google", safety: "caution" }, + { pkg: "com.google.android.wearable.ambient", label: "Ambient", description: "It's like doze on Android phones. Not recommended to disable, as this package reduces battery drain when idle.", safety: "caution" }, + { pkg: "com.google.android.apps.wearable.settings", label: "Settings", description: "WearOS settings", safety: "caution" }, + ], + }, +] \ No newline at end of file diff --git a/frontend/src/lib/notify.ts b/frontend/src/lib/notify.ts new file mode 100644 index 0000000..46023ed --- /dev/null +++ b/frontend/src/lib/notify.ts @@ -0,0 +1,10 @@ +// Simple toast state management - used with sonner +import { toast } from 'sonner' + +export const notify = { + success: (msg: string) => toast.success(msg, { duration: 3000 }), + error: (msg: string) => toast.error(msg, { duration: 5000 }), + info: (msg: string) => toast(msg, { duration: 3000 }), + loading: (msg: string) => toast.loading(msg), + dismiss: (id?: string | number) => toast.dismiss(id), +} diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts new file mode 100644 index 0000000..58277b5 --- /dev/null +++ b/frontend/src/lib/types.ts @@ -0,0 +1,117 @@ +export interface Device { + serial: string + status: string +} + +export interface DeviceInfo { + model: string + androidVersion: string + buildNumber: string + batteryLevel: string + serial: string + ipAddress: string + rootStatus: string + codename: string + ramTotal: string + storageInfo: string + brand: string + deviceName: string + securityPatch: string + uptime: string + bootloaderStatus: string + screenResolution: string + basebandVersion: string + kernelVersion: string + cpuArch: string +} + +export interface FileEntry { + name: string + type: 'File' | 'Directory' | 'Symlink' + size: string + permissions: string + date: string + time: string +} + +export interface PackageInfo { + packageName: string + isEnabled: boolean +} + +export interface LogcatLine { + raw: string + level: string + tag: string + message: string + pid: string + time: string +} + +export interface AppInspection { + packageName: string + versionName: string + versionCode: string + targetSdk: string + minSdk: string + installPath: string + dataDir: string + installer: string + firstInstall: string + lastUpdated: string + isSystem: boolean + isEnabled: boolean + isDebuggable: boolean + uid: string + permissions: string[] + activities: string[] + services: string[] + receivers: string[] + providers: string[] + nativeLibs: string[] + certSubject: string + certIssuer: string + certExpiry: string + certSha256: string + manifestDump: string +} + +export interface CertInfo { + filename: string + subject: string + issuer: string + expiry: string + fingerprint: string + isUser: boolean + isSystem: boolean +} + +export interface PropEntry { + key: string + value: string + category: string +} + +export interface BackupOptions { + includeApks: boolean + includeShared: boolean + includeSystem: boolean + packages: string[] + allApps: boolean +} + +export type View = + | 'dashboard' + | 'files' + | 'packages' + | 'debloater' + | 'shell' + | 'logcat' + | 'appinspect' + | 'certs' + | 'backup' + | 'props' + | 'flasher' + | 'pixelflasher' + | 'utilities' + | 'settings' diff --git a/frontend/src/lib/wails.ts b/frontend/src/lib/wails.ts new file mode 100644 index 0000000..23fddd0 --- /dev/null +++ b/frontend/src/lib/wails.ts @@ -0,0 +1,142 @@ +// Wails runtime bridge +// This file is auto-generated by wails but we provide a typed version +// The actual runtime is injected by Wails at build time + +// @ts-ignore +export const GetDevices = () => window['go']['main']['App']['GetDevices']() +// @ts-ignore +export const GetDeviceInfo = () => window['go']['main']['App']['GetDeviceInfo']() +// @ts-ignore +export const GetDeviceMode = () => window['go']['main']['App']['GetDeviceMode']() +// @ts-ignore +export const Reboot = (mode: string) => window['go']['main']['App']['Reboot'](mode) +// @ts-ignore +export const GetBinaryInfo = () => window['go']['main']['App']['GetBinaryInfo']() +// @ts-ignore +export const CheckSystemRequirements = () => window['go']['main']['App']['CheckSystemRequirements']() +// @ts-ignore +export const SetAdbPath = (path: string) => window['go']['main']['App']['SetAdbPath'](path) +// @ts-ignore +export const SetFastbootPath = (path: string) => window['go']['main']['App']['SetFastbootPath'](path) +// @ts-ignore +export const CancelOperation = () => window['go']['main']['App']['CancelOperation']() + +// File ops +// @ts-ignore +export const ListFiles = (path: string) => window['go']['main']['App']['ListFiles'](path) +// @ts-ignore +export const PushFile = (local: string, remote: string) => window['go']['main']['App']['PushFile'](local, remote) +// @ts-ignore +export const PullFile = (remote: string, local: string) => window['go']['main']['App']['PullFile'](remote, local) +// @ts-ignore +export const CreateFolder = (path: string) => window['go']['main']['App']['CreateFolder'](path) +// @ts-ignore +export const DeleteFile = (path: string) => window['go']['main']['App']['DeleteFile'](path) +// @ts-ignore +export const DeleteMultipleFiles = (paths: string[]) => window['go']['main']['App']['DeleteMultipleFiles'](paths) +// @ts-ignore +export const RenameFile = (oldPath: string, newPath: string) => window['go']['main']['App']['RenameFile'](oldPath, newPath) +// @ts-ignore +export const CopyFile = (src: string, dst: string) => window['go']['main']['App']['CopyFile'](src, dst) +// @ts-ignore +export const PullMultipleFiles = (paths: string[]) => window['go']['main']['App']['PullMultipleFiles'](paths) +// @ts-ignore +export const SelectFileForPush = () => window['go']['main']['App']['SelectFileForPush']() + +// Package ops +// @ts-ignore +export const ListPackages = (filter: string) => window['go']['main']['App']['ListPackages'](filter) +// @ts-ignore +export const InstallPackage = (path: string) => window['go']['main']['App']['InstallPackage'](path) +// @ts-ignore +export const UninstallPackage = (pkg: string) => window['go']['main']['App']['UninstallPackage'](pkg) +// @ts-ignore +export const DisablePackage = (pkg: string) => window['go']['main']['App']['DisablePackage'](pkg) +// @ts-ignore +export const EnablePackage = (pkg: string) => window['go']['main']['App']['EnablePackage'](pkg) +// @ts-ignore +export const ClearData = (pkg: string) => window['go']['main']['App']['ClearData'](pkg) +// @ts-ignore +export const PullApk = (pkg: string) => window['go']['main']['App']['PullApk'](pkg) +// @ts-ignore +export const ForceStopPackage = (pkg: string) => window['go']['main']['App']['ForceStopPackage'](pkg) +// @ts-ignore +export const GetPackageInfo = (pkg: string) => window['go']['main']['App']['GetPackageInfo'](pkg) +// @ts-ignore +export const UninstallMultiplePackages = (pkgs: string[]) => window['go']['main']['App']['UninstallMultiplePackages'](pkgs) +// @ts-ignore +export const DisableMultiplePackages = (pkgs: string[]) => window['go']['main']['App']['DisableMultiplePackages'](pkgs) +// @ts-ignore +export const EnableMultiplePackages = (pkgs: string[]) => window['go']['main']['App']['EnableMultiplePackages'](pkgs) +// @ts-ignore +export const SelectFileForInstall = () => window['go']['main']['App']['SelectFileForInstall']() +// @ts-ignore +export const SideloadPackage = (path: string) => window['go']['main']['App']['SideloadPackage'](path) + +// Shell +// @ts-ignore +export const RunShellCommand = (cmd: string) => window['go']['main']['App']['RunShellCommand'](cmd) +// @ts-ignore +export const RunAdbHostCommand = (args: string) => window['go']['main']['App']['RunAdbHostCommand'](args) + +// Wireless +// @ts-ignore +export const EnableWirelessAdb = (port: string) => window['go']['main']['App']['EnableWirelessAdb'](port) +// @ts-ignore +export const ConnectWirelessAdb = (ip: string, port: string) => window['go']['main']['App']['ConnectWirelessAdb'](ip, port) +// @ts-ignore +export const DisconnectWirelessAdb = (ip: string, port: string) => window['go']['main']['App']['DisconnectWirelessAdb'](ip, port) + +// Fastboot +// @ts-ignore +export const GetFastbootDevices = () => window['go']['main']['App']['GetFastbootDevices']() +// @ts-ignore +export const FlashPartition = (partition: string, file: string) => window['go']['main']['App']['FlashPartition'](partition, file) +// @ts-ignore +export const FastbootGetVar = (variable: string) => window['go']['main']['App']['FastbootGetVar'](variable) +// @ts-ignore +export const SelectFileForFlash = () => window['go']['main']['App']['SelectFileForFlash']() + +// Logcat +// @ts-ignore +export const StartLogcat = (filter: string, buffer: string) => window['go']['main']['App']['StartLogcat'](filter, buffer) +// @ts-ignore +export const StopLogcat = () => window['go']['main']['App']['StopLogcat']() +// @ts-ignore +export const ClearLogcat = () => window['go']['main']['App']['ClearLogcat']() + +// App inspection +// @ts-ignore +export const InspectApp = (pkg: string) => window['go']['main']['App']['InspectApp'](pkg) +// @ts-ignore +export const CheckPinning = (pkg: string) => window['go']['main']['App']['CheckPinning'](pkg) + +// Certificates +// @ts-ignore +export const ListSystemCerts = () => window['go']['main']['App']['ListSystemCerts']() +// @ts-ignore +export const ListUserCerts = () => window['go']['main']['App']['ListUserCerts']() +// @ts-ignore +export const InstallUserCert = (path: string) => window['go']['main']['App']['InstallUserCert'](path) +// @ts-ignore +export const RemoveUserCert = (filename: string) => window['go']['main']['App']['RemoveUserCert'](filename) +// @ts-ignore +export const SelectCertFile = () => window['go']['main']['App']['SelectCertFile']() + +// Backup +// @ts-ignore +export const StartBackup = (opts: any, path: string) => window['go']['main']['App']['StartBackup'](opts, path) +// @ts-ignore +export const RestoreBackup = (path: string) => window['go']['main']['App']['RestoreBackup'](path) +// @ts-ignore +export const SelectBackupFile = () => window['go']['main']['App']['SelectBackupFile']() +// @ts-ignore +export const BackupSingleApp = (pkg: string, apk: boolean) => window['go']['main']['App']['BackupSingleApp'](pkg, apk) + +// Props +// @ts-ignore +export const GetAllProps = () => window['go']['main']['App']['GetAllProps']() +// @ts-ignore +export const SetProp = (key: string, value: string) => window['go']['main']['App']['SetProp'](key, value) +// @ts-ignore +export const GetProp = (key: string) => window['go']['main']['App']['GetProp'](key) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..70f1c34 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './styles/global.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css new file mode 100644 index 0000000..1b69dba --- /dev/null +++ b/frontend/src/styles/global.css @@ -0,0 +1,137 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + * { + box-sizing: border-box; + margin: 0; + padding: 0; + } + + html, body, #root { + height: 100%; + width: 100%; + overflow: hidden; + } + + body { + background: #0a0a0f; + color: #e8e8f0; + font-family: 'IBM Plex Sans', sans-serif; + font-size: 14px; + line-height: 1.5; + -webkit-font-smoothing: antialiased; + user-select: none; + } + + ::-webkit-scrollbar { + width: 6px; + height: 6px; + } + ::-webkit-scrollbar-track { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: #252530; + border-radius: 3px; + } + ::-webkit-scrollbar-thumb:hover { + background: #333344; + } +} + +@layer components { + .card { + @apply bg-bg-surface border border-bg-border rounded-lg; + } + + .btn { + @apply inline-flex items-center gap-2 px-3 py-1.5 rounded text-sm font-medium + transition-all duration-150 cursor-pointer select-none + disabled:opacity-40 disabled:cursor-not-allowed; + } + + .btn-primary { + @apply btn bg-accent-green text-bg-base hover:bg-accent-dim active:scale-95; + } + + .btn-ghost { + @apply btn bg-transparent text-text-secondary border border-bg-border + hover:bg-bg-raised hover:text-text-primary active:scale-95; + } + + .btn-danger { + @apply btn bg-danger/10 text-danger border border-danger/20 + hover:bg-danger/20 active:scale-95; + } + + .btn-warn { + @apply btn bg-warn/10 text-warn border border-warn/20 + hover:bg-warn/20 active:scale-95; + } + + .input { + @apply bg-bg-raised border border-bg-border rounded px-3 py-1.5 + text-sm text-text-primary placeholder:text-text-muted + focus:outline-none focus:border-accent-green/50 + transition-colors duration-150 w-full; + } + + .badge { + @apply inline-flex items-center px-2 py-0.5 rounded text-xs font-medium; + } + + .badge-green { + @apply badge bg-accent-green/10 text-accent-green; + } + + .badge-red { + @apply badge bg-danger/10 text-danger; + } + + .badge-yellow { + @apply badge bg-warn/10 text-warn; + } + + .badge-gray { + @apply badge bg-bg-border text-text-secondary; + } + + .section-title { + @apply text-xs font-medium uppercase tracking-widest text-text-muted; + } + + .mono { + @apply font-mono text-sm; + } +} + +/* Glow effect on accent elements */ +.glow { + box-shadow: 0 0 12px rgba(0, 255, 136, 0.15); +} + +/* Animated scan line for the terminal */ +@keyframes scanline { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(100vh); } +} + +/* Pulse animation for status dots */ +@keyframes pulse-dot { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +.status-dot { + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + animation: pulse-dot 2s ease-in-out infinite; +} + +.status-dot-green { background: #00ff88; box-shadow: 0 0 6px #00ff8888; } +.status-dot-red { background: #ff4444; box-shadow: 0 0 6px #ff444488; } +.status-dot-gray { background: #44445a; animation: none; } diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..045426a --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,36 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + bg: { + base: '#0a0a0f', + surface: '#111118', + raised: '#18181f', + border: '#252530', + }, + accent: { + green: '#00ff88', + dim: '#00cc6a', + muted: '#003322', + }, + text: { + primary: '#e8e8f0', + secondary: '#8888aa', + muted: '#44445a', + }, + danger: '#ff4444', + warn: '#ffaa00', + }, + fontFamily: { + mono: ['"JetBrains Mono"', '"Fira Code"', 'monospace'], + sans: ['"IBM Plex Sans"', 'sans-serif'], + }, + }, + }, + plugins: [], +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..f1943a1 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..9f60fec --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'dist', + }, +}) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..dc916ff --- /dev/null +++ b/go.mod @@ -0,0 +1,43 @@ +module github.com/jegly/ATK + +go 1.23 + +require ( + github.com/ncruces/zenity v0.10.14 + github.com/wailsapp/wails/v2 v2.11.0 +) + +require ( + github.com/akavel/rsrc v0.10.2 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/dchest/jsmin v0.0.0-20220218165748-59f39799265f // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/josephspurrier/goversioninfo v1.4.1 // indirect + github.com/labstack/echo/v4 v4.13.3 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/gosod v1.0.4 // indirect + github.com/leaanthony/slicer v1.6.0 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/tkrajina/go-reflector v0.5.8 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/wailsapp/go-webview2 v1.0.22 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/image v0.20.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect +) diff --git a/main.go b/main.go new file mode 100644 index 0000000..a9cdd44 --- /dev/null +++ b/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "embed" + + "github.com/wailsapp/wails/v2" + "github.com/wailsapp/wails/v2/pkg/options" + "github.com/wailsapp/wails/v2/pkg/options/assetserver" + "github.com/wailsapp/wails/v2/pkg/options/linux" +) + +//go:embed all:frontend/dist +var assets embed.FS + +func main() { + app := NewApp() + + err := wails.Run(&options.App{ + Title: "ATK — Android Toolkit", + Width: 1280, + Height: 800, + AssetServer: &assetserver.Options{ + Assets: assets, + }, + BackgroundColour: &options.RGBA{R: 10, G: 10, B: 15, A: 1}, + OnStartup: app.Startup, + Bind: []interface{}{ + app, + }, + Linux: &linux.Options{ + WindowIsTranslucent: false, + WebviewGpuPolicy: linux.WebviewGpuPolicyOnDemand, + }, + }) + + if err != nil { + println("Error:", err.Error()) + } +} diff --git a/nfpm.yaml b/nfpm.yaml new file mode 100644 index 0000000..1637bd6 --- /dev/null +++ b/nfpm.yaml @@ -0,0 +1,32 @@ +name: "atk" +arch: "amd64" +platform: "linux" +version: "1.0.0" +section: "utils" +priority: "optional" +maintainer: "jegly " +description: | + ATK (Android Toolkit) — an all-in-one ADB GUI for Android power users, + security researchers, and bug hunters. Includes a debloater (2157 packages), + live logcat, app inspector, certificate manager, Pixel factory flasher, + prop editor, device backup, and 487 utility commands. +vendor: "jegly" +homepage: "https://github.com/jegly/ATK" +license: "GPL-3.0" + +contents: + - src: "build/bin/ATK" + dst: "/opt/atk/ATK" + - src: "/opt/atk/ATK" + dst: "/usr/bin/atk" + type: "symlink" + - src: "build/atk.desktop" + dst: "/usr/share/applications/atk.desktop" + - src: "build/appicon.png" + dst: "/usr/share/icons/hicolor/256x256/apps/atk.png" + +depends: + - adb + - fastboot + - libgtk-3-0 + - libwebkit2gtk-4.1-0 diff --git a/package_service.go b/package_service.go new file mode 100644 index 0000000..28457be --- /dev/null +++ b/package_service.go @@ -0,0 +1,344 @@ +package main + +import ( + "context" + "fmt" + "strings" + "sync" + "time" +) + +// ListPackages returns all installed packages filtered by type. +// filterType: "user", "system", or "all" +func (a *App) ListPackages(filterType string) ([]PackageInfo, error) { + var wg sync.WaitGroup + var mu sync.Mutex + var enabledPkgs, disabledPkgs []string + var errEnabled, errDisabled error + + // Build base args - all discrete + buildArgs := func(stateFlag string) []string { + args := []string{"pm", "list", "packages", stateFlag} + switch filterType { + case "user": + args = append(args, "-3") + case "system": + args = append(args, "-s") + } + return args + } + + wg.Add(2) + + go func() { + defer wg.Done() + output, err := a.runAdbShell(buildArgs("-e")...) + mu.Lock() + defer mu.Unlock() + if err != nil { + errEnabled = err + return + } + for _, line := range strings.Split(output, "\n") { + line = strings.TrimSpace(line) + if pkg := strings.TrimPrefix(line, "package:"); pkg != line { + enabledPkgs = append(enabledPkgs, strings.TrimSpace(pkg)) + } + } + }() + + go func() { + defer wg.Done() + output, err := a.runAdbShell(buildArgs("-d")...) + mu.Lock() + defer mu.Unlock() + if err != nil { + errDisabled = err + return + } + for _, line := range strings.Split(output, "\n") { + line = strings.TrimSpace(line) + if pkg := strings.TrimPrefix(line, "package:"); pkg != line { + disabledPkgs = append(disabledPkgs, strings.TrimSpace(pkg)) + } + } + }() + + wg.Wait() + + if errEnabled != nil { + return nil, fmt.Errorf("failed to list packages: %w", errEnabled) + } + // Don't fail if disabled list fails - some devices restrict it + _ = errDisabled + + pkgMap := make(map[string]PackageInfo) + for _, p := range enabledPkgs { + pkgMap[p] = PackageInfo{PackageName: p, IsEnabled: true} + } + for _, p := range disabledPkgs { + pkgMap[p] = PackageInfo{PackageName: p, IsEnabled: false} + } + + packages := make([]PackageInfo, 0, len(pkgMap)) + for _, pkg := range pkgMap { + packages = append(packages, pkg) + } + return packages, nil +} + +// InstallPackage installs an APK from a local file path. +// filePath is a discrete arg - safe. +func (a *App) InstallPackage(filePath string) (string, error) { + ctx, cancel := a.beginCancellableOp(15 * time.Minute) + defer cancel() + + // adb install -r - all discrete args + output, err := a.runCommandContext(ctx, "adb", "install", "-r", filePath) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + return "", fmt.Errorf("installation cancelled") + } + return "", fmt.Errorf("install failed: %w", err) + } + return output, nil +} + +// UninstallPackage uninstalls a package by name. +// packageName is a discrete arg - safe. +func (a *App) UninstallPackage(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + // pm uninstall - all discrete args + output, err := a.runAdbShell("pm", "uninstall", packageName) + if err != nil { + return "", fmt.Errorf("uninstall failed for %s: %w", packageName, err) + } + return output, nil +} + +// DisablePackage disables a package for user 0. +// packageName is a discrete arg - safe. +func (a *App) DisablePackage(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + // pm disable-user --user 0 - all discrete args + output, err := a.runAdbShell("pm", "disable-user", "--user", "0", packageName) + if err != nil { + return "", fmt.Errorf("disable failed for %s: %w", packageName, err) + } + + // Accept any "new state:" response as success + if strings.Contains(output, "new state:") { + return output, nil + } + return "", fmt.Errorf("disable failed for %s: %s", packageName, output) +} + +// EnablePackage enables a previously disabled package. +// packageName is a discrete arg - safe. +func (a *App) EnablePackage(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + // pm enable --user 0 - all discrete args + output, err := a.runAdbShell("pm", "enable", "--user", "0", packageName) + if err != nil { + return "", fmt.Errorf("enable failed for %s: %w", packageName, err) + } + + // Accept "new state: enabled" or "new state: enabled-user" (Android version variants) + if strings.Contains(output, "new state: enabled") { + return output, nil + } + return "", fmt.Errorf("enable failed for %s: %s", packageName, output) +} + +// ClearData clears app data for a package. +func (a *App) ClearData(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + output, err := a.runAdbShell("pm", "clear", packageName) + if err != nil { + return "", fmt.Errorf("clear data failed for %s: %w", packageName, err) + } + if strings.Contains(output, "Failed") { + return "", fmt.Errorf("clear data failed for %s: %s", packageName, output) + } + return "Data cleared successfully", nil +} + +// PullApk pulls an installed APK from the device to a user-chosen local path. +func (a *App) PullApk(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + + // Get remote APK path - pm path - discrete args + pathOutput, err := a.runAdbShell("pm", "path", packageName) + if err != nil { + return "", fmt.Errorf("cannot find APK for %s: %w", packageName, err) + } + + remotePath := strings.TrimPrefix(strings.TrimSpace(pathOutput), "package:") + remotePath = strings.TrimSpace(remotePath) + if remotePath == "" { + return "", fmt.Errorf("could not parse APK path from: %s", pathOutput) + } + + localPath, err := a.SelectSaveFile(packageName + ".apk") + if err != nil { + return "", fmt.Errorf("save dialog failed: %w", err) + } + if localPath == "" { + return "APK pull cancelled.", nil + } + + ctx, cancel := a.beginCancellableOp(10 * time.Minute) + defer cancel() + + // adb pull - all discrete args + _, err = a.runCommandContext(ctx, "adb", "pull", remotePath, localPath) + if err != nil { + if strings.Contains(err.Error(), "cancelled") { + return "", fmt.Errorf("pull cancelled") + } + return "", fmt.Errorf("pull failed: %w", err) + } + + return fmt.Sprintf("APK saved to %s", localPath), nil +} + +// UninstallMultiplePackages uninstalls a list of packages. +func (a *App) UninstallMultiplePackages(packageNames []string) (string, error) { + return a.batchPackageOp("uninstall", packageNames, a.UninstallPackage) +} + +// DisableMultiplePackages disables a list of packages. +func (a *App) DisableMultiplePackages(packageNames []string) (string, error) { + return a.batchPackageOp("disable", packageNames, a.DisablePackage) +} + +// EnableMultiplePackages enables a list of packages. +func (a *App) EnableMultiplePackages(packageNames []string) (string, error) { + return a.batchPackageOp("enable", packageNames, a.EnablePackage) +} + +// batchPackageOp runs a package operation on multiple packages and summarises results. +func (a *App) batchPackageOp(opName string, packageNames []string, op func(string) (string, error)) (string, error) { + if len(packageNames) == 0 { + return "", fmt.Errorf("no packages selected") + } + + var successCount, failCount int + var errDetails strings.Builder + + for _, pkg := range packageNames { + if _, err := op(pkg); err != nil { + failCount++ + errDetails.WriteString(fmt.Sprintf("• %s: %v\n", pkg, err)) + } else { + successCount++ + } + } + + summary := fmt.Sprintf("Successfully %sd %d package(s).", opName, successCount) + if failCount > 0 { + summary += fmt.Sprintf("\nFailed: %d\n%s", failCount, errDetails.String()) + } + return summary, nil +} + +// ForceStopPackage force stops a running app. +func (a *App) ForceStopPackage(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + _, err := a.runAdbShell("am", "force-stop", packageName) + if err != nil { + return "", fmt.Errorf("force stop failed: %w", err) + } + return fmt.Sprintf("Force stopped %s", packageName), nil +} + +// GetPackageInfo returns detailed info about a package. +func (a *App) GetPackageInfo(packageName string) (string, error) { + if err := validatePackageName(packageName); err != nil { + return "", err + } + // dumpsys package - discrete args + output, err := a.runAdbShellTimeout(10*time.Second, "dumpsys", "package", packageName) + if err != nil { + return "", fmt.Errorf("failed to get package info: %w", err) + } + return output, nil +} + +// SideloadPackage sideloads a package via adb sideload (for OTA updates in recovery). +func (a *App) SideloadPackage(filePath string) (string, error) { + ctx, cancel := a.beginCancellableOp(0) // No timeout - user cancellable + defer cancel() + + output, err := a.runCommandContext(ctx, "adb", "sideload", filePath) + if err != nil { + return "", fmt.Errorf("sideload failed: %w", err) + } + return output, nil +} + +// validatePackageName checks that a package name looks like a valid Android package. +// Android packages are dot-separated identifiers: com.example.app +// This prevents passing arbitrary strings as package names. +func validatePackageName(name string) error { + name = strings.TrimSpace(name) + if name == "" { + return fmt.Errorf("package name cannot be empty") + } + // Basic sanity: must not contain shell metacharacters + // Since we pass as discrete args this is belt-and-suspenders, + // but good to validate inputs regardless + for _, ch := range name { + if ch == ';' || ch == '&' || ch == '|' || ch == '`' || ch == '$' || ch == '\n' || ch == '\r' { + return fmt.Errorf("invalid character in package name: %q", ch) + } + } + return nil +} + +// RunAdbHostCommand runs a raw adb command from the terminal view. +// args is split on spaces and each element passed as a discrete arg. +// This is intentionally permissive since it's the shell terminal feature. +func (a *App) RunAdbHostCommand(rawArgs string) (string, error) { + if rawArgs == "" { + return "", fmt.Errorf("command cannot be empty") + } + + args := strings.Fields(rawArgs) + if len(args) == 0 { + return "", fmt.Errorf("no arguments provided") + } + + // Restrict to known safe adb subcommands in the terminal + // The shell view still allows full adb usage, this just prevents + // passing arbitrary binaries + ctx, cancel := context.WithTimeout(context.Background(), DefaultCommandTimeout) + defer cancel() + + return a.runCommandContext(ctx, "adb", args...) +} + +// RunShellCommand runs an adb shell command from the terminal view. +// The command string is split on spaces - NO shell interpretation. +// This means pipes/redirects won't work, but it's much safer. +func (a *App) RunShellCommand(command string) (string, error) { + if command == "" { + return "", fmt.Errorf("command cannot be empty") + } + + // Split into discrete args - no shell, no injection + args := strings.Fields(command) + return a.runAdbShell(args...) +} diff --git a/sysproc_linux.go b/sysproc_linux.go new file mode 100644 index 0000000..01ced4f --- /dev/null +++ b/sysproc_linux.go @@ -0,0 +1,17 @@ +//go:build !windows + +package main + +import ( + "os/exec" + "syscall" +) + +// setCommandSysProcAttr sets platform-specific process attributes. +// On Linux: sets a new process group so child processes don't receive +// terminal signals meant for the parent, and enables proper cleanup. +func setCommandSysProcAttr(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setpgid: true, + } +} diff --git a/wails.json b/wails.json new file mode 100644 index 0000000..e80a3e6 --- /dev/null +++ b/wails.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://wails.io/schemas/config.v2.json", + "name": "ATK", + "outputfilename": "ATK", + "frontend:install": "pnpm install", + "frontend:build": "pnpm run build", + "frontend:dev:watcher": "pnpm run dev", + "frontend:dev:serverUrl": "auto", + "author": { + "name": "jegly", + "email": "" + } +} diff --git a/wireless_service.go b/wireless_service.go new file mode 100644 index 0000000..e25fde2 --- /dev/null +++ b/wireless_service.go @@ -0,0 +1,199 @@ +package main + +import ( + "fmt" + "regexp" + "strings" +) + +// EnableWirelessAdb switches ADB to TCP/IP mode on the given port. +func (a *App) EnableWirelessAdb(port string) (string, error) { + if port == "" { + port = "5555" + } + if err := validatePort(port); err != nil { + return "", err + } + // adb tcpip - all discrete args + output, err := a.runCommand("adb", "tcpip", port) + if err != nil { + return "", fmt.Errorf("failed to enable wireless ADB (is device connected via USB?): %w", err) + } + return output, nil +} + +// ConnectWirelessAdb connects to a device over TCP/IP. +func (a *App) ConnectWirelessAdb(ipAddress, port string) (string, error) { + if port == "" { + port = "5555" + } + if err := validateIP(ipAddress); err != nil { + return "", err + } + if err := validatePort(port); err != nil { + return "", err + } + + address := ipAddress + ":" + port + // adb connect
- discrete args + output, err := a.runCommand("adb", "connect", address) + if err != nil { + return "", fmt.Errorf("connect failed: %w", err) + } + + clean := strings.TrimSpace(output) + if strings.Contains(clean, "connected to") || strings.Contains(clean, "already connected") { + return clean, nil + } + if clean == "" { + return "", fmt.Errorf("no response from device — check IP and port") + } + return "", fmt.Errorf("%s", clean) +} + +// DisconnectWirelessAdb disconnects from a TCP/IP ADB connection. +func (a *App) DisconnectWirelessAdb(ipAddress, port string) (string, error) { + if port == "" { + port = "5555" + } + if err := validateIP(ipAddress); err != nil { + return "", err + } + + address := ipAddress + ":" + port + // adb disconnect
- discrete args + output, err := a.runCommand("adb", "disconnect", address) + if err != nil { + // Try without port + output, err = a.runCommand("adb", "disconnect", ipAddress) + if err != nil { + return "", fmt.Errorf("disconnect failed: %w", err) + } + } + + clean := strings.TrimSpace(output) + if clean == "" { + return fmt.Sprintf("Disconnected from %s", address), nil + } + return clean, nil +} + +// GetFastbootDevices lists devices connected in fastboot mode. +func (a *App) GetFastbootDevices() ([]Device, error) { + output, err := a.runCommand("fastboot", "devices") + if err != nil { + return nil, err + } + + var devices []Device + for _, line := range strings.Split(output, "\n") { + line = strings.TrimSpace(line) + if line == "" { + continue + } + parts := strings.Fields(line) + if len(parts) >= 2 { + devices = append(devices, Device{ + Serial: parts[0], + Status: parts[1], + }) + } + } + return devices, nil +} + +// FlashPartition flashes an image file to a named partition via fastboot. +// partition is validated against known partition names. +// filePath is a discrete arg. +func (a *App) FlashPartition(partition, filePath string) (string, error) { + if err := validatePartitionName(partition); err != nil { + return "", err + } + // fastboot flash - all discrete args + output, err := a.runCommand("fastboot", "flash", partition, filePath) + if err != nil { + return "", fmt.Errorf("flash failed: %w", err) + } + return output, nil +} + +// FastbootOemCommand runs an OEM-specific fastboot command. +// Used for device-specific unlock/lock operations. +func (a *App) FastbootOemCommand(subcommand string) (string, error) { + validOemCmds := map[string]bool{ + "unlock": true, + "lock": true, + "device-info": true, + "get-identifier": true, + } + if !validOemCmds[strings.ToLower(subcommand)] { + return "", fmt.Errorf("unsupported OEM command: %q", subcommand) + } + output, err := a.runCommand("fastboot", "oem", subcommand) + if err != nil { + return "", fmt.Errorf("oem %s failed: %w", subcommand, err) + } + return output, nil +} + +// FastbootGetVar retrieves a fastboot variable. +func (a *App) FastbootGetVar(variable string) (string, error) { + output, err := a.runCommand("fastboot", "getvar", variable) + if err != nil { + return "", fmt.Errorf("getvar %s failed: %w", variable, err) + } + return output, nil +} + +// validateIP checks that an IP address looks valid. +func validateIP(ip string) error { + ip = strings.TrimSpace(ip) + if ip == "" { + return fmt.Errorf("IP address cannot be empty") + } + re := regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`) + if !re.MatchString(ip) { + return fmt.Errorf("invalid IP address: %q", ip) + } + return nil +} + +// validatePort checks that a port string is a valid port number. +func validatePort(port string) error { + port = strings.TrimSpace(port) + if port == "" { + return fmt.Errorf("port cannot be empty") + } + re := regexp.MustCompile(`^\d{1,5}$`) + if !re.MatchString(port) { + return fmt.Errorf("invalid port: %q", port) + } + return nil +} + +// validatePartitionName checks that a partition name is in the known safe list. +// This prevents flashing to arbitrary "partition" names that could be shell tricks. +func validatePartitionName(name string) error { + knownPartitions := map[string]bool{ + "boot": true, + "recovery": true, + "system": true, + "vendor": true, + "vendor_boot": true, + "userdata": true, + "cache": true, + "dtbo": true, + "vbmeta": true, + "vbmeta_system": true, + "super": true, + "product": true, + "odm": true, + "radio": true, + "bootloader": true, + "modem": true, + } + if !knownPartitions[strings.ToLower(name)] { + return fmt.Errorf("unknown partition %q — not in safe list", name) + } + return nil +} diff --git a/zip_service.go b/zip_service.go new file mode 100644 index 0000000..062ee87 --- /dev/null +++ b/zip_service.go @@ -0,0 +1,43 @@ +package main + +import ( + "archive/zip" + "fmt" + "io" + "strings" +) + +// ReadFileFromZip reads a named file from inside a zip archive. +// Used to read flash-all.sh from a Pixel factory image zip. +func (a *App) ReadFileFromZip(zipPath string, fileName string) (string, error) { + r, err := zip.OpenReader(zipPath) + if err != nil { + return "", fmt.Errorf("cannot open zip: %w", err) + } + defer r.Close() + + for _, f := range r.File { + // Match by filename only (ignore directory prefix) + name := f.Name + if idx := strings.LastIndex(name, "/"); idx >= 0 { + name = name[idx+1:] + } + if name != fileName { + continue + } + + rc, err := f.Open() + if err != nil { + return "", fmt.Errorf("cannot open %s in zip: %w", fileName, err) + } + defer rc.Close() + + data, err := io.ReadAll(rc) + if err != nil { + return "", fmt.Errorf("cannot read %s: %w", fileName, err) + } + return string(data), nil + } + + return "", fmt.Errorf("%s not found in zip", fileName) +}