Skip to content

Commit

Permalink
- Add support for patching [KernelSU LKM](https://github.com/tiann/Ke…
Browse files Browse the repository at this point in the history
…rnelSU/releases/tag/v0.9.0) (Kernel modules, GKI only). This is in addition to the classic KernelSU support.

- Add support for patching with [APatch](https://github.com/bmax121/APatch)
- Rename `Install Magisk` to `Install Root App` as it now supports directly installing KernelSU and Apatch through PixelFlasher.
- Add Install [ZygiskNext](https://github.com/Admirepowered/ZygiskNext) module option in `Magisk` tool options.
- Use UTF-8 encoding for the logifile instead of ISO-8859-1
- Miscellaneous minor improvements.
  • Loading branch information
badabing2005 committed Mar 26, 2024
1 parent 3a486da commit 256f696
Show file tree
Hide file tree
Showing 13 changed files with 837 additions and 183 deletions.
58 changes: 48 additions & 10 deletions Main.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
from modules import (adb_kill_server, auto_resize_boot_list,
check_platform_tools, flash_phone, live_flash_boot_phone,
patch_boot_img, populate_boot_list, process_file,
select_firmware, set_flash_button_state, patch_with_apatch)
select_firmware, set_flash_button_state)
from package_manager import PackageManager
from partition_manager import PartitionManager
from phone import get_connected_devices
Expand All @@ -67,7 +67,7 @@ class RedirectText():
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
logfile = os.path.join(get_config_path(), 'logs', f"PixelFlasher_{datetime.now():%Y-%m-%d_%Hh%Mm%Ss}.log")
self.logfile = open(logfile, "w", buffering=1, encoding="ISO-8859-1", errors="replace")
self.logfile = open(logfile, "w", buffering=1, encoding="utf-8", errors="replace")
set_logfile(logfile)

def write(self, string):
Expand Down Expand Up @@ -936,7 +936,7 @@ def _build_toolbar(self, flags, destroy=False):

# Download and Install Magisk Manager
if self.config.toolbar['visible']['install_magisk']:
tb.AddTool(toolId=210, label="Install Magisk", bitmap=images.install_magisk_64.GetBitmap(), bmpDisabled=null_bmp, kind=wx.ITEM_NORMAL, shortHelp="Download and Install Magisk Manager", longHelp="Download and Install Magisk Manager", clientData=None)
tb.AddTool(toolId=210, label="Install Root App", bitmap=images.install_magisk_64.GetBitmap(), bmpDisabled=null_bmp, kind=wx.ITEM_NORMAL, shortHelp="Download / Install rooting app like Magisk or KernelSU or APatch", longHelp="Download / Install rooting app like Magisk or KernelSU or APatch", clientData=None)
self.Bind(wx.EVT_TOOL, self.OnToolClick, id=210)
self.Bind(wx.EVT_TOOL_RCLICKED, self.OnToolRClick, id=210)

Expand Down Expand Up @@ -1275,7 +1275,7 @@ def _build_menu_bar(self):
self.magisk_menu.SetBitmap(images.magisk_24.GetBitmap())
self.Bind(wx.EVT_MENU, self._on_magisk, self.magisk_menu)
# Install Magisk
self.install_magisk_menu = device_menu.Append(wx.ID_ANY, "Install Magisk", "Download and Install Magisk")
self.install_magisk_menu = device_menu.Append(wx.ID_ANY, "Install Root App", "Download / Install rooting app like Magisk or KernelSU or APatch")
self.install_magisk_menu.SetBitmap(images.install_magisk_24.GetBitmap())
self.Bind(wx.EVT_MENU, self._on_magisk_install, self.install_magisk_menu)
# Magisk Backup Manager
Expand Down Expand Up @@ -1364,7 +1364,7 @@ def _build_menu_bar(self):
tb_buttons_menu.Append(150, "Reboot Download", "", wx.ITEM_CHECK).SetBitmap(images.reboot_download_24.GetBitmap())
tb_buttons_menu.Append(160, "Reboot Sideload", "", wx.ITEM_CHECK).SetBitmap(images.reboot_sideload_24.GetBitmap())
tb_buttons_menu.Append(200, "Magisk", "", wx.ITEM_CHECK).SetBitmap(images.magisk_24.GetBitmap())
tb_buttons_menu.Append(210, "Install Magisk", "", wx.ITEM_CHECK).SetBitmap(images.install_magisk_24.GetBitmap())
tb_buttons_menu.Append(210, "Install Root App", "", wx.ITEM_CHECK).SetBitmap(images.install_magisk_24.GetBitmap())
tb_buttons_menu.Append(220, "Magisk Backup Manager", "", wx.ITEM_CHECK).SetBitmap(images.backup_24.GetBitmap())
tb_buttons_menu.Append(225, "Pif Manager", "", wx.ITEM_CHECK).SetBitmap(images.pif_24.GetBitmap())
tb_buttons_menu.Append(230, "SOS", "", wx.ITEM_CHECK).SetBitmap(images.sos_24.GetBitmap())
Expand Down Expand Up @@ -2137,7 +2137,7 @@ def _print_device_details(self, device):
m_app_version = device.magisk_app_version
message += f" Magisk Manager Version: {m_app_version}\n"
if m_app_version:
message += f" Magisk Path: {device.magisk_path}\n"
# message += f" Magisk Path: {device.magisk_path}\n"
message += f" Checked for Package: {self.config.magisk}\n"
elif device.mode == 'f.b':
message += f" Device Unlocked: {device.unlocked}\n"
Expand Down Expand Up @@ -2481,6 +2481,12 @@ def evaluate_condition(self, condition):
return False
return True

elif condition == 'boot_is_init_boot':
boot = get_boot()
if boot and boot.is_init_boot == 1:
return True
return False

elif condition == 'custom_image_selected':
image_path = get_image_path()
if image_path:
Expand Down Expand Up @@ -2577,7 +2583,8 @@ def update_widget_states(self):
self.patch_button: ['device_attached', 'device_mode_adb'],
self.patch_magisk_button: ['device_attached', 'device_mode_adb', 'boot_is_selected', 'boot_is_not_patched'],
self.patch_kernelsu_button: ['device_attached', 'device_mode_adb', 'boot_is_selected', 'boot_is_not_patched'],
# self.patch_apatch_button: ['device_attached', 'device_mode_adb', 'boot_is_selected', 'boot_is_not_patched'],
self.patch_kernelsu_lkm_button: ['device_attached', 'device_mode_adb', 'boot_is_selected', 'boot_is_not_patched', 'boot_is_init_boot'],
self.patch_apatch_button: ['device_attached', 'device_mode_adb', 'boot_is_selected', 'boot_is_not_patched'],
# Special handling of non-singular widgets
'mode_radio_button.OTA': ['firmware_selected', 'firmware_is_ota'],
'mode_radio_button.keepData': ['firmware_selected', 'firmware_is_not_ota'],
Expand Down Expand Up @@ -4038,7 +4045,7 @@ def _on_magisk_patch_boot(self, event):
self._on_spin('start')
patch_boot_img(self, 'Magisk')
except Exception as e:
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered an error while patching boot")
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered while patching with Magisk")
traceback.print_exc()
self._on_spin('stop')

Expand All @@ -4053,7 +4060,37 @@ def _on_kernelsu_patch_boot(self, event):
self._on_spin('start')
patch_boot_img(self, 'KernelSU')
except Exception as e:
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered an error while patching boot")
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered an error while patching with KernelSU")
traceback.print_exc()
self._on_spin('stop')

# -----------------------------------------------
# _on_kernelsu_lkm_patch_boot
# -----------------------------------------------
def _on_kernelsu_lkm_patch_boot(self, event):
try:
print("\n==============================================================================")
print(f" {datetime.now():%Y-%m-%d %H:%M:%S} User initiated KernelSU LKM Patch boot")
print("==============================================================================")
self._on_spin('start')
patch_boot_img(self, 'KernelSU_LKM')
except Exception as e:
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered an error while patching KernselSU LKM")
traceback.print_exc()
self._on_spin('stop')

# -----------------------------------------------
# _on_kernelsu_lkm_patch_boot
# -----------------------------------------------
def _on_apatch_patch_boot(self, event):
try:
print("\n==============================================================================")
print(f" {datetime.now():%Y-%m-%d %H:%M:%S} User initiated APatch Patch boot")
print("==============================================================================")
self._on_spin('start')
patch_boot_img(self, 'APatch')
except Exception as e:
print(f"\n{datetime.now():%Y-%m-%d %H:%M:%S} ERROR: Encountered an error while patching with APatch")
traceback.print_exc()
self._on_spin('stop')

Expand Down Expand Up @@ -4343,7 +4380,8 @@ def _add_mode_radio_button(sizer, index, flash_mode, label, tooltip):
self.patch_button.SetToolTip(u"Patch the selected item")
self.patch_magisk_button = self.patch_button.AddFunction("Patch with Magisk", lambda: self._on_magisk_patch_boot(None), images.magisk_24.GetBitmap())
self.patch_kernelsu_button = self.patch_button.AddFunction("Patch with KernelSU", lambda: self._on_kernelsu_patch_boot(None), images.kernelsu_24.GetBitmap())
self.patch_apatch_button = self.patch_button.AddFunction("Patch with APtach", lambda: patch_with_apatch(self), images.apatch_24.GetBitmap(), False)
self.patch_kernelsu_lkm_button = self.patch_button.AddFunction("Patch with KernelSU LKM", lambda: self._on_kernelsu_lkm_patch_boot(None), images.kernelsu_24.GetBitmap())
self.patch_apatch_button = self.patch_button.AddFunction("Patch with APatch", lambda: self._on_apatch_patch_boot(None), images.apatch_24.GetBitmap(), False)
self.patch_custom_boot_button = self.patch_button.AddFunction("Patch with custom Magisk", lambda: self._on_patch_custom_boot(None), images.custom_patch_24.GetBitmap())
#
self.delete_boot_button = DropDownButton(parent=panel, id=wx.ID_ANY, bitmap=images.delete_24.GetBitmap(), label=u"Delete", pos=wx.DefaultPosition, size=self.folders_button.BestSize, style=0)
Expand Down
10 changes: 5 additions & 5 deletions advanced_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def __init__(self, parent, *args, **kwargs):
self.package_name.SetToolTip(u"If you have hidden Magisk,\nset this to the hidden package name.")
self.reset_magisk_pkg = wx.BitmapButton(parent=scrolled_panel, id=wx.ID_ANY, bitmap=wx.NullBitmap, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.BU_AUTODRAW)
self.reset_magisk_pkg.SetBitmap(images.scan_24.GetBitmap())
self.reset_magisk_pkg.SetToolTip(u"Resets package name to default: com.topjohnwu.magisk")
self.reset_magisk_pkg.SetToolTip(f"Resets package name to default: {MAGISK_PKG_NAME}")
package_name_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
package_name_sizer.Add(self.package_name, proportion=1, flag=wx.ALL, border=0)
package_name_sizer.Add(self.reset_magisk_pkg, proportion=0, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=5)
Expand Down Expand Up @@ -392,7 +392,7 @@ def _open_scrcpy_link(self, event):
traceback.print_exc()

def _onResetMagiskPkg(self, e):
self.package_name.Label = 'com.topjohnwu.magisk'
self.package_name.Label = MAGISK_PKG_NAME


def _onCancel(self, e):
Expand Down Expand Up @@ -451,10 +451,10 @@ def _onOk(self, e):

if self.package_name.GetValue():
with contextlib.suppress(Exception):
if self.package_name.GetValue() != self.Parent.config.magisk:
if self.package_name.GetValue() != self.Parent.config.magisk and self.package_name.GetValue() in [MAGISK_PKG_NAME, MAGISK_ALPHA_PKG_NAME, MAGISK_DELTA_PKG_NAME]:
print(f"Setting Magisk Package Name to: {self.package_name.GetValue()}")
set_magisk_package(self.package_name.GetValue())
self.Parent.config.magisk = self.package_name.GetValue()
set_magisk_package(self.package_name.GetValue())
self.Parent.config.magisk = self.package_name.GetValue()

if sys.platform.startswith("linux"):
with contextlib.suppress(Exception):
Expand Down
2 changes: 1 addition & 1 deletion build-on-mac.spec
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ exe = EXE(pyz,
icon='images/icon-dark-256.icns')
app = BUNDLE(exe,
name='PixelFlasher.app',
version='6.8.4.0',
version='6.9.0.0',
icon='./images/icon-dark-256.icns',
bundle_identifier='com.badabing.pixelflasher')
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
rm -rf build dist
VERSION=6.8.4.0
VERSION=6.9.0.0
NAME="PixelFlasher"
DIST_NAME="PixelFlasher"

Expand Down
2 changes: 1 addition & 1 deletion config.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def __init__(self):
self.platform_tools_path = None
self.device = None
self.phone_path = '/storage/emulated/0/Download'
self.magisk = 'com.topjohnwu.magisk'
self.magisk = MAGISK_PKG_NAME
self.width = MAIN_WIDTH
self.height = MAIN_HEIGHT
self.magisk_width = MAGISK_WIDTH
Expand Down
8 changes: 7 additions & 1 deletion constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

APPNAME = 'PixelFlasher'
CONFIG_FILE_NAME = 'PixelFlasher.json'
VERSION = '6.8.4.0'
VERSION = '6.9.0.0'
SDKVERSION = '33.0.3'
MAIN_WIDTH = 1400
MAIN_HEIGHT = 1040
Expand Down Expand Up @@ -53,3 +53,9 @@
'-Sultan',
'-sultan'
]
MAGISK_PKG_NAME = 'com.topjohnwu.magisk'
MAGISK_ALPHA_PKG_NAME = 'io.github.vvb2060.magisk'
MAGISK_DELTA_PKG_NAME = 'io.github.huskydg.magisk'
KERNEL_SU_PKG_NAME = 'me.weishu.kernelsu'
APATCH_PKG_NAME = 'me.bmax.apatch'
ZYGISK_NEXT_UPDATE_URL = 'https://api.nullptr.icu/android/zygisk-next/static/update.json'
21 changes: 12 additions & 9 deletions magisk_downloads.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def __init__(self, *args, **kwargs):
style = kwargs.get('style', wx.DEFAULT_DIALOG_STYLE) | wx.RESIZE_BORDER
kwargs['style'] = style
wx.Dialog.__init__(self, *args, **kwargs)
self.SetTitle("Download and Install Magisk")
self.SetTitle("Download and Install Rooting Application")
self.url = None
self.channel = None
self.version = None
Expand All @@ -54,7 +54,7 @@ def __init__(self, *args, **kwargs):

