ADB Toolkit PRO GUI & other ADB GUI Tools

I originally made this tool for myself to handle my Android devices more efficiently. I’m sharing it here in case anyone else finds it useful!

To use this, you just need:

  1. Python 3 (installed on your PC).
  2. ADB Platform Tools (ensure adb is in your system environment variables/PATH).
  3. scrcpy (only if you want to use the screen mirroring feature).

No extra Python libraries (pip install) are required—it runs straight out of the box!"

#!/usr/bin/env python3
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog, simpledialog
import subprocess
import threading
import os
import re
import shutil

class AndroidToolkitPro:
    def __init__(self, root):
        self.root = root
        self.root.title("Android Toolkit Pro")
        self.root.geometry("900x750")
        self.root.configure(bg='#1e1e1e')
        
        self.connected_device = None
        self.all_packages = []
        
        # Style configuration
        style = ttk.Style()
        style.theme_use('clam')
        style.configure('TButton', background='#0d7377', foreground='white', borderwidth=0, font=('Arial', 10))
        style.map('TButton', background=[('active', '#14a085')])
        style.configure('Danger.TButton', background='#d32f2f', foreground='white')
        style.map('Danger.TButton', background=[('active', '#f44336')])
        style.configure('TLabel', background='#1e1e1e', foreground='#ffffff')
        style.configure('TFrame', background='#1e1e1e')
        style.configure('TLabelframe', background='#1e1e1e', foreground='#ffffff')
        style.configure('TLabelframe.Label', background='#1e1e1e', foreground='#ffffff')
        
        self.create_widgets()
        self.scan_devices()

    def create_widgets(self):
        title_frame = ttk.Frame(self.root)
        title_frame.pack(pady=10, padx=10, fill='x')
        ttk.Label(title_frame, text="🔧 Android Toolkit Pro", font=('Arial', 18, 'bold')).pack()

        device_frame = ttk.LabelFrame(self.root, text="📱 Device Connection", padding=10)
        device_frame.pack(pady=5, padx=20, fill='x')
        
        self.status_label = ttk.Label(device_frame, text="No device connected", font=('Arial', 10, 'bold'))
        self.status_label.pack(side='left', padx=10)
        
        ttk.Button(device_frame, text="🔍 Scan Devices", command=self.scan_devices).pack(side='left', padx=5)
        ttk.Button(device_frame, text="🛠️ Check Environment", command=self.check_env).pack(side='left', padx=5)

        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(pady=10, padx=20, fill='both', expand=True)

        # Tabs
        self.quick_tab = ttk.Frame(self.notebook)
        self.package_tab = ttk.Frame(self.notebook)
        self.files_tab = ttk.Frame(self.notebook)
        self.advanced_tab = ttk.Frame(self.notebook)

        self.notebook.add(self.quick_tab, text="⚡ Quick Actions")
        self.notebook.add(self.package_tab, text="📦 Package Manager")
        self.notebook.add(self.files_tab, text="📂 Files")
        self.notebook.add(self.advanced_tab, text="🔧 Advanced")

        self.setup_quick_tab()
        self.setup_package_tab()
        self.setup_files_tab()
        self.setup_advanced_tab()

        # Console
        console_frame = ttk.Frame(self.root)
        console_frame.pack(pady=10, padx=20, fill='both', expand=True)
        self.output_text = scrolledtext.ScrolledText(console_frame, height=8, bg='#2b2b2b', fg='#00ff00', font=('Consolas', 9))
        self.output_text.pack(fill='both', expand=True)
        ttk.Button(self.root, text="Clear Output", command=lambda: self.output_text.delete(1.0, tk.END)).pack(pady=5)

    def setup_quick_tab(self):
        frame = ttk.LabelFrame(self.quick_tab, text="Screen & Info", padding=10)
        frame.pack(pady=10, padx=10, fill='x')
        ttk.Button(frame, text="🚀 Start Mirror (scrcpy)", command=self.start_scrcpy).pack(side='left', padx=5)
        ttk.Button(frame, text="📸 Screenshot", command=self.take_screenshot).pack(side='left', padx=5)
        ttk.Button(frame, text="🔋 Battery Info", command=self.battery_info).pack(side='left', padx=5)

    def setup_package_tab(self):
        ttk.Label(self.package_tab, text="Search:").pack(pady=5)
        self.search_var = tk.StringVar()
        ttk.Entry(self.package_tab, textvariable=self.search_var).pack(fill='x', padx=20)
        
        self.pkg_listbox = tk.Listbox(self.package_tab, bg='#2b2b2b', fg='white', font=('Consolas', 9))
        self.pkg_listbox.pack(fill='both', expand=True, padx=20, pady=5)
        
        btn_frame = ttk.Frame(self.package_tab)
        btn_frame.pack(pady=5)
        ttk.Button(btn_frame, text="🔄 Load Apps", command=self.load_packages).pack(side='left', padx=5)
        ttk.Button(btn_frame, text="🗑️ Uninstall Selected", style='Danger.TButton', command=self.uninstall_selected).pack(side='left', padx=5)

    def setup_files_tab(self):
        frame = ttk.Frame(self.files_tab, padding=10)
        frame.pack(fill='x')
        ttk.Button(frame, text="📥 Pull File", command=self.pull_file).pack(pady=5, fill='x')
        ttk.Button(frame, text="📤 Push File", command=self.push_file).pack(pady=5, fill='x')

    def setup_advanced_tab(self):
        frame = ttk.Frame(self.advanced_tab, padding=10)
        frame.pack(fill='x')
        ttk.Button(frame, text="🔄 Reboot System", command=lambda: self.run_adb_command("adb reboot")).pack(pady=5, fill='x')
        ttk.Button(frame, text="💤 Reboot Recovery", command=lambda: self.run_adb_command("adb reboot recovery")).pack(pady=5, fill='x')
        ttk.Button(frame, text="💻 Open Shell", command=self.open_shell).pack(pady=5, fill='x')

    def run_adb_command(self, cmd):
        def run():
            try:
                res = subprocess.run(cmd, shell=True, capture_output=True, text=True)
                self.append_output(f"$ {cmd}\n{res.stdout}{res.stderr}")
            except Exception as e:
                self.append_output(f"Error: {str(e)}")
        threading.Thread(target=run, daemon=True).start()

    def scan_devices(self):
        res = subprocess.run("adb devices", shell=True, capture_output=True, text=True)
        lines = res.stdout.strip().split('\n')[1:]
        devices = [l.split('\t')[0] for l in lines if '\tdevice' in l]
        if devices:
            self.connected_device = devices[0]
            self.status_label.config(text=f"✅ Connected: {self.connected_device}", foreground='#00ff00')
        else:
            self.status_label.config(text="❌ No Device Found", foreground='#ff0000')

    def check_env(self):
        adb = shutil.which("adb")
        scrcpy = shutil.which("scrcpy")
        msg = f"ADB: {'✅' if adb else '❌'}\nScrcpy: {'✅' if scrcpy else '⚠️'}"
        messagebox.showinfo("Env Check", msg)

    def start_scrcpy(self):
        if shutil.which("scrcpy"):
            subprocess.Popen("scrcpy", shell=True)
        else:
            messagebox.showerror("Error", "scrcpy not found in PATH")

    def take_screenshot(self):
        save_path = filedialog.asksaveasfilename(defaultextension=".png")
        if save_path:
            self.run_adb_command(f"adb shell screencap -p /sdcard/s.png && adb pull /sdcard/s.png \"{save_path}\"")

    def battery_info(self):
        self.run_adb_command("adb shell dumpsys battery")

    def load_packages(self):
        res = subprocess.run("adb shell pm list packages", shell=True, capture_output=True, text=True)
        pkgs = [line.replace("package:", "") for line in res.stdout.splitlines()]
        self.pkg_listbox.delete(0, tk.END)
        for p in sorted(pkgs): self.pkg_listbox.insert(tk.END, p)

    def uninstall_selected(self):
        sel = self.pkg_listbox.get(tk.ACTIVE)
        if sel and messagebox.askyesno("Confirm", f"Uninstall {sel}?"):
            self.run_adb_command(f"adb shell pm uninstall --user 0 {sel}")

    def pull_file(self):
        rem = simpledialog.askstring("Input", "Remote path (e.g. /sdcard/file.txt):")
        if rem:
            loc = filedialog.askdirectory()
            if loc: self.run_adb_command(f"adb pull \"{rem}\" \"{loc}\"")

    def push_file(self):
        loc = filedialog.askopenfilename()
        if loc:
            rem = simpledialog.askstring("Input", "Destination (e.g. /sdcard/):")
            if rem: self.run_adb_command(f"adb push \"{loc}\" \"{rem}\"")

    def open_shell(self):
        if os.name == 'nt':
            subprocess.Popen("start cmd /k adb shell", shell=True)
        else:
            self.run_adb_command("adb shell")

    def append_output(self, text):
        self.output_text.insert(tk.END, text + "\n" + "-"*30 + "\n")
        self.output_text.see(tk.END)

