feat: 添加 Magisk v30.2 自动下载和提取功能,更新 init 服务配置,改进二进制文件提取逻辑,并新增 README 文档说明项目结构和使用方法。

This commit is contained in:
2025-09-16 18:44:01 +08:00
parent a40d15ce7e
commit 4f350192bb
4 changed files with 121 additions and 9 deletions

52
README.md Normal file
View File

@@ -0,0 +1,52 @@
# Magisk Vendor 项目
这个项目为 Android 设备提供 Magisk 支持,适用于 vendor overlay 构建。
## 更新内容
- ✅ 更新到官方 Magisk v30.2 版本
- ✅ 添加了自动下载功能,无需手动准备 APK 文件
- ✅ 集成了 MD5 校验确保文件完整性
- ✅ 改进了二进制文件提取逻辑
- ✅ 更新了 init 服务配置
- ✅ 添加了自动构建时提取
## 使用方法
1. 运行提取脚本自动下载并提取 Magisk v30.2
```bash
python3 extract.py
```
2. 或者直接进行 Android 构建,二进制文件会自动下载和提取
脚本会自动:
- 从官方 GitHub 下载 Magisk v30.2 APK
- 验证文件 MD5 校验和 (2691c30ccf059af2536cb0af803c787c)
- 提取二进制文件到 rootfs 目录
## 目录结构
```
vendor/magisk/
├── extract.py # 提取脚本
├── magisk.apk # Magisk APK 文件
├── magisk.rc # Init 服务配置
├── Android.mk # 构建配置
├── device.mk # 设备配置
└── rootfs/
└── vendor/
└── etc/
└── init/
└── magisk/ # 提取的二进制文件目录
```
## 支持的架构
- ARM64 (arm64-v8a)
- ARM32 (armeabi-v7a)
## 兼容性
- 支持最新版本的 Magisk
- 适用于 Redroid 环境
- 兼容 Android vendor overlay 构建系统

View File

@@ -6,3 +6,6 @@ PRODUCT_COPY_FILES += \
vendor/magisk/magisk.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/magisk.rc \ vendor/magisk/magisk.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/magisk.rc \
$(call find-copy-subdir-files,*,vendor/magisk/rootfs/vendor/etc/init,$(TARGET_COPY_OUT_VENDOR)/etc/init) \ $(call find-copy-subdir-files,*,vendor/magisk/rootfs/vendor/etc/init,$(TARGET_COPY_OUT_VENDOR)/etc/init) \
# Extract Magisk binaries from APK during build
$(shell cd vendor/magisk && python3 extract.py)

View File

@@ -1,19 +1,58 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import atexit import atexit
import hashlib
import os.path import os.path
import re import re
import shutil import shutil
import subprocess import subprocess
import urllib.request
import zipfile 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(): def main():
current_path = os.path.dirname(os.path.abspath(__file__)) current_path = os.path.dirname(os.path.abspath(__file__))
apk_path = os.path.join(current_path, "magisk.apk") apk_path = os.path.join(current_path, "magisk.apk")
unzip_path = os.path.join(current_path, "temp") unzip_path = os.path.join(current_path, "temp")
overlay_path = os.path.join(current_path, "rootfs") overlay_path = os.path.join(current_path, "rootfs")
overlay_magisk_path = os.path.join(overlay_path, "vendor", "etc", "init", "magisk") overlay_magisk_path = os.path.join(overlay_path, "vendor", "etc", "init", "magisk")
overlay_init_path = os.path.join(overlay_path, "vendor", "etc", "init", "magisk.rc")
# 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) shutil.rmtree(unzip_path, ignore_errors=True)
os.makedirs(unzip_path, exist_ok=True) os.makedirs(unzip_path, exist_ok=True)
@@ -27,17 +66,31 @@ def main():
os.makedirs(overlay_magisk_path, exist_ok=True) os.makedirs(overlay_magisk_path, exist_ok=True)
print("==> Installing magisk now ...") print("==> Installing magisk now ...")
# Extract arm64 binaries
lib64_path = os.path.join(unzip_path, "lib", "arm64-v8a") lib64_path = os.path.join(unzip_path, "lib", "arm64-v8a")
for parent, dirnames, filenames in os.walk(lib64_path): for parent, dirnames, filenames in os.walk(lib64_path):
for filename in filenames: for filename in filenames:
so_path = os.path.join(lib64_path, filename) so_path = os.path.join(lib64_path, filename)
so_name = re.search(r"lib(.*)\.so", filename) so_name = re.search(r"lib(.*)\.so", filename)
if so_name:
target_path = os.path.join(overlay_magisk_path, so_name.group(1)) target_path = os.path.join(overlay_magisk_path, so_name.group(1))
shutil.copyfile(so_path, target_path) shutil.copyfile(so_path, target_path)
subprocess.check_call(["chmod", "+x", target_path]) subprocess.check_call(["chmod", "+x", target_path])
# Extract arm32 magisk binary
lib32_path = os.path.join(unzip_path, "lib", "armeabi-v7a") lib32_path = os.path.join(unzip_path, "lib", "armeabi-v7a")
shutil.copyfile(os.path.join(lib32_path, "libmagisk32.so"), os.path.join(overlay_magisk_path, "magisk32")) 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__': if __name__ == '__main__':

View File

@@ -3,25 +3,29 @@
on post-fs-data && property:ro.boot.redroid_magisk=1 on post-fs-data && property:ro.boot.redroid_magisk=1
start logd start logd
chmod 0755 /vendor/etc/init/magisk/magisk64 chmod 0755 /vendor/etc/init/magisk/magisk64
chmod 0755 /vendor/etc/init/magisk/magisk32
chmod 0755 /vendor/etc/init/magisk/magiskinit
chmod 0755 /vendor/etc/init/magisk/magiskboot
chmod 0755 /vendor/etc/init/magisk/magiskpolicy chmod 0755 /vendor/etc/init/magisk/magiskpolicy
chmod 0755 /vendor/etc/init/magisk/busybox
exec u:r:su:s0 root root -- /vendor/etc/init/magisk/magisk64 --setup-sbin /vendor/etc/init/magisk exec u:r:su:s0 root root -- /vendor/etc/init/magisk/magisk64 --setup-sbin /vendor/etc/init/magisk
exec u:r:su:s0 root root -- /vendor/etc/init/magisk/magiskpolicy --live --magisk "allow * magisk_file lnk_file *" exec u:r:su:s0 root root -- /vendor/etc/init/magisk/magiskpolicy --live --magisk "allow * magisk_file lnk_file *"
mkdir /sbin/.magisk 700 mkdir /sbin/.magisk 700
mkdir /sbin/.magisk/mirror 700 mkdir /sbin/.magisk/mirror 700
mkdir /sbin/.magisk/block 700 mkdir /sbin/.magisk/block 700
rm /dev/.magisk_unblock rm /dev/.magisk_unblock
start 7zKkuZ1ZhD start magisk_post_fs_data
wait /dev/.magisk_unblock 40 wait /dev/.magisk_unblock 40
rm /dev/.magisk_unblock rm /dev/.magisk_unblock
start wHgGlkRCtMoIQw start magisk_service
service 7zKkuZ1ZhD /sbin/magisk --post-fs-data service magisk_post_fs_data /sbin/magisk --post-fs-data
user root user root
seclabel u:r:su:s0 seclabel u:r:su:s0
oneshot oneshot
disabled disabled
service wHgGlkRCtMoIQw /sbin/magisk --service service magisk_service /sbin/magisk --service
user root user root
seclabel u:r:su:s0 seclabel u:r:su:s0
oneshot oneshot