├── .github └── FUNDING.yml ├── README.md ├── _tmp ├── init └── sbin │ ├── busybox │ ├── device-params │ └── init.sh ├── bin ├── magiskboot_arm └── magiskboot_x86 └── merger.sh /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [shubhamvis98] 2 | ko_fi: fossfrog 3 | liberapay: fossfrog 4 | buy_me_a_coffee: fossfrog 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ramdisk Merger 2 | ``` 3 | -,-,----------------------fossfrog's__ 4 | /_/_ _ _ _/. _/_ /|,/_ _ _ _ _ 5 | / \/_|/ / //_//_\/\ / //_'/ /_//_'/ 6 | _/ 7 | git: shubhamvis98/ramdisk-merger 8 | 9 | USAGE: merger.sh [OPTION] [FILE] 10 | -h|--help #Help 11 | -a|--android #Select Android boot image file 12 | -t|--twrp #Select TWRP image file 13 | ``` 14 | 15 | ## WARNING 16 | Take a backup of your existing boot/recovery images before flashing. 17 | This script only tested with Oneplus 3 and Poco F1 18 | 19 | -------------------------------------------------------------------------------- /_tmp/init: -------------------------------------------------------------------------------- 1 | sbin/init.sh -------------------------------------------------------------------------------- /_tmp/sbin/busybox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhamvis98/ramdisk-merger/910ba2ce710785ba8c23ae713d30ac44547331dc/_tmp/sbin/busybox -------------------------------------------------------------------------------- /_tmp/sbin/device-params: -------------------------------------------------------------------------------- 1 | #EVENT to capture keyinputs while booting 2 | #LED for indicator to know when to press the key 3 | 4 | EVENT="/dev/input/event3" 5 | EVENT_NODE="/dev/input/event3 c 13 67" 6 | LED="/sys/class/leds/white/brightness" 7 | -------------------------------------------------------------------------------- /_tmp/sbin/init.sh: -------------------------------------------------------------------------------- 1 | #!/sbin/busybox sh 2 | 3 | _PATH="$PATH" 4 | export PATH=/sbin 5 | 6 | busybox cd / 7 | busybox rm /init 8 | 9 | source /sbin/device-params 10 | 11 | blink() 12 | { 13 | for i in `busybox seq $1` 14 | do 15 | busybox echo 255 > $LED 16 | busybox sleep 0.08 17 | busybox echo 0 > $LED 18 | busybox sleep 0.08 19 | done 20 | } 21 | 22 | busybox mkdir -m 755 -p /dev/block 23 | busybox mkdir -m 755 -p /dev/input 24 | busybox mkdir -m 555 -p /proc 25 | busybox mkdir -m 755 -p /sys 26 | 27 | # create device nodes 28 | busybox mknod -m 600 $EVENT_NODE 29 | busybox mknod -m 666 /dev/null c 1 3 30 | 31 | # mount filesystems 32 | busybox mount -t proc proc /proc 33 | busybox mount -t sysfs sysfs /sys 34 | 35 | # trigger LED 36 | busybox echo 255 > ${LED} 37 | 38 | # keycheck 39 | busybox cat $EVENT > /dev/keycheck & 40 | busybox sleep 3 41 | 42 | # android ramdisk 43 | load_image=/sbin/android.cpio 44 | 45 | # boot decision 46 | if [ -s /dev/keycheck ] 47 | then 48 | blink 5 49 | load_image=/sbin/twrp.cpio 50 | fi 51 | 52 | # poweroff LED 53 | busybox echo 0 > ${LED} 54 | 55 | # kill the keycheck process 56 | busybox pkill -f "busybox cat ${EVENT}" 57 | 58 | # unpack the ramdisk image 59 | busybox cpio -i < ${load_image} 60 | 61 | busybox umount /proc 62 | busybox umount /sys 63 | 64 | busybox rm -fr /dev/* 65 | export PATH="${_PATH}" 66 | exec /init 67 | 68 | -------------------------------------------------------------------------------- /bin/magiskboot_arm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhamvis98/ramdisk-merger/910ba2ce710785ba8c23ae713d30ac44547331dc/bin/magiskboot_arm -------------------------------------------------------------------------------- /bin/magiskboot_x86: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shubhamvis98/ramdisk-merger/910ba2ce710785ba8c23ae713d30ac44547331dc/bin/magiskboot_x86 -------------------------------------------------------------------------------- /merger.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | banner() 6 | { 7 | clear 8 | cat <<'EOF' 9 | -,-,----------------------fossfrog's__ 10 | /_/_ _ _ _/. _/_ /|,/_ _ _ _ _ 11 | / \/_|/ / //_//_\/\ / //_'/ /_//_'/ 12 | _/ 13 | git: shubhamvis98/ramdisk-merger 14 | 15 | EOF 16 | } 17 | 18 | gethelp() 19 | { 20 | banner 21 | echo "USAGE: $(basename $0) [OPTION] [FILE]" 22 | echo -e " -h|--help\t#Help" 23 | echo -e " -a|--android\t#Select Android boot image file" 24 | echo -e " -t|--twrp\t#Select TWRP image file" 25 | } 26 | 27 | msg() 28 | { 29 | echo 30 | echo "[+]$@" 31 | } 32 | 33 | chkarch() 34 | { 35 | arch=$(uname -m) 36 | 37 | if [[ "$arch" == "arm" || "$arch" == "aarch64" ]]; then 38 | MAGISKBOOT=`pwd`/bin/magiskboot_arm 39 | elif [[ "$arch" == "x86_64" ]]; then 40 | MAGISKBOOT=`pwd`/bin/magiskboot_x86 41 | else 42 | echo "[!]Unknown architecture" 43 | exit 44 | fi 45 | } 46 | 47 | banner 48 | chkarch 49 | 50 | OPTARG=$(getopt -o :ha:t: -l help,android:,twrp: -- "$@") 51 | if [ "$?" != "0" ]; then 52 | gethelp 53 | exit 54 | fi 55 | 56 | eval set -- $OPTARG 57 | 58 | while true 59 | do 60 | case "$1" in 61 | -h|--help) 62 | gethelp 63 | exit;; 64 | -a|--android) 65 | ANDBOOT="$2" 66 | shift 2;; 67 | -t|--twrp) 68 | TWRPBOOT="$2" 69 | shift 2;; 70 | *) 71 | break;; 72 | esac 73 | done 74 | 75 | if [ ! -e "$ANDBOOT" ] || [ ! -e "$TWRPBOOT" ] 76 | then 77 | echo "[!]Invalid Input" 78 | exit 1 79 | fi 80 | 81 | WORKDIR=`pwd` 82 | ANDTMP=$WORKDIR/andtmp 83 | TWRPTMP=$WORKDIR/twrptmp 84 | BB=$WORKDIR/_tmp 85 | 86 | cleanup() 87 | { 88 | rm -rf $BB/sbin/*.cpio $ANDTMP $TWRPTMP 89 | rm -rf $TWRPTMP $ANDTMP 90 | } 91 | 92 | msg "Removing old tmp files" 93 | cleanup 94 | 95 | echo -n "[?]Press return to edit device-specific details: "; read _null 96 | nano $BB/sbin/device-params 97 | 98 | mkdir $ANDTMP $TWRPTMP 99 | cp $ANDBOOT $ANDTMP 100 | cp $TWRPBOOT $TWRPTMP 101 | 102 | msg "Unpacking $ANDBOOT" 103 | cd $ANDTMP; $MAGISKBOOT unpack -h $ANDBOOT 104 | mv ramdisk.cpio $BB/sbin/android.cpio 105 | 106 | msg "Unpacking $TWRPBOOT" 107 | cd $TWRPTMP; $MAGISKBOOT unpack -h $TWRPBOOT 108 | 109 | ANDVER=`tail -n2 $ANDTMP/header | head -n1 | cut -d '=' -f2` 110 | ANDLVL=`tail -n1 $ANDTMP/header | cut -d '=' -f2` 111 | TWRPVER=`tail -n2 $TWRPTMP/header | head -n1 | cut -d '=' -f2` 112 | TWRPLVL=`tail -n1 $TWRPTMP/header | cut -d '=' -f2` 113 | 114 | rm header kernel* $TWRPBOOT 115 | 116 | msg "Extracting ${TWRPBOOT}'s ramdisk" 117 | cpio -i < ramdisk.cpio 118 | rm ramdisk.cpio 119 | 120 | msg "Patching ramdisk" 121 | sed -i "s/$TWRPVER/$ANDVER/g;s/$TWRPLVL/$ANDLVL/g" prop.default 122 | 123 | msg "Compressing ramdisk" 124 | find . | cpio -H newc -o > $BB/sbin/twrp.cpio 125 | cd $BB; find . | cpio -H newc -o > $ANDTMP/ramdisk.cpio 126 | 127 | msg "Repacking merged boot image" 128 | cd $ANDTMP; $MAGISKBOOT repack $ANDBOOT 129 | mv new-boot.img $WORKDIR/ 130 | 131 | msg "Boot image placed here: $WORKDIR/new-boot.img" 132 | 133 | cleanup 134 | --------------------------------------------------------------------------------