1#!/bin/bash 2 3OLD_IMG=$1 4NEW_IMG=$2 5DIFF_IMG=$3 6 7if [ x$OLD_IMG = x"" -o x$NEW_IMG = x"" -o x$DIFF_IMG = x"" ]; then 8 echo "Usage: $0 [old_img] [new_img] [diff_img]" 9 exit 1 10fi 11 12echo "To differ image from OLD: $1 and NEW: $2" 13 14echo_red() 15{ 16 echo -e "\033[31m$1\033[0m" 17} 18 19DIR=$(cd $(dirname $0); pwd) 20export PATH=$PATH:"$DIR" 21 22check_tool() 23{ 24 which "$1" &> /dev/null 25 if [ $? -ne 0 ]; then 26 echo "command: $1 not found!" 27 exit 1; 28 fi 29} 30 31get_fs_type() 32{ 33 file_info=$(file -b $1) 34 if [[ "$file_info" == *"Squashfs"* ]]; then 35 echo -n Squashfs 36 elif [[ "$file_info" == *"ext4"* ]]; then 37 echo -n ext4 38 else 39 echo -n unsupported 40 fi 41} 42 43check_tool bsdiff 44check_tool rkImageMaker 45check_tool afptool 46check_tool md5sum 47 48OLD_DIR=$(mktemp -d --suffix=-OLD -p ${DIR}) 49NEW_DIR=$(mktemp -d --suffix=-NEW -p ${DIR}) 50DIFF_DIR=$(mktemp -d --suffix=-DIFF -p ${DIR}) 51 52cleanup() 53{ 54 echo -e "\033[41;33m $1 \033[0m" 55 exit 1 56} 57 58# 59get_chip_from_parameter() 60{ 61 parameter=$1 62 63 chip=$(eval echo $(grep -h "MACHINE_MODEL" $parameter | cut -f2 -d':' | tr 'a-z' 'A-Z')) 64 case $chip in 65 PX30 | RK3358) 66 echo -n -RKPX30 67 ;; 68 RK1808 | RK3399PRO_NPU) 69 echo -n -RK180A 70 ;; 71 RK3036) 72 echo -n -RK303A 73 ;; 74 RK3126 | RK3128) 75 echo -n -RK312A 76 ;; 77 RK3128H) 78 echo -n -RK312X 79 ;; 80 RK3229) 81 echo -n -RK3229 82 ;; 83 RK3288) 84 echo -n -RK320A 85 ;; 86 RK3308) 87 echo -n -RK3308 88 ;; 89 RK3326) 90 echo -n -RK3326 91 ;; 92 RK3328) 93 echo -n -RK322H 94 ;; 95 RK3399) 96 echo -n -RK330C 97 ;; 98 RK3568) 99 echo -n -RK3568 100 ;; 101 RK3566) 102 echo -n -RK3568 103 ;; 104 RK3562) 105 echo -n -RK3562 106 ;; 107 RK3588) 108 echo -n -RK3588 109 ;; 110 RV1126) 111 echo -n -RK1126 112 ;; 113 *) 114 cleanup "Bad MACHINE_MODEL: $chip in parameter.txt" 115 esac 116} 117 118# diff_img <name> <old_file> <new_file> <diff_file> 119diff_img() 120{ 121 name=$1 122 diff=$4 123 old=$2 124 new=$3 125 old_size=$(stat --printf=%s $old) 126 new_size=$(stat --printf=%s $new) 127 md5sum=$(md5sum $new | cut -f 1 -d ' ') 128 129 echo_red "Diff ${NAME}..." 130 sec_1=$(date +%s) 131 bsdiff "$old" "$new" "${diff}" || cleanup "bsdiff $new: $?" 132 sec_2=$(date +%s) 133 # MAGIC HEADER 80 bytes 134 printf "DIFF:%-15s:%-12s:%-12s:%-32s:" $name $old_size $new_size $md5sum >> "${diff}" 135 echo_red "Diff ${NAME} use $((($sec_2 - $sec_1)/3600))h:$((($sec_2 - $sec_1)%3600/60))m:$((($sec_2 - $sec_1)%60))s" 136} 137 138echo "Unpacking old image: ${OLD_IMG}" 139rkImageMaker -unpack ${OLD_IMG} ${OLD_DIR} || cleanup "rkImageMaker unpack: $?" 140afptool -unpack ${OLD_DIR}/firmware.img ${OLD_DIR} || cleanup "afptool unpack: $?" 141 142echo "Unpacking new image: ${NEW_IMG}" 143rkImageMaker -unpack ${NEW_IMG} ${NEW_DIR} || cleanup "rkImageMaker unpack: $?" 144afptool -unpack ${NEW_DIR}/firmware.img ${NEW_DIR} || cleanup "afptool unpack: $?" 145 146# TODO: a/b image is not yet supported, warning 147 148mkdir ${DIFF_DIR}/Image 149 150# Copy parameter/loader to target dir 151cp ${NEW_DIR}/package-file ${DIFF_DIR}/ 152cp ${NEW_DIR}/MiniLoaderAll.bin ${DIFF_DIR}/ 153cp ${NEW_DIR}/MiniLoaderAll.bin ${DIFF_DIR}/Image 154cp ${NEW_DIR}/parameter.txt ${DIFF_DIR}/ 155cp ${NEW_DIR}/parameter.txt ${DIFF_DIR}/Image 156 157while read LINE; do 158 # delete any blank at beginning or "#" line 159 STRIP=$(eval echo "$LINE") 160 if [[ $STRIP = "" ]]; then 161 continue 162 fi 163 164 # get the paratition name by deleting the chars after [[:blank:]] 165 NAME=${STRIP/%[[:blank:]]*/} 166 IMG=${STRIP/#*[[:blank:]]/} 167 168 if [[ $NAME = "backup" ]]; then 169 echo_red "Skip backup, it's not a real image" 170 continue 171 fi 172 173 if [ $NAME = "package-file" -o $NAME = "parameter" -o $NAME = "bootloader" ]; then 174 echo_red "Copy ${IMG}" 175 # Already copied 176 continue 177 fi 178 179 if [ ! -f ${OLD_DIR}/${IMG} ]; then 180 echo_red "Copy ${IMG}, there's not corresponding old file" 181 ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 182 continue 183 fi 184 185 case ${NAME} in 186 uboot | trust | boot) 187 diff_img $NAME ${OLD_DIR}/${IMG} ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 188 ;; 189 rootfs) 190 fs_new=$(get_fs_type ${NEW_DIR}/${IMG}) 191 fs_old=$(get_fs_type ${OLD_DIR}/${IMG}) 192 193 if [ $fs_new != $fs_old ]; then 194 echo_red "Copy ${IMG}, root fs type are different: $fs_old vs $fs_new" 195 ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 196 elif [ $fs_new != "Squashfs" ]; then 197 echo_red "Copy ${IMG}, $fs_new not supported" 198 ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 199 else 200 diff_img $NAME ${OLD_DIR}/${IMG} ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 201 fi 202 ;; 203 *) 204 echo_red "Copy ${IMG}" 205 ln -s ${NEW_DIR}/${IMG} ${DIFF_DIR}/${IMG} 206 ;; 207 esac 208done < ${NEW_DIR}/package-file 209 210afptool -pack ${DIFF_DIR} ${DIFF_DIR}/Image/update.img || cleanup "afptool pack: $?" 211rkImageMaker $(get_chip_from_parameter ${DIFF_DIR}/parameter.txt) \ 212 ${DIFF_DIR}/Image/MiniLoaderAll.bin \ 213 ${DIFF_DIR}/Image/update.img \ 214 ${DIFF_IMG} -os_type:androidos || cleanup "rkImageMaker pack: $?" 215 216#rm -rf ${DIFF_DIR} ${NEW_DIR} ${OLD_DIR} 217 218echo_red "Make diff ${DIFF_IMG} Finished" 219