Fix-Magisk-bootstrap-compatibility
This commit is contained in:
@@ -43,20 +43,47 @@ class Backend:
|
|||||||
if self.mode == "adb" and ":" in self.serial:
|
if self.mode == "adb" and ":" in self.serial:
|
||||||
run(["adb", "connect", self.serial], check=False)
|
run(["adb", "connect", self.serial], check=False)
|
||||||
|
|
||||||
|
def _root_probe_args(self):
|
||||||
|
return [
|
||||||
|
["shell", "su", "root", "id"],
|
||||||
|
["shell", "su", "0", "id"],
|
||||||
|
]
|
||||||
|
|
||||||
|
def _root_shell_args(self, command):
|
||||||
|
return [
|
||||||
|
["shell", "su", "root", "sh", "-c", command],
|
||||||
|
["shell", "su", "0", "sh", "-c", command],
|
||||||
|
]
|
||||||
|
|
||||||
def has_root(self):
|
def has_root(self):
|
||||||
if self.mode == "container":
|
if self.mode == "container":
|
||||||
return True
|
return True
|
||||||
if not self._root_checked:
|
if not self._root_checked or not self._root_available:
|
||||||
|
for args in self._root_probe_args():
|
||||||
result = adb(
|
result = adb(
|
||||||
self.serial,
|
self.serial,
|
||||||
["shell", "su", "-mm", "-c", "id"],
|
args,
|
||||||
check=False,
|
check=False,
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
)
|
)
|
||||||
self._root_available = result.returncode == 0 and "uid=0(" in result.stdout
|
if result.returncode == 0 and "uid=0(" in result.stdout:
|
||||||
|
self._root_available = True
|
||||||
self._root_checked = True
|
self._root_checked = True
|
||||||
|
return True
|
||||||
|
self._root_available = False
|
||||||
|
self._root_checked = False
|
||||||
return self._root_available
|
return self._root_available
|
||||||
|
|
||||||
|
def wait_for_root(self, timeout):
|
||||||
|
if self.mode == "container":
|
||||||
|
return True
|
||||||
|
deadline = time.time() + timeout
|
||||||
|
while time.time() < deadline:
|
||||||
|
if self.has_root():
|
||||||
|
return True
|
||||||
|
time.sleep(2)
|
||||||
|
return False
|
||||||
|
|
||||||
def exec_shell(self, command, check=True, capture_output=False, root=False):
|
def exec_shell(self, command, check=True, capture_output=False, root=False):
|
||||||
if self.mode == "container":
|
if self.mode == "container":
|
||||||
return run(
|
return run(
|
||||||
@@ -72,12 +99,20 @@ class Backend:
|
|||||||
capture_output=capture_output,
|
capture_output=capture_output,
|
||||||
)
|
)
|
||||||
if root and self.has_root():
|
if root and self.has_root():
|
||||||
return adb(
|
last_result = None
|
||||||
|
for args in self._root_shell_args(command):
|
||||||
|
result = adb(
|
||||||
self.serial,
|
self.serial,
|
||||||
["shell", "su", "-mm", "-c", command],
|
args,
|
||||||
check=check,
|
check=False,
|
||||||
capture_output=capture_output,
|
capture_output=capture_output,
|
||||||
)
|
)
|
||||||
|
last_result = result
|
||||||
|
if result.returncode == 0:
|
||||||
|
return result
|
||||||
|
if check and last_result is not None:
|
||||||
|
last_result.check_returncode()
|
||||||
|
return last_result
|
||||||
return adb(
|
return adb(
|
||||||
self.serial,
|
self.serial,
|
||||||
["shell", command],
|
["shell", command],
|
||||||
@@ -160,6 +195,8 @@ def shell_quote(value):
|
|||||||
def apply_device_profile(backend, profile):
|
def apply_device_profile(backend, profile):
|
||||||
if profile == "none":
|
if profile == "none":
|
||||||
return "skipped"
|
return "skipped"
|
||||||
|
if backend.mode == "adb" and not backend.has_root():
|
||||||
|
return "skipped (root unavailable)"
|
||||||
props = DEVICE_PROFILES[profile]
|
props = DEVICE_PROFILES[profile]
|
||||||
resetprop = backend.exec_shell(
|
resetprop = backend.exec_shell(
|
||||||
"if [ -x /debug_ramdisk/resetprop ]; then echo /debug_ramdisk/resetprop; "
|
"if [ -x /debug_ramdisk/resetprop ]; then echo /debug_ramdisk/resetprop; "
|
||||||
@@ -263,6 +300,12 @@ def main():
|
|||||||
default="none",
|
default="none",
|
||||||
help="Apply a runtime device profile through resetprop when available",
|
help="Apply a runtime device profile through resetprop when available",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--root-timeout",
|
||||||
|
type=int,
|
||||||
|
default=120,
|
||||||
|
help="Seconds to wait for Magisk root in ADB mode before root-only tweaks",
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--install-extreme-script",
|
"--install-extreme-script",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
@@ -278,14 +321,25 @@ def main():
|
|||||||
backend.connect()
|
backend.connect()
|
||||||
backend.wait_for_boot(args.timeout)
|
backend.wait_for_boot(args.timeout)
|
||||||
|
|
||||||
|
if backend.mode == "adb" and (args.device_profile != "none" or args.install_extreme_script):
|
||||||
|
root_ready = backend.wait_for_root(min(args.root_timeout, args.timeout))
|
||||||
|
if not root_ready:
|
||||||
|
print("Root: unavailable after waiting; continuing without root-only tweaks")
|
||||||
|
|
||||||
put_setting(backend, "global", "device_provisioned", "1")
|
put_setting(backend, "global", "device_provisioned", "1")
|
||||||
put_setting(backend, "secure", "user_setup_complete", "1")
|
put_setting(backend, "secure", "user_setup_complete", "1")
|
||||||
put_setting(backend, "secure", "location_mode", "3")
|
put_setting(backend, "secure", "location_mode", "3")
|
||||||
put_setting(backend, "global", "package_verifier_enable", "0")
|
put_setting(backend, "global", "package_verifier_enable", "0")
|
||||||
put_setting(backend, "global", "verifier_verify_adb_installs", "0")
|
put_setting(backend, "global", "verifier_verify_adb_installs", "0")
|
||||||
|
|
||||||
try_shell(backend, "pm disable-user --user 0 com.android.setupwizard")
|
for package in ("com.android.setupwizard", "com.google.android.setupwizard"):
|
||||||
try_shell(backend, "pm disable-user --user 0 com.google.android.setupwizard")
|
packages = backend.exec_shell(
|
||||||
|
"pm list packages --user 0",
|
||||||
|
check=False,
|
||||||
|
capture_output=True,
|
||||||
|
).stdout
|
||||||
|
if package in packages:
|
||||||
|
try_shell(backend, "pm disable-user --user 0 {}".format(shell_quote(package)))
|
||||||
try_shell(backend, "appops set com.android.shell android:mock_location allow")
|
try_shell(backend, "appops set com.android.shell android:mock_location allow")
|
||||||
|
|
||||||
proxy_state = configure_proxy(backend, args.proxy_host, args.proxy_port)
|
proxy_state = configure_proxy(backend, args.proxy_host, args.proxy_port)
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ def build_layers(args):
|
|||||||
tags.append("houdini")
|
tags.append("houdini")
|
||||||
|
|
||||||
if args.magisk:
|
if args.magisk:
|
||||||
|
os.environ.setdefault("REDROID_MAGISK_BOOT_COMPLETE", "1")
|
||||||
Magisk().install()
|
Magisk().install()
|
||||||
dockerfile += "COPY magisk /\n"
|
dockerfile += "COPY magisk /\n"
|
||||||
tags.append("magisk")
|
tags.append("magisk")
|
||||||
|
|||||||
Reference in New Issue
Block a user