wrimg: add script to write partition images
* Can be used to write partition images to a storage device that has the correct partition structure after flashing an image created by mkimg.sh. * Poor man's alternative to fastboot flash boot boot.img fastboot flash system system.img fastboot flash vendor vendor.img fastboot erase userdata
This commit is contained in:
136
wrimg.sh
Executable file
136
wrimg.sh
Executable file
@@ -0,0 +1,136 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Copyright (C) 2025 KonstaKANG
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
exit_with_error() {
|
||||
echo $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
check_device() {
|
||||
for PARTITION in "1" "2" "3" "4"; do
|
||||
if [ ! -b /dev/${1}${PARTITION} ]; then
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
PARTITION1=$(lsblk -o LABEL,SIZE -b /dev/${1}1 | tail -n 1)
|
||||
PARTITION2=$(lsblk -o LABEL,SIZE -b /dev/${1}2 | tail -n 1)
|
||||
PARTITION3=$(lsblk -o LABEL,SIZE -b /dev/${1}3 | tail -n 1)
|
||||
PARTITION4=$(lsblk -o LABEL,SIZE -b /dev/${1}4 | tail -n 1)
|
||||
|
||||
if [ $(echo ${PARTITION1} | awk {'print $1'}) != "boot" ] || [ $(echo ${PARTITION1} | awk {'print $2'}) != "134217728" ]; then
|
||||
return 1
|
||||
fi
|
||||
if [ $(echo ${PARTITION2} | awk {'print $1'}) != "/" ] || [ $(echo ${PARTITION2} | awk {'print $2'}) != "2147483648" ]; then
|
||||
return 1
|
||||
fi
|
||||
if [ $(echo ${PARTITION3} | awk {'print $1'}) != "vendor" ] || [ $(echo ${PARTITION3} | awk {'print $2'}) != "268435456" ]; then
|
||||
return 1
|
||||
fi
|
||||
if [ $(echo ${PARTITION4} | awk {'print $1'}) != "userdata" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
DEVICE=${1}
|
||||
return 0
|
||||
}
|
||||
|
||||
find_device() {
|
||||
for SDX in "sda" "sdb" "sdc" "sdd"; do
|
||||
check_device ${SDX}
|
||||
if [ $? == "0" ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z ${DEVICE} ]; then
|
||||
exit_with_error "Unable to find suitable block device!"
|
||||
fi
|
||||
}
|
||||
|
||||
confirm() {
|
||||
echo "Build target ${1}..."
|
||||
if [ "${2}" == "wipe" ]; then
|
||||
echo "Wiping userdata partition..."
|
||||
else
|
||||
echo "Writing ${2} image..."
|
||||
fi
|
||||
echo "Writing to device /dev/${DEVICE}..."
|
||||
lsblk -o NAME,LABEL,SIZE /dev/${DEVICE}
|
||||
|
||||
read -p "Continue (y/n)? " -n 1 -r RESPONSE
|
||||
echo ""
|
||||
if [[ ! ${RESPONSE} =~ ^[Yy]$ ]]; then
|
||||
exit_with_error "Exiting!"
|
||||
fi
|
||||
}
|
||||
|
||||
write_partition() {
|
||||
if [ ! -f ${ANDROID_PRODUCT_OUT}/${1}.img ]; then
|
||||
exit_with_error "Partition image not found. Run 'make ${1}image' first."
|
||||
fi
|
||||
|
||||
echo "Copying ${1}..."
|
||||
sudo umount /dev/${DEVICE}${2}
|
||||
sudo dd if=${ANDROID_PRODUCT_OUT}/${1}.img of=/dev/${DEVICE}${2} bs=1M
|
||||
}
|
||||
|
||||
wipe_userdata() {
|
||||
echo "Creating userdata..."
|
||||
sudo umount /dev/${DEVICE}4
|
||||
sudo wipefs -a /dev/${DEVICE}4
|
||||
sudo mkfs.ext4 /dev/${DEVICE}4 -I 512 -L userdata
|
||||
}
|
||||
|
||||
finish() {
|
||||
sync
|
||||
echo "Done!"
|
||||
exit 0
|
||||
}
|
||||
|
||||
if [ -z ${TARGET_PRODUCT} ]; then
|
||||
exit_with_error "TARGET_PRODUCT environment variable is not set. Run lunch first."
|
||||
fi
|
||||
|
||||
if [ -z ${ANDROID_PRODUCT_OUT} ]; then
|
||||
exit_with_error "ANDROID_PRODUCT_OUT environment variable is not set. Run lunch first."
|
||||
fi
|
||||
|
||||
TARGET=$(echo ${TARGET_PRODUCT} | sed 's/^aosp_//')
|
||||
DEVICE=
|
||||
|
||||
if [ -z $1 ]; then
|
||||
find_device
|
||||
confirm ${TARGET} "boot, system, and vendor"
|
||||
write_partition boot 1
|
||||
write_partition system 2
|
||||
write_partition vendor 3
|
||||
finish
|
||||
elif [ ! -z $1 ] && [ $1 == "boot" ]; then
|
||||
find_device
|
||||
confirm ${TARGET} "boot"
|
||||
write_partition boot 1
|
||||
finish
|
||||
elif [ ! -z $1 ] && [ $1 == "system" ]; then
|
||||
find_device
|
||||
confirm ${TARGET} "system"
|
||||
write_partition system 2
|
||||
finish
|
||||
elif [ ! -z $1 ] && [ $1 == "vendor" ]; then
|
||||
find_device
|
||||
confirm ${TARGET} "vendor"
|
||||
write_partition vendor 3
|
||||
finish
|
||||
elif [ ! -z $1 ] && [ $1 == "wipe" ]; then
|
||||
find_device
|
||||
confirm ${TARGET} "wipe"
|
||||
wipe_userdata
|
||||
finish
|
||||
else
|
||||
exit_with_error "Usage: $0 [boot|system|vendor|wipe]"
|
||||
fi
|
Reference in New Issue
Block a user