if __name__ == "__main__":
    root = tk.Tk()
    app = AndroidToolkitPro(root)
    root.mainloop()

Let me know if you like it or not, or if there are any bugs you run into!

3 Likes

What is it for, what does it do?

instead of running adb commands this can do a bunch of cool commands with a click of a button

I figured that much out, my question is which commands can it run?

really the main thing is that it loads all the apps and its really easy to run commands for apps like to uninstall i haven’t Used it in a long time so I don’t really remember Everything I just found this on my computer so I decided to share

i dont care i used this and now im sharing i got my use out of it and yes why not share

ADB GUI Apps.


Android Toolbox

Android-Toolbox is a desktop app which enables the user to access android device features which are not accessible directly from the mobile device.

What does it do?

Current features:

  • You can now perform some file management tasks (External SD card supported)
  • Reboot to system, recovery, fastboot, bootloader or simply power off using the power controls
  • You can offload, suspend, un-suspend, install, uninstall, kill or recompile apps. (Apps are currently shown as package names only. I couldn’t find a way to get app titles without pushing aapt to the mobile device.)
  • Support for installing split apks and batch install apk (Coming Soon)
  • Bloatware or other system apps can now be uninstalled
  • Full Windows Subsystem for Android (WSA) compatibility (WSA is retiring on March 5, 2025)
  • More soon…

