Skip to content

Commit f3ea3fc

Browse files
author
codefl0w
committed
V4.0.0 Release
1 parent d4a4ffd commit f3ea3fc

File tree

7 files changed

+99
-64
lines changed

7 files changed

+99
-64
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
push:
66
tags:
77
- 'v*'
8+
- 'V*'
89

910
permissions:
1011
contents: write
@@ -51,7 +52,7 @@ jobs:
5152

5253
release:
5354
needs: build
54-
if: startsWith(github.ref, 'refs/tags/v')
55+
if: startsWith(github.ref, 'refs/tags/v') || startsWith(github.ref, 'refs/tags/V')
5556
runs-on: ubuntu-latest
5657

5758
steps:

QuickADB.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ a = Analysis(
3636

3737
# Linux compatibility: Exclude libraries that often cause "symbol lookup error" on newer distros (like Arch)
3838
# when the app is built on an older distro.
39-
# The CI workflow builds on Ubuntu 20.04. A bit old, but usually helps with compatibility.
39+
# The CI workflow builds on Ubuntu 22.04. A bit old, but usually helps with compatibility.
4040
if sys.platform == 'linux':
4141
excluded_binaries = ['libreadline.so.8', 'libcrypt.so.1', 'libz.so.1', 'libgcc_s.so.1']
4242
a.binaries = [x for x in a.binaries if x[0] not in excluded_binaries]

main/adbfunc.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,15 @@ def __init__(self, platform_tools_path):
105105
def run(self):
106106
commands = self._get_device_commands()
107107
results = []
108-
108+
109+
# Windows specific: Create a new process group and hide the console window.
110+
creationflags = 0
111+
if sys.platform == "win32":
112+
creationflags = (
113+
subprocess.CREATE_NEW_PROCESS_GROUP |
114+
subprocess.CREATE_NO_WINDOW
115+
)
116+
109117
for label, command in commands.items():
110118
try:
111119
result = subprocess.run(
@@ -114,7 +122,8 @@ def run(self):
114122
stderr=subprocess.PIPE,
115123
text=True,
116124
shell=True,
117-
timeout=10
125+
timeout=10,
126+
creationflags=creationflags
118127
)
119128

120129
if result.returncode == 0:

modules/bootanimcreator.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from datetime import datetime
1515
from typing import Optional, Dict, List, Tuple
1616

17-
from util.resource import get_root_dir, resource_path, resolve_platform_tool
17+
from util.resource import get_root_dir, resource_path, resolve_platform_tool
1818

1919
root_dir = get_root_dir()
2020
if root_dir not in sys.path:
@@ -33,9 +33,9 @@
3333

3434
from PIL import Image, ImageSequence
3535

36-
PLATFORM_TOOLS_DIR = resource_path("platform-tools")
37-
PLATFORM_ADB = resolve_platform_tool(PLATFORM_TOOLS_DIR, "adb")
38-
ADB_CMD = PLATFORM_ADB if os.path.exists(PLATFORM_ADB) else ("adb.exe" if os.name == "nt" else "adb")
36+
PLATFORM_TOOLS_DIR = resource_path("platform-tools")
37+
PLATFORM_ADB = resolve_platform_tool(PLATFORM_TOOLS_DIR, "adb")
38+
ADB_CMD = PLATFORM_ADB if os.path.exists(PLATFORM_ADB) else ("adb.exe" if os.name == "nt" else "adb")
3939

4040
BOOT_PATHS = [
4141
"/system/media/bootanimation.zip",
@@ -966,7 +966,7 @@ def _on_preview_extraction_done(self, result, error):
966966
self.build_sequence_from_flat_frames(frames_dir, which="created")
967967
if getattr(self, "seq_created", None):
968968
self.start_created()
969-
self.log("[INFO] Preview playing.")
969+
970970
else:
971971
self.log("[WARN] No frames loaded for preview after extraction.")
972972
QMessageBox.information(self, "Preview", "No frames were loaded for preview. See log for details.")
@@ -1438,4 +1438,4 @@ def closeEvent(self, ev):
14381438
if __name__ == "__main__":
14391439
app = QApplication(sys.argv)
14401440
w = run_bootanim_creator()
1441-
sys.exit(app.exec())
1441+
sys.exit(app.exec())

modules/gsiflasher.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,17 @@ def run(self):
6565
self.log_msg.emit("[INFO] Starting device scan...")
6666

6767
try:
68+
# Windows specific: Create a new process group and hide the console window.
69+
creationflags = 0
70+
if os.name == "nt":
71+
creationflags = (
72+
subprocess.CREATE_NEW_PROCESS_GROUP |
73+
subprocess.CREATE_NO_WINDOW
74+
)
75+
6876
# 1. Check ADB
6977
adb_proc = subprocess.run([adb_cmd, "devices"],
70-
capture_output=True, text=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NO_WINDOW if os.name == "nt" else 0)
78+
capture_output=True, text=True, creationflags=creationflags)
7179
adb_devs = []
7280
for line in adb_proc.stdout.splitlines()[1:]:
7381
parts = line.split()
@@ -76,7 +84,7 @@ def run(self):
7684

7785
# 2. Check Fastboot
7886
fastboot_proc = subprocess.run([fastboot_cmd, "devices"],
79-
capture_output=True, text=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NO_WINDOW if os.name == "nt" else 0)
87+
capture_output=True, text=True, creationflags=creationflags)
8088
fb_devs = []
8189
for line in fastboot_proc.stdout.splitlines():
8290
parts = line.split()

