From a0007649e9fe880d204b9f3c39ccd6b0e3af3f00 Mon Sep 17 00:00:00 2001 From: CoderKang Date: Thu, 18 Sep 2025 11:09:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=20device.mk=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=BB=A5=E6=B7=BB=E5=8A=A0=20bootanim.rc=20?= =?UTF-8?q?=E5=92=8C=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E8=AE=BE=E7=BD=AE=EF=BC=8C=E5=90=8C=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=20extract.py=20=E5=92=8C=20magisk.rc=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E7=AE=80=E5=8C=96=E9=A1=B9=E7=9B=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E7=A1=AE=E4=BF=9D=E4=B8=8E=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=9A=84=20Magisk=20=E7=89=88=E6=9C=AC=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++-- device.mk | 13 ++++--- extract.py | 110 ----------------------------------------------------- magisk.py | 34 ++++++++++++----- magisk.rc | 35 ----------------- 5 files changed, 34 insertions(+), 166 deletions(-) delete mode 100644 extract.py delete mode 100644 magisk.rc diff --git a/README.md b/README.md index 02f1d2d..1a701ae 100644 --- a/README.md +++ b/README.md @@ -16,26 +16,24 @@ 1. **构建前准备**:运行提取脚本自动下载并提取 Magisk: ```bash - python3 extract.py + python3 magisk.py ``` 2. **进行 Android 构建**:在你的设备配置中包含此 vendor 脚本会自动: -- 从 ayasa520/Magisk 下载 Debug 版本 APK +- 从 topjohnwu/Magisk 下载 Magisk v30.2 版本 APK - 验证文件 MD5 校验和 (834b0f063ea713bea48b92c7d5648ce9) - 提取二进制文件到 magisk 目录 -**注意**:请确保在 Android 构建之前先运行 `extract.py` 脚本来准备所需的文件。 +**注意**:请确保在 Android 构建之前先运行 `magisk.py` 脚本来准备所需的文件。 ## 目录结构 ``` vendor/magisk/ -├── extract.py # 提取脚本 ├── magisk.py # Magisk 类模块(包含下载和复制逻辑) ├── magisk.apk # Magisk APK 文件 -├── magisk.rc # Init 服务配置 ├── Android.mk # 构建配置 ├── device.mk # 设备配置 └── magisk/ diff --git a/device.mk b/device.mk index 80eea3d..326671c 100644 --- a/device.mk +++ b/device.mk @@ -3,9 +3,10 @@ PRODUCT_PACKAGES += \ magisk.apk PRODUCT_COPY_FILES += \ - vendor/magisk/magisk.rc:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk.rc \ - vendor/magisk/magisk/system/etc/init/magisk/busybox:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/busybox \ - vendor/magisk/magisk/system/etc/init/magisk/magisk:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magisk \ - vendor/magisk/magisk/system/etc/init/magisk/magiskboot:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskboot \ - vendor/magisk/magisk/system/etc/init/magisk/magiskinit:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskinit \ - vendor/magisk/magisk/system/etc/init/magisk/magiskpolicy:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskpolicy \ + vendor/magisk/magisk/system/etc/init/bootanim.rc:$(TARGET_COPY_OUT_SYSTEM)/etc/init/bootanim.rc \ + vendor/magisk/magisk/system/etc/init/bootanim.rc.gz:$(TARGET_COPY_OUT_SYSTEM)/etc/init/bootanim.rc.gz \ + vendor/magisk/magisk/system/etc/init/magisk/busybox:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/busybox:0755 \ + vendor/magisk/magisk/system/etc/init/magisk/magisk:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magisk:0755 \ + vendor/magisk/magisk/system/etc/init/magisk/magiskboot:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskboot:0755 \ + vendor/magisk/magisk/system/etc/init/magisk/magiskinit:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskinit:0755 \ + vendor/magisk/magisk/system/etc/init/magisk/magiskpolicy:$(TARGET_COPY_OUT_SYSTEM)/etc/init/magisk/magiskpolicy:0755 diff --git a/extract.py b/extract.py deleted file mode 100644 index b8bddd6..0000000 --- a/extract.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -import atexit -import hashlib -import os.path -import re -import shutil -import subprocess -import urllib.request -import zipfile - - -def calculate_md5(file_path): - """计算文件的 MD5 值""" - hash_md5 = hashlib.md5() - with open(file_path, "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hash_md5.update(chunk) - return hash_md5.hexdigest() - - -def download_file(url, file_path): - """下载文件""" - print(f"==> Downloading from {url}") - urllib.request.urlretrieve(url, file_path) - - -def main(): - current_path = os.path.dirname(os.path.abspath(__file__)) - apk_path = os.path.join(current_path, "magisk.apk") - unzip_path = os.path.join(current_path, "temp") - overlay_path = os.path.join(current_path, "magisk") - overlay_magisk_path = os.path.join(overlay_path, "system", "etc", "init", "magisk") - - # Magisk 下载配置 - magisk_url = "https://github.com/topjohnwu/Magisk/releases/download/v30.2/Magisk-v30.2.apk" - expected_md5 = "2691c30ccf059af2536cb0af803c787c" - - # 检查并下载 Magisk APK - need_download = True - if os.path.exists(apk_path): - print("==> Checking existing Magisk APK...") - actual_md5 = calculate_md5(apk_path) - if actual_md5 == expected_md5: - print("==> Magisk APK already exists and verified!") - need_download = False - else: - print(f"==> MD5 mismatch. Expected: {expected_md5}, Got: {actual_md5}") - - if need_download: - print("==> Downloading Magisk v30.2...") - download_file(magisk_url, apk_path) - actual_md5 = calculate_md5(apk_path) - if actual_md5 != expected_md5: - raise Exception(f"Downloaded file MD5 verification failed! Expected: {expected_md5}, Got: {actual_md5}") - print("==> Download completed and verified!") - - shutil.rmtree(unzip_path, ignore_errors=True) - os.makedirs(unzip_path, exist_ok=True) - atexit.register(shutil.rmtree, unzip_path, ignore_errors=True) - - print("==> Extracting archive...") - with zipfile.ZipFile(apk_path) as z: - z.extractall(unzip_path) - - shutil.rmtree(overlay_path, ignore_errors=True) - os.makedirs(overlay_magisk_path, exist_ok=True) - - print("==> Installing magisk now ...") - - # 架构映射,与 magisk.py 保持一致 - arch_map = { - "x86": "x86", - "x86_64": "x86_64", - "arm": "armeabi-v7a", - "arm64": "arm64-v8a" - } - - # 默认使用 arm64 架构 - machine_arch = "arm64" - lib_dir = os.path.join(unzip_path, "lib", arch_map[machine_arch]) - - # 复制主要架构的所有库文件 - if os.path.exists(lib_dir): - for parent, dirnames, filenames in os.walk(lib_dir): - for filename in filenames: - o_path = os.path.join(lib_dir, filename) - so_name = re.search(r'lib(.*)\.so', filename) - if so_name: - n_path = os.path.join(overlay_magisk_path, so_name.group(1)) - shutil.copyfile(o_path, n_path) - subprocess.check_call(["chmod", "+x", n_path]) - - # 同时复制 arm32 的 magisk 二进制文件(如果存在) - lib32_path = os.path.join(unzip_path, "lib", "armeabi-v7a") - magisk32_src = os.path.join(lib32_path, "libmagisk32.so") - magisk32_dst = os.path.join(overlay_magisk_path, "magisk32") - if os.path.exists(magisk32_src): - shutil.copyfile(magisk32_src, magisk32_dst) - subprocess.check_call(["chmod", "+x", magisk32_dst]) - - # Copy magisk.apk to target directory - apk_dst = os.path.join(overlay_magisk_path, "magisk.apk") - if os.path.exists(apk_path): - shutil.copyfile(apk_path, apk_dst) - - print("==> Magisk installation completed!") - - -if __name__ == '__main__': - main() diff --git a/magisk.py b/magisk.py index 78a3064..6f8c59e 100644 --- a/magisk.py +++ b/magisk.py @@ -7,9 +7,9 @@ from tools.helper import bcolors, download_file, host, print_color, run, get_dow class Magisk(General): download_loc = get_download_dir() - dl_link = "https://github.com/ayasa520/Magisk/releases/download/debug-7be6d81-30200/Magisk-7be6d81-30200-debug.apk" + dl_link = "https://github.com/topjohnwu/Magisk/releases/download/v30.2/Magisk-v30.2.apk" dl_file_name = os.path.join(download_loc, "magisk.apk") - act_md5 = "834b0f063ea713bea48b92c7d5648ce9" + act_md5 = "2691c30ccf059af2536cb0af803c787c" extract_to = "/tmp/magisk_unpack" copy_dir = "./magisk" magisk_dir = os.path.join(copy_dir, "system", "etc", "init", "magisk") @@ -71,14 +71,28 @@ on property:init.svc.zygote=stopped "arm64": "arm64-v8a" } lib_dir = os.path.join(self.extract_to, "lib", arch_map[self.machine[0]]) - for parent, dirnames, filenames in os.walk(lib_dir): - for filename in filenames: - o_path = os.path.join(lib_dir, filename) - filename = re.search('lib(.*)\.so', filename) - n_path = os.path.join(self.magisk_dir, filename.group(1)) - shutil.copyfile(o_path, n_path) - run(["chmod", "+x", n_path]) - shutil.copyfile(self.dl_file_name, os.path.join(self.magisk_dir,"magisk.apk") ) + if os.path.exists(lib_dir): + for parent, dirnames, filenames in os.walk(lib_dir): + for filename in filenames: + o_path = os.path.join(lib_dir, filename) + so_name = re.search(r'lib(.*)\.so', filename) + if so_name: + n_path = os.path.join(self.magisk_dir, so_name.group(1)) + shutil.copyfile(o_path, n_path) + run(["chmod", "+x", n_path]) + + # 同时复制 arm32 的 magisk 二进制文件(如果存在) + lib32_path = os.path.join(self.extract_to, "lib", "armeabi-v7a") + magisk32_src = os.path.join(lib32_path, "libmagisk32.so") + magisk32_dst = os.path.join(self.magisk_dir, "magisk32") + if os.path.exists(magisk32_src): + shutil.copyfile(magisk32_src, magisk32_dst) + run(["chmod", "+x", magisk32_dst]) + + # Copy magisk.apk to target directory + apk_dst = os.path.join(self.magisk_dir, "magisk.apk") + if os.path.exists(self.dl_file_name): + shutil.copyfile(self.dl_file_name, apk_dst) # Updating Magisk from Magisk manager will modify bootanim.rc, # So it is necessary to backup the original bootanim.rc. diff --git a/magisk.rc b/magisk.rc deleted file mode 100644 index 16141ea..0000000 --- a/magisk.rc +++ /dev/null @@ -1,35 +0,0 @@ - -service bootanim /system/bin/bootanimation - class core animation - user graphics - group graphics audio - disabled - oneshot - ioprio rt 0 - task_profiles MaxPerformance - -on post-fs-data - start logd - exec u:r:su:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk - exec u:r:magisk:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk - exec u:r:update_engine:s0 root root -- /system/etc/init/magisk/magiskpolicy --live --magisk - exec u:r:su:s0 root root -- /system/etc/init/magisk/magisk --auto-selinux --setup-sbin /system/etc/init/magisk /sbin - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --post-fs-data - -on nonencrypted - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service - -on property:vold.decrypt=trigger_restart_framework - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --service - -on property:sys.boot_completed=1 - mkdir /data/adb/magisk 755 - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --boot-complete - exec -- /system/bin/sh -c "pm install /system/etc/init/magisk/magisk.apk" - -on property:init.svc.zygote=restarting - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart - -on property:init.svc.zygote=stopped - exec u:r:su:s0 root root -- /sbin/magisk --auto-selinux --zygote-restart -