Pull in raspberry-vanilla's AOSP17 device tree changes for rpi5 while keeping all PawletOS customizations (A/B partition layout, sepolicy, zram, TWRP recovery scaffolding, ALSA HDMI pre-warm, product/overlay structure) intact on top. Upstream changes absorbed: - AOSP17 audio HAL refactor (StreamAlsa split into StreamAlsaBase/ StreamAlsaMonoPipe, Utils.cpp -> UtilsAlsa.cpp, new Bluetooth/stub helper classes, libeffects AIDL rebuild via *_ndk_shared defaults) - API level 36 -> 37, FCM matrix level 202504 -> 202604 - QuickSettings tile default split (SystemUIRpiOverlay, ported into pawlet_rpi_common where this overlay now lives) - vendor_tracing_descriptors added to enforce-product-packages-exist - misc AOSP17 logging header switch (android-base/logging.h -> Log.h) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
153 lines
6.1 KiB
Bash
Executable File
153 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#
|
|
# Copyright (C) 2021-2022 KonstaKANG
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
exit_with_error() {
|
|
echo $@
|
|
exit 1
|
|
}
|
|
|
|
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
|
|
|
|
for PARTITION in "boot" "system" "system_ext" "vendor"; do
|
|
if [ ! -f ${ANDROID_PRODUCT_OUT}/${PARTITION}.img ]; then
|
|
exit_with_error "Partition image not found. Run 'make ${PARTITION}image' first."
|
|
fi
|
|
done
|
|
|
|
VERSION=RaspberryVanillaAOSP17
|
|
DATE=$(date +%Y%m%d)
|
|
TARGET=$(echo ${TARGET_PRODUCT} | sed 's/^aosp_//')
|
|
IMGNAME=${VERSION}-${DATE}-${TARGET}.img
|
|
|
|
# Partition layout (A/B slots):
|
|
# p1: boot_a FAT32 128MB — active boot slot (kernel + ramdisk + dtb)
|
|
# p2: boot_b FAT32 128MB — inactive boot slot (copy of boot_a initially)
|
|
# p3: recovery FAT32 128MB — TWRP recovery
|
|
# p4: misc raw 4MB — A/B slot tracking (written by system app / boot control)
|
|
# p5: system ext4 8GB
|
|
# p6: system_ext ext4 4GB
|
|
# p7: vendor ext4 2GB
|
|
# p8: metadata ext4 64MB
|
|
# p9: userdata ext4 128MB
|
|
BOOT_A_SIZE=134217728 # 128MB
|
|
BOOT_B_SIZE=134217728 # 128MB
|
|
RECOVERY_SIZE=134217728 # 128MB
|
|
MISC_SIZE=4194304 # 4MB
|
|
SYSTEM_SIZE=8589934592 # 8GB
|
|
SYSTEM_EXT_SIZE=4294967296 # 4GB
|
|
VENDOR_SIZE=2147483648 # 2GB
|
|
METADATA_SIZE=67108864 # 64MB
|
|
USERDATA_SIZE=134217728 # 128MB
|
|
|
|
# 32MB GPT overhead + alignment
|
|
TOTAL_SIZE=$((BOOT_A_SIZE + BOOT_B_SIZE + RECOVERY_SIZE + MISC_SIZE + SYSTEM_SIZE + SYSTEM_EXT_SIZE + VENDOR_SIZE + METADATA_SIZE + USERDATA_SIZE + 33554432))
|
|
|
|
if [ -f ${ANDROID_PRODUCT_OUT}/${IMGNAME} ]; then
|
|
exit_with_error "${ANDROID_PRODUCT_OUT}/${IMGNAME} already exists!"
|
|
fi
|
|
|
|
echo "Creating image file ${ANDROID_PRODUCT_OUT}/${IMGNAME}..."
|
|
sudo fallocate -l ${TOTAL_SIZE} ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sync
|
|
|
|
echo "Creating GPT partitions..."
|
|
sudo sgdisk -Z ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -o ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
|
|
BOOT_A_MB=$((BOOT_A_SIZE / 1048576))
|
|
BOOT_B_MB=$((BOOT_B_SIZE / 1048576))
|
|
RECOVERY_MB=$((RECOVERY_SIZE / 1048576))
|
|
MISC_MB=$((MISC_SIZE / 1048576))
|
|
SYSTEM_MB=$((SYSTEM_SIZE / 1048576))
|
|
SYSTEM_EXT_MB=$((SYSTEM_EXT_SIZE / 1048576))
|
|
VENDOR_MB=$((VENDOR_SIZE / 1048576))
|
|
METADATA_MB=$((METADATA_SIZE / 1048576))
|
|
USERDATA_MB=$((USERDATA_SIZE / 1048576))
|
|
|
|
sudo sgdisk -n 1:2048:+${BOOT_A_MB}M -c 1:"boot_a" -t 1:0700 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 2:0:+${BOOT_B_MB}M -c 2:"boot_b" -t 2:0700 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 3:0:+${RECOVERY_MB}M -c 3:"recovery" -t 3:0700 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 4:0:+${MISC_MB}M -c 4:"misc" -t 4:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 5:0:+${SYSTEM_MB}M -c 5:"system" -t 5:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 6:0:+${SYSTEM_EXT_MB}M -c 6:"system_ext" -t 6:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 7:0:+${VENDOR_MB}M -c 7:"vendor" -t 7:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 8:0:+${METADATA_MB}M -c 8:"metadata" -t 8:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sudo sgdisk -n 9:0:+${USERDATA_MB}M -c 9:"userdata" -t 9:8300 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
|
|
# Mark boot_a as bootable
|
|
sudo sgdisk -A 1:set:2 ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
sync
|
|
|
|
LOOPDEV=$(sudo kpartx -av ${ANDROID_PRODUCT_OUT}/${IMGNAME} | awk 'NR==1{ sub(/p[0-9]+$/, "", $3); print $3 }')
|
|
if [ -z ${LOOPDEV} ]; then
|
|
exit_with_error "Unable to find loop device!"
|
|
fi
|
|
echo "Image mounted as /dev/${LOOPDEV}"
|
|
sleep 2
|
|
|
|
echo "Copying boot_a (slot A)..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/boot.img of=/dev/mapper/${LOOPDEV}p1 bs=1M
|
|
echo "Copying boot_b (slot B — clone of A)..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/boot.img of=/dev/mapper/${LOOPDEV}p2 bs=1M
|
|
|
|
# Stamp each boot partition with its A/B slot suffix in cmdline.txt.
|
|
# The boot_control HAL reads ro.boot.slot_suffix (set from this cmdline
|
|
# parameter by init) to know which slot is currently running.
|
|
TMPMNT=$(mktemp -d)
|
|
echo "Stamping androidboot.slot_suffix=_a in boot_a/cmdline.txt..."
|
|
sudo mount -t vfat /dev/mapper/${LOOPDEV}p1 ${TMPMNT}
|
|
if [ -f ${TMPMNT}/cmdline.txt ]; then
|
|
CMDLINE=$(sudo cat ${TMPMNT}/cmdline.txt | tr -d '\n' | sed 's/ androidboot\.slot_suffix=[^ ]*//g')
|
|
printf '%s androidboot.slot_suffix=_a\n' "${CMDLINE}" | sudo tee ${TMPMNT}/cmdline.txt > /dev/null
|
|
else
|
|
echo "androidboot.slot_suffix=_a" | sudo tee ${TMPMNT}/cmdline.txt > /dev/null
|
|
fi
|
|
sudo umount ${TMPMNT}
|
|
|
|
echo "Stamping androidboot.slot_suffix=_b in boot_b/cmdline.txt..."
|
|
sudo mount -t vfat /dev/mapper/${LOOPDEV}p2 ${TMPMNT}
|
|
if [ -f ${TMPMNT}/cmdline.txt ]; then
|
|
CMDLINE=$(sudo cat ${TMPMNT}/cmdline.txt | tr -d '\n' | sed 's/ androidboot\.slot_suffix=[^ ]*//g')
|
|
printf '%s androidboot.slot_suffix=_b\n' "${CMDLINE}" | sudo tee ${TMPMNT}/cmdline.txt > /dev/null
|
|
else
|
|
echo "androidboot.slot_suffix=_b" | sudo tee ${TMPMNT}/cmdline.txt > /dev/null
|
|
fi
|
|
sudo umount ${TMPMNT}
|
|
rmdir ${TMPMNT}
|
|
if [ -f ${ANDROID_PRODUCT_OUT}/recovery.img ]; then
|
|
echo "Copying recovery..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/recovery.img of=/dev/mapper/${LOOPDEV}p3 bs=1M
|
|
else
|
|
echo "No recovery.img found — leaving recovery partition empty."
|
|
fi
|
|
echo "Zeroing misc..."
|
|
sudo dd if=/dev/zero of=/dev/mapper/${LOOPDEV}p4 bs=1M count=${MISC_MB}
|
|
echo "Copying system..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/system.img of=/dev/mapper/${LOOPDEV}p5 bs=1M
|
|
echo "Copying system_ext..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/system_ext.img of=/dev/mapper/${LOOPDEV}p6 bs=1M
|
|
echo "Copying vendor..."
|
|
sudo dd if=${ANDROID_PRODUCT_OUT}/vendor.img of=/dev/mapper/${LOOPDEV}p7 bs=1M
|
|
echo "Formatting metadata..."
|
|
sudo mkfs.ext4 /dev/mapper/${LOOPDEV}p8 -I 512 -L metadata
|
|
echo "Formatting userdata..."
|
|
sudo mkfs.ext4 /dev/mapper/${LOOPDEV}p9 -I 512 -L userdata
|
|
sync
|
|
|
|
sudo kpartx -dv "${ANDROID_PRODUCT_OUT}/${IMGNAME}"
|
|
sudo losetup -d "/dev/${LOOPDEV}"
|
|
sudo chown ${USER}:${USER} ${ANDROID_PRODUCT_OUT}/${IMGNAME}
|
|
|
|
echo "Done, created ${ANDROID_PRODUCT_OUT}/${IMGNAME}!"
|
|
exit 0 |