modules/terminal.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,25 @@ def start_cmd_process(self):
470470
f.write("stty -echo 2>/dev/null || true\n")
471471
launch_cmd = [shell, "--rcfile", self.custom_rc_path]
472472
elif self.system == "Darwin":
473-
launch_cmd = ["/bin/zsh", "-i"]
473+
shell = shutil.which("zsh") or shutil.which("bash") or shutil.which("sh")
474+
if not shell:
475+
self.log_output("No shell found on macOS system.\n")
476+
return
474477
encoding = "utf-8"
478+
if "zsh" in os.path.basename(shell):
479+
# Create a minimal zshrc to keep the embedded terminal clean
480+
zdotdir = os.path.join(tempfile.gettempdir(), f"quickadb_zdot_{os.getpid()}")
481+
os.makedirs(zdotdir, exist_ok=True)
482+
zshrc_path = os.path.join(zdotdir, ".zshrc")
483+
with open(zshrc_path, "w", encoding="utf-8") as f:
484+
f.write("# Custom QuickADB zshrc\nexport PS1='$ '\n")
485+
self.custom_rc_path = zshrc_path
486+
launch_cmd = [shell, "-i"]
487+
else:
488+
self.custom_rc_path = os.path.join(tempfile.gettempdir(), f"quickadb_rc_{os.getpid()}")
489+
with open(self.custom_rc_path, "w", encoding="utf-8") as f:
490+
f.write("# Custom QuickADB RC\nexport PS1='$ '\nstty -echo 2>/dev/null || true\n")
491+
launch_cmd = [shell, "--rcfile", self.custom_rc_path]
475492
else:
476493
self.log_output("Unsupported OS for terminal.\n")
477494
return
@@ -483,6 +500,9 @@ def start_cmd_process(self):
483500
env['PYTHONUNBUFFERED'] = '1'
484501
current_path = env.get('PATH', '')
485502
env['PATH'] = f".:{self.platform_tools_path}:{current_path}"
503+
# For macOS zsh: point ZDOTDIR to our custom directory
504+
if self.system == "Darwin" and self.custom_rc_path:
505+
env['ZDOTDIR'] = os.path.dirname(self.custom_rc_path)
486506

487507
creationflags = 0
488508
startupinfo = None

