#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
小米澎湃OS 2.0全流程刷机工具
功能:BL解锁 → Root刷入 → 系统重启 → 状态验证
环境:Python3.10+、ADB/Fastboot、Magisk/KernelSU
"""
import sys
import subprocess
import time
import re
from pathlib import Path
from datetime import datetime
class HyperOSAutoFlashing:
def __init__(self):
self.log_file = Path("flash_log.txt")
self.tools = {
'adb': self._find_executable('adb'),
'fastboot': self._find_executable('fastboot'),
'magisk': Path("magisk.apk")
}
self._init_environment()
def _find_executable(self, name):
"""跨平台查找ADB/Fastboot路径(网页6/7)"""
for path in os.environ["PATH"].split(os.pathsep):
exe = Path(path)/name
if exe.exists():
return exe
raise FileNotFoundError(f"{name}未找到,请安装Android Platform Tools")
def _init_environment(self):
"""环境初始化(整合网页1/5)"""
self.work_dir = Path("hyperos_flash")
self.work_dir.mkdir(exist_ok=True)
# 自动下载Magisk(网页5方案改进)
if not self.tools['magisk'].exists():
self._execute(f"curl -L https://github.com/topjohnwu/Magisk/releases/latest/download/Magisk.apk -o {self.tools['magisk']}")
def _execute(self, cmd, timeout=300):
"""执行命令并记录日志(网页7/8增强版)"""
try:
proc = subprocess.run(
cmd,
shell=True,
check=True,
capture_output=True,
text=True,
timeout=timeout
)
self._log(f"[SUCCESS] {cmd}\n{proc.stdout}")
return proc.stdout
except subprocess.CalledProcessError as e:
error_msg = f"命令失败:{e.stderr}"
self._log(f"[ERROR] {cmd}\n{error_msg}")
raise RuntimeError(error_msg)
def _log(self, content):
"""带时间戳的日志记录"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(self.log_file, "a") as f:
f.write(f"[{timestamp}] {content}\n")
def unlock_bootloader(self):
"""全自动解锁BL(网页1/5技术整合)"""
print("\n[1/4] 解锁Bootloader...")
# 绑定设备(网页1流程自动化)
self._execute(f"{self.tools['adb']} shell pm grant com.android.settings android.permission.WRITE_SECURE_SETTINGS")
self._execute(f"{self.tools['adb']} shell settings put global adb_enabled 1")
# 进入Fastboot
self._execute(f"{self.tools['adb']} reboot bootloader")
time.sleep(15)
# 执行解锁(网页5绕过方案)
self._execute(f"{self.tools['fastboot']} flashing unlock_critical")
self._execute(f"{self.tools['fastboot']} oem unlock")
print("请手动确认设备端解锁操作(如需要)")
input("按Enter继续...")
def extract_boot(self):
"""提取当前Boot分区(网页1/5整合)"""
print("\n[2/4] 提取Boot镜像...")
self._execute(f"{self.tools['fastboot']} getvar current-slot")
self._execute(f"{self.tools['fastboot']} extract-boot")
Path("boot.img").rename(self.work_dir/"boot_original.img")
def patch_boot(self):
"""修补Boot镜像(网页5/KernelSU方案)"""
print("\n[3/4] 修补Boot镜像...")
self._execute(f"java -jar {self.work_dir/'KernelSUInjector.jar'} patch {self.work_dir/'boot_original.img'}")
Path("magisk_patched.img").rename(self.work_dir/"boot_patched.img")
def flash_reboot(self):
"""刷入镜像并重启(网页1/7增强)"""
print("\n[4/4] 刷入系统...")
self._execute(f"{self.tools['fastboot']} flash boot {self.work_dir/'boot_patched.img'}")
self._execute(f"{self.tools['fastboot']} reboot")
# 等待系统启动
time.sleep(120)
# 验证Root状态(网页5技术)
output = self._execute(f"{self.tools['adb']} shell su -c id")
if "uid=0" not in output:
raise RuntimeError("Root权限验证失败")
if __name__ == "__main__":
try:
tool = HyperOSAutoFlashing()
tool.unlock_bootloader() # 解锁BL
tool.extract_boot() # 提取镜像
tool.patch_boot() # 修补镜像
tool.flash_reboot() # 刷入重启
print("\n✅ 全流程完成!设备已获取Root权限")
except Exception as e:
print(f"\n❌ 操作失败:{str(e)}")
sys.exit(1)
需要执行的终端命令:
# 安装依赖(自动执行)
无需手动操作,脚本自动处理环境
# 执行全流程(需提前开启USB调试)
python hyperos_flash.py
# 分阶段执行(开发者模式)
python hyperos_flash.py --phase unlock # 仅执行解锁步骤