Platforms:

Licensing: FOSS Penguin


ADB AppControl

ADB AppControl is a powerful application manager for Android.
It offers a clean and modern graphical interface for working with ADB and automates batch operations to manage apps across Android device.

Features

App Control

  • Disable and uninstall applications without root

  • Multiple apps installing

  • Full Split installation support (APKS)

  • Saving APK files of installed applications

  • Permissions Manager for applications

  • Saving and loading applications list-presets

  • Quick search for apps on Google Play, ApkMirror, F-Droid and others

Useful tools

  • Displaying device information

  • Changing the screen resolution and DPI

  • Hiding icons in the status bar

  • Device remotely control

  • Virtual volume, power, camera and navigation buttons

  • Creating screenshots of the device screen

  • Quick reboot in recovery and bootloader

Advanced

  • ADB Console with favorites commands

  • Fastboot support

  • Logcat logs

  • Auto permission granting for popular apps (Tasker, Battery Stats, etc.)

  • Simple file upload

  • Extended Settings

Platforms:

Licensing: FREEMIUM




ATA GUI

ATA-GUI is an app that lets you perform advanced tasks on your Android™ device with ease. You can use ATA-GUI to access and modify your device’s system settings, files, and features. You can also use ATA-GUI to install, uninstall, and restore apps on your device.

Features
  • Manage System/User Applications Without Root:
    • Uninstall applications
    • Clean data
    • Enable/disable apps
  • Install Applications and Upload Files Seamlessly
  • Check and Manage Permissions for Any Application
  • ADB Over Network with Easy and Fast Pairing
  • Detect and Remove Bloatware
  • Reboot into Recovery, Fastboot, and System Modes
  • Flash and Extract Images
  • Erase User Data and Cache
  • Screen and Camera Mirroring
  • Unlock and Lock Bootloader (device dependent)
  • Extract Device Information in System and Fastboot Modes
  • Sideload ZIP Files Easily
  • Execute Custom Commands
  • Inject Text
  • Access and Analyze Logcat
  • Integrated Task Manager
  • Grant WRITE_SECURE_SETTINGS and DUMP Permissions
  • Retrieve OEM Device ID
  • Support for Multiple User Devices
  • Support for enviroment variables
  • Auto USB device detection

Platforms:

Licensing: FOSS Penguin





ADB GUI Desktop

A modern Kotlin Multiplatform Desktop client for ADB commands, reimagined from the original Python adbGUI project.

Features
  • ADB connect/disconnect
  • ADB devices list
  • ADB clear data
  • ADB reboot device
  • ADB screenshot
  • ADB screen record
  • ADB install/uninstall
  • ADB push file
  • ADB logcat

Platforms: Ha ha have fun building it from source

Licensing: FOSS Penguin




AYA

AYA is a desktop application for easily controlling android devices, which can be considered as a GUI wrapper for ADB.

Features
  • Screen mirror
  • File explorer
  • Application manager
  • Process monitor
  • Layout inspector
  • CPU, memory and FPS monitor
  • Logcat viewer
  • Interactive shell

Platforms:

Licensing: FOSS Penguin

2 Likes