res/whatsnew.html

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,48 @@
1-
<html lang="en">
2-
<head>
3-
<meta charset="UTF-8">
4-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
5-
</head>
6-
<body>
7-
8-
<h4>What's New?</h4>
9-
10-
<b>1) QuickADB has been fully recreated! </b><br><br>
11-
- Switched to PyQt6 for scalable, beautiful themes <br>
12-
- Used a lot more threading to achieve maximum smoothness<br>
13-
- Recreated all features and used them as dynamic modules<br>
14-
- Open-sourced the program<br>
15-
16-
<br><br>
17-
18-
<b>2) ADB Debloater is now an App Manager </b><br><br>
19-
- Categorize app types by their paths (User, System and Vendor) <br>
20-
- Disable multiple apps at once <br>
21-
- Change app sorting by clicking columns (App status and App type columns only) <br>
22-
- Backup and restore apps with a single click <br>
23-
- Show app details such as version and installation path <br>
24-
- Manage multiple app permissions at once <br>
25-
- Newer, more readable UI <br>
26-
- Improved app detection <br>
27-
28-
<br><br>
29-
30-
<b>3) A new, custom terminal is added</b> <br><br>
31-
- Based on CMD or your default terminal, all commands work as expected <br>
32-
- Buttons to extract or highlight the output <br>
33-
- Drag-and-drop support for files <br>
34-
- Autocomplete for adb and fastboot commands <br>
35-
36-
<br><br>
37-
38-
<b>4) App-wide enhancements</b><br><br>
39-
- A lot of performance enhancements <br>
40-
- Major UI changes - switched from TkInter to PyQt6 <br>
41-
- Added the "About" section - the one you're reading right now <br>
42-
- Fixed logging bugs <br>
43-
- Completely modularized the codebase <br>
44-
- Multi-OS support <br>
45-
46-
<b>5) Added themes</b><br><br>
47-
- Added 4 premade themes: dark (default), high contrast, light and Android <br>
48-
- Added default theme option: resets the custom palette and inherits OS' design language <br>
49-
50-
51-
</body>
1+
<h1>Changelog (Starting from V4)</h1>
2+
3+
<p>
4+
The changelog only includes what's new. To read feature descriptions, see
5+
<a href="https://github.com/codefl0w/QuickADB?tab=readme-ov-file#features">Features</a>.
6+
</p>
7+
8+
<p>
9+
For the old changelog, see
10+
<a href="https://github.com/codefl0w/QuickADB/blob/main/README_OLD.md">README_OLD</a>.
11+
</p>
12+
13+
<h1>[4.0.0] - 10.03.2026</h1>
14+
15+
<h3>Added</h3>
16+
<ul>
17+
<li>Theme Manager</li>
18+
<li>Boot Animation Creator</li>
19+
<li>File Explorer</li>
20+
<li>Custom terminal</li>
21+
<li>Partition Manager</li>
22+
</ul>
23+
24+
<h3>Changed</h3>
25+
<ul>
26+
<li>Rebuilt application using PyQt6</li>
27+
<li>Debloater renamed and expanded into App Manager</li>
28+
<li>Replaced lpunpack with unsuper for faster super.img extraction</li>
29+
<li>Removed OS-specific code enabling Linux and macOS builds</li>
30+
</ul>
31+
32+
<h3>Improved</h3>
33+
<ul>
34+
<li>Multithreading performance</li>
35+
<li>GSI flasher</li>
36+
<li>super.img dumper</li>
37+
<li>payload.bin dumper</li>
38+
<li>device specification detection</li>
39+
<li>version update detection</li>
40+
<li>logging system</li>
41+
</ul>
42+
43+
<h3>Removed</h3>
44+
<ul>
45+
<li>Driver installers</li>
46+
<li>Magisk downloader</li>
47+
<li>Inactive Magisk Root button (planned for V5)</li>
48+
</ul>

0 commit comments

Comments
 (0)