2
0
mirror of https://github.com/topjohnwu/Magisk synced 2025-08-31 23:43:46 +00:00

Introduce zygisk loader

Use a separate library for 1st stage
This commit is contained in:
topjohnwu
2022-08-19 04:49:19 -07:00
parent 6bfe34e5a8
commit 9806b38d8e
11 changed files with 113 additions and 97 deletions

View File

@@ -203,16 +203,6 @@ def clean_elf():
execv(args)
def binary_dump(src, var_name):
out_str = f'constexpr unsigned char {var_name}[] = {{'
for i, c in enumerate(xz(src.read())):
if i % 16 == 0:
out_str += '\n'
out_str += f'0x{c:02X},'
out_str += '\n};\n'
return out_str
def run_ndk_build(flags):
os.chdir('native')
flags = 'NDK_PROJECT_PATH=. NDK_APPLICATION_MK=src/Application.mk ' + flags
@@ -221,7 +211,7 @@ def run_ndk_build(flags):
error('Build binary failed!')
os.chdir('..')
for arch in archs:
for tgt in support_targets + ['libpreload.so']:
for tgt in support_targets + ['libinit-ld.so', 'libzygisk-ld.so']:
source = op.join('native', 'libs', arch, tgt)
target = op.join('native', 'out', arch, tgt)
mv(source, target)
@@ -306,6 +296,16 @@ def write_if_diff(file_name, text):
f.write(text)
def binary_dump(src, var_name, compressor=xz):
out_str = f'constexpr unsigned char {var_name}[] = {{'
for i, c in enumerate(compressor(src.read())):
if i % 16 == 0:
out_str += '\n'
out_str += f'0x{c:02X},'
out_str += '\n};\n'
return out_str
def dump_bin_header(args):
stub = op.join(config['outdir'], f'stub-{"release" if args.release else "debug"}.apk')
if not op.exists(stub):
@@ -315,10 +315,13 @@ def dump_bin_header(args):
text = binary_dump(src, 'manager_xz')
write_if_diff(op.join(native_gen_path, 'binaries.h'), text)
for arch in archs:
preload = op.join('native', 'out', arch, 'libpreload.so')
preload = op.join('native', 'out', arch, 'libinit-ld.so')
with open(preload, 'rb') as src:
text = binary_dump(src, 'preload_xz')
write_if_diff(op.join(native_gen_path, f'{arch}_binaries.h'), text)
text = binary_dump(src, 'init_ld_xz')
preload = op.join('native', 'out', arch, 'libzygisk-ld.so')
with open(preload, 'rb') as src:
text += binary_dump(src, 'zygisk_ld', compressor=lambda x: x)
write_if_diff(op.join(native_gen_path, f'{arch}_binaries.h'), text)
def dump_flag_header():
@@ -363,8 +366,8 @@ def build_binary(args):
flag = ''
if 'magisk' in args.target:
flag += ' B_MAGISK=1'
if 'magisk' in args.target or 'magiskinit' in args.target:
flag += ' B_PRELOAD=1'
if 'magiskpolicy' in args.target:
flag += ' B_POLICY=1'
@@ -383,13 +386,23 @@ def build_binary(args):
if flag:
run_ndk_build(flag)
clean_elf()
# magiskinit and busybox has to be built separately
# magiskinit and magisk embeds preload.so
flag = ''
if 'magisk' in args.target:
flag += ' B_MAGISK=1'
if 'magiskinit' in args.target:
flag += ' B_INIT=1'
if flag:
dump_bin_header(args)
run_ndk_build('B_INIT=1')
run_ndk_build(flag)
clean_elf()
# BusyBox is built with different libc
if 'busybox' in args.target:
run_ndk_build('B_BB=1')