Fuse busybox into update-binary and remove from Magisk Manager APK

This commit is contained in:
topjohnwu 2017-08-02 02:21:50 +08:00
parent 5fab15fee5
commit b37bad35c2
8 changed files with 105 additions and 80 deletions

@ -1 +1 @@
Subproject commit 3550d1e61cba0cf482e1d3cf8e92b0f74aae38f9
Subproject commit 8195a4d6161dd16d67ece6e643670ae9d3118cdb

101
build.py
View File

@ -35,6 +35,8 @@ import zipfile
import datetime
import errno
import shutil
import gzip
import base64
def silentremove(file):
try:
@ -58,11 +60,8 @@ def build_all(args):
def build_binary(args):
header('* Building Magisk binaries')
# Force update Android.mk footprint to trigger recompilation
with open(os.path.join('jni', 'Android.mk'), 'r') as makefile:
content = makefile.read()
with open(os.path.join('jni', 'Android.mk'), 'w') as makefile:
makefile.write(content)
# Force update Android.mk timestamp to trigger recompilation
os.utime(os.path.join('jni', 'Android.mk'))
ndk_build = os.path.join(os.environ['ANDROID_HOME'], 'ndk-bundle', 'ndk-build')
debug_flag = '' if args.release else '-DMAGISK_DEBUG'
@ -74,17 +73,6 @@ def build_binary(args):
def build_apk(args):
header('* Building Magisk Manager')
for arch in ['armeabi-v7a', 'x86']:
source = os.path.join('libs', arch, 'busybox')
target = os.path.join('MagiskManager', 'app', 'src', 'main', 'jniLibs', arch)
if not os.path.exists(source):
error('{} does not exist! Please build \'binary\' before building apk'.format(source))
if not os.path.exists(target):
os.makedirs(target)
target = os.path.join(target, 'libbusybox.so')
print('cp: {} -> {}'.format(source, target))
shutil.copyfile(source, target)
for key in ['public.certificate.x509.pem', 'private.key.pk8']:
source = os.path.join('ziptools', key)
target = os.path.join('MagiskManager', 'app', 'src', 'main', 'assets', key)
@ -174,11 +162,40 @@ def sign_adjust_zip(unsigned, output):
silentremove('tmp_signed.zip')
silentremove('tmp_adjusted.zip')
def gen_update_binary():
update_bin = []
bb = os.path.join('libs', 'armeabi-v7a', 'busybox')
if not os.path.exists(bb):
error('{} does not exist! Please build \'binary\' before zipping!'.format(bb))
with open(bb, 'rb') as busybox:
update_bin.append('#! /sbin/sh\nBB_ARM=')
update_bin.append(base64.b64encode(gzip.compress(busybox.read())).decode('ascii'))
bb = os.path.join('libs', 'x86', 'busybox')
if not os.path.exists(bb):
error('{} does not exist! Please build \'binary\' before zipping!'.format(bb))
with open(bb, 'rb') as busybox:
update_bin.append('\nBB_X86=')
update_bin.append(base64.b64encode(gzip.compress(busybox.read())).decode('ascii'))
update_bin.append('\n')
with open(os.path.join('scripts', 'update_binary.sh'), 'r') as script:
update_bin.append(script.read())
return ''.join(update_bin)
def zip_main(args):
header('* Packing Flashable Zip')
with zipfile.ZipFile('tmp_unsigned.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zipf:
# Compiled Binaries
with zipfile.ZipFile('tmp_unsigned.zip', 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=False) as zipf:
# META-INF
# update-binary
target = os.path.join('META-INF', 'com', 'google', 'android', 'update-binary')
print('zip: ' + target)
zipf.writestr(target, gen_update_binary())
# updater-script
source = os.path.join('scripts', 'flash_script.sh')
target = os.path.join('META-INF', 'com', 'google', 'android', 'updater-script')
zip_with_msg(zipf, source, target)
# Binaries
for lib_dir, zip_dir in [('arm64-v8a', 'arm64'), ('armeabi-v7a', 'arm'), ('x86', 'x86'), ('x86_64', 'x64')]:
for binary in ['magisk', 'magiskboot']:
source = os.path.join('libs', lib_dir, binary)
@ -192,22 +209,6 @@ def zip_main(args):
zip_with_msg(zipf, source, target)
# Scripts
# flash_script.sh
source = os.path.join('scripts', 'flash_script.sh')
target = os.path.join('META-INF', 'com', 'google', 'android', 'update-binary')
zip_with_msg(zipf, source, target)
# addon.d.sh
source = os.path.join('scripts', 'addon.d.sh')
target = os.path.join('addon.d', '99-magisk.sh')
zip_with_msg(zipf, source, target)
# updater-script
target = os.path.join('META-INF', 'com', 'google', 'android', 'updater-script')
print('zip: ' + target)
zipf.writestr(target, '#MAGISK\n')
# init.magisk.rc
source = os.path.join('scripts', 'init.magisk.rc')
target = os.path.join('common', 'init.magisk.rc')
zip_with_msg(zipf, source, target)
# boot_patch.sh
source = os.path.join('scripts', 'boot_patch.sh')
target = os.path.join('common', 'boot_patch.sh')
@ -221,6 +222,15 @@ def zip_main(args):
target = os.path.join('common', 'util_functions.sh')
print('zip: ' + source + ' -> ' + target)
zipf.writestr(target, util_func)
# addon.d.sh
source = os.path.join('scripts', 'addon.d.sh')
target = os.path.join('addon.d', '99-magisk.sh')
zip_with_msg(zipf, source, target)
# init.magisk.rc
source = os.path.join('scripts', 'init.magisk.rc')
target = os.path.join('common', 'init.magisk.rc')
zip_with_msg(zipf, source, target)
# Prebuilts
for chromeos in ['futility', 'kernel_data_key.vbprivk', 'kernel.keyblock']:
source = os.path.join('chromeos', chromeos)
@ -234,8 +244,18 @@ def zip_main(args):
def zip_uninstaller(args):
header('* Packing Uninstaller Zip')
with zipfile.ZipFile('tmp_unsigned.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zipf:
# Compiled Binaries
with zipfile.ZipFile('tmp_unsigned.zip', 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=False) as zipf:
# META-INF
# update-binary
target = os.path.join('META-INF', 'com', 'google', 'android', 'update-binary')
print('zip: ' + target)
zipf.writestr(target, gen_update_binary())
# updater-script
source = os.path.join('scripts', 'uninstaller_loader.sh')
target = os.path.join('META-INF', 'com', 'google', 'android', 'updater-script')
zip_with_msg(zipf, source, target)
# Binaries
for lib_dir, zip_dir in [('arm64-v8a', 'arm64'), ('armeabi-v7a', 'arm'), ('x86', 'x86'), ('x86_64', 'x64')]:
source = os.path.join('libs', lib_dir, 'magiskboot')
target = os.path.join(zip_dir, 'magiskboot')
@ -245,6 +265,7 @@ def zip_uninstaller(args):
target = 'magisk_uninstaller.sh'
zip_with_msg(zipf, source, target)
# Scripts
# util_functions.sh
source = os.path.join('scripts', 'util_functions.sh')
with open(source, 'r') as script:
@ -255,14 +276,6 @@ def zip_uninstaller(args):
print('zip: ' + source + ' -> ' + target)
zipf.writestr(target, util_func)
source = os.path.join('scripts', 'uninstaller_loader.sh')
target = os.path.join('META-INF', 'com', 'google', 'android', 'update-binary')
zip_with_msg(zipf, source, target)
target = os.path.join('META-INF', 'com', 'google', 'android', 'updater-script')
print('zip: ' + target)
zipf.writestr(target, '#MAGISK\n')
# Prebuilts
for chromeos in ['futility', 'kernel_data_key.vbprivk', 'kernel.keyblock']:
source = os.path.join('chromeos', chromeos)

View File

@ -502,13 +502,6 @@ void post_fs_data(int client) {
LOGI("** post-fs-data mode running\n");
// uninstaller
if (access(UNINSTALLER, F_OK) == 0) {
close(open(UNBLOCKFILE, O_RDONLY | O_CREAT));
system("(BOOTMODE=true sh " UNINSTALLER ") &");
return;
}
// Allocate buffer
if (buf == NULL) buf = xmalloc(PATH_MAX);
if (buf2 == NULL) buf2 = xmalloc(PATH_MAX);
@ -538,6 +531,17 @@ void post_fs_data(int client) {
goto unblock;
}
// Link busybox
link_busybox();
// uninstaller
if (access(UNINSTALLER, F_OK) == 0) {
close(open(UNBLOCKFILE, O_RDONLY | O_CREAT));
bb_path();
system("(BOOTMODE=true sh " UNINSTALLER ") &");
return;
}
int new_img = 0;
if (access(MAINIMG, F_OK) == -1) {
@ -559,9 +563,6 @@ void post_fs_data(int client) {
xmkdir(COREDIR "/props", 0755);
}
// Link busybox
link_busybox();
// Core only mode
if (access(DISABLEFILE, F_OK) == 0)
goto core_only;

View File

@ -1,4 +1,4 @@
#!/sbin/sh
#MAGISK
##########################################################################################
#
# Magisk Flash Script
@ -31,10 +31,6 @@ umask 022
OUTFD=$2
ZIP=$3
rm -rf $TMPDIR 2>/dev/null
mkdir -p $INSTALLER
unzip -o "$ZIP" -d $INSTALLER 2>/dev/null
if [ ! -d "$COMMONDIR" ]; then
echo "! Unable to extract zip file!"
exit 1
@ -92,16 +88,14 @@ rm -rf $MAGISKBIN 2>/dev/null
mkdir -p $MAGISKBIN
cp -af $BINDIR/. $COMMONDIR/. $MAGISKBIN
cp -af $CHROMEDIR $MAGISKBIN
# Extract busybox
[ $ARCH = "arm" -o $ARCH = "arm64" ] && BBPATH=lib/armeabi-v7a || BBPATH=lib/x86
unzip -p $INSTALLER/common/magisk.apk $BBPATH/libbusybox.so > $MAGISKBIN/busybox
cp -af $TMPDIR/bin/busybox $MAGISKBIN/busybox
chmod -R 755 $MAGISKBIN
# addon.d
if [ -d /system/addon.d ]; then
ui_print "- Adding addon.d survival script"
mount -o rw,remount /system
cp $INSTALLER/addon.d/99-magisk.sh /system/addon.d/99-magisk.sh
cp -af $INSTALLER/addon.d/99-magisk.sh /system/addon.d/99-magisk.sh
chmod 755 /system/addon.d/99-magisk.sh
fi

View File

@ -39,11 +39,6 @@ abort_wrap() {
fi
}
if [ ! -d $MAGISKBIN -o ! -f $MAGISKBIN/magiskboot -o ! -f $MAGISKBIN/util_functions.sh ]; then
ui_print_wrap "! Cannot find $MAGISKBIN"
exit 1
fi
[ -z $BOOTMODE ] && BOOTMODE=false
MAGISKBIN=/data/magisk
@ -52,6 +47,11 @@ CHROMEDIR=$MAGISKBIN/chromeos
# Default permissions
umask 022
if [ ! -f $MAGISKBIN/magiskboot -o ! -f $MAGISKBIN/util_functions.sh ]; then
ui_print_wrap "! Cannot find $MAGISKBIN"
exit 1
fi
# Load utility functions
. $MAGISKBIN/util_functions.sh

View File

@ -3,7 +3,7 @@
#
# Magisk Uninstaller (used in recovery)
# by topjohnwu
#
#
# This script will load the real uninstaller in a flashable zip
#
##########################################################################################
@ -13,17 +13,16 @@
##########################################################################################
BOOTMODE=false
INSTALLER=/tmp/uninstall
# This path should work in any cases
TMPDIR=/dev/tmp
INSTALLER=$TMPDIR/install
# Default permissions
umask 022
OUTFD=$2
ZIP=$3
rm -rf $INSTALLER 2>/dev/null
mkdir -p $INSTALLER
unzip -o "$ZIP" -d $INSTALLER 2>/dev/null
if [ ! -f $INSTALLER/util_functions.sh ]; then
echo "! Failed: Unable to extract zip file!"
exit 1
@ -68,6 +67,7 @@ if is_mounted /data; then
mkdir -p $MAGISKBIN
cp -af $BINDIR/. $MAGISKBIN
cp -af $CHROMEDIR $MAGISKBIN
cp -af $TMPDIR/bin/busybox $MAGISKBIN/busybox
cp -af $INSTALLER/util_functions.sh $MAGISKBIN
chmod -R 755 $MAGISKBIN
# Run the acttual uninstallation

15
scripts/update_binary.sh Normal file
View File

@ -0,0 +1,15 @@
# BB_ARM and BB_X86 should be generated in build.py
TMPDIR=/dev/tmp
INSTALLER=$TMPDIR/install
BBDIR=$TMPDIR/bin
BBBIN=$BBDIR/busybox
rm -rf $TMPDIR 2>/dev/null; mkdir -p $BBDIR; touch $BBBIN; chmod 755 $BBBIN
echo $BB_ARM | base64 -d | gzip -d > $BBBIN
if ! $BBBIN --install -s $TMPDIR/bin >/dev/null 2>&1; then
echo $BB_X86 | base64 -d | gzip -d > $BBBIN
$BBBIN --install -s $TMPDIR/bin >/dev/null 2>&1 || exit 1
fi
export PATH=$BBDIR:$PATH
mkdir -p $INSTALLER
unzip -o "$3" -d $INSTALLER
exec sh $INSTALLER/META-INF/com/google/android/updater-script $@

View File

@ -127,11 +127,13 @@ recovery_actions() {
# Preserve environment varibles
OLD_PATH=$PATH
OLD_LD_PATH=$LD_LIBRARY_PATH
# Add busybox to PATH
mkdir -p $TMPDIR/bin
ln -s $MAGISKBIN/busybox $TMPDIR/bin/busybox
$MAGISKBIN/busybox --install -s $TMPDIR/bin
export PATH=$TMPDIR/bin:$PATH
if [ ! -d $TMPDIR/bin ]; then
# Add busybox to PATH
mkdir -p $TMPDIR/bin
ln -s $MAGISKBIN/busybox $TMPDIR/bin/busybox
$MAGISKBIN/busybox --install -s $TMPDIR/bin
export PATH=$TMPDIR/bin:$PATH
fi
# Temporarily block out all custom recovery binaries/libs
mv /sbin /sbin_tmp
# Add all possible library paths