self.message_label = wx.StaticText(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
self.message_label.Wrap(-1)
self.message_label.Label = "Select Magisk version to install."
self.message_label.Label = "Select rooting app to install."
if sys.platform == "win32":
self.message_label.SetFont(wx.Font(12, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, "Arial"))

Expand All @@ -78,7 +78,7 @@ def __init__(self, *args, **kwargs):
apks = device.magisk_apks

max_url_column_width = 600
self.list.InsertColumn(0, 'Channel', width = -1)
self.list.InsertColumn(0, 'Root App', width = -1)
self.list.InsertColumn(1, 'Version', wx.LIST_FORMAT_LEFT, -1)
self.list.InsertColumn(2, 'VersionCode', wx.LIST_FORMAT_LEFT, -1)
self.list.InsertColumn(3, 'URL', wx.LIST_FORMAT_LEFT, -1)
Expand Down Expand Up @@ -209,7 +209,7 @@ def _onRightClick(self, event):
menu = wx.Menu()
menu.Append(self.popupCopyURL, "Copy URL to Clipboard")
menu.Append(self.popupCopyPackageId, "Copy Package ID to Clipboard")
menu.Append(self.popupDownloadMagisk, "Download Selected Magisk")
menu.Append(self.popupDownloadMagisk, "Download Selected Rooting App")

# Popup the menu. If an item is selected then its handler
# will be called before PopupMenu returns.
Expand Down Expand Up @@ -237,7 +237,8 @@ def _OnDownloadMagisk(self, event):
url = self.list.GetItem(self.currentItem, 3).Text
version = self.list.GetItem(self.currentItem, 1).Text
versionCode = self.list.GetItem(self.currentItem, 2).Text
filename = f"magisk_{version}_{versionCode}.apk"
app = self.channel.replace(' ', '_')
filename = f"{app}_{version}_{versionCode}.apk"
dialog = wx.FileDialog(None, "Save File", defaultFile=filename, wildcard="All files (*.*)|*.*", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
if dialog.ShowModal() == wx.ID_OK:
destination_path = dialog.GetPath()
Expand Down Expand Up @@ -301,7 +302,8 @@ def _on_apk_selected(self, e):
def _onOk(self, e):
proceed = True
print(f"{datetime.now():%Y-%m-%d %H:%M:%S} User Pressed Ok.")
filename = f"magisk_{self.version}_{self.versionCode}.apk"
app = self.channel.replace(' ', '_')
filename = f"{app}_{self.version}_{self.versionCode}.apk"
device = get_phone()
if 'Namelesswonder' in self.url and not device.has_init_boot:
print(f"WARNING: The selected Magisk is not supported for your device: {device.hardware}")
Expand Down Expand Up @@ -332,14 +334,15 @@ def _onOk(self, e):
proceed = False
if proceed:
self._on_spin('start')
print(f"Downloading Magisk: {self.channel} version: {self.version} versionCode: {self.versionCode} ...")
print(f"Downloading {app}: {self.channel} version: {self.version} versionCode: {self.versionCode} ...")
download_file(self.url, filename)
config_path = get_config_path()
app = os.path.join(config_path, 'tmp', filename)
device.install_apk(app, fastboot_included = True)
# Fresh install of Magisk, reset the package name to default value
set_magisk_package(self.package)
self.Parent.config.magisk = self.package
if self.package in [MAGISK_PKG_NAME, MAGISK_ALPHA_PKG_NAME, MAGISK_DELTA_PKG_NAME]:
set_magisk_package(self.package)
self.Parent.config.magisk = self.package
print('')
self._on_spin('stop')
self.EndModal(wx.ID_OK)
Expand Down
Loading

0 comments on commit 256f696

Please sign in to comment.