| #!/bin/bash |
| |
| function exit_and_clean_if_error { |
| if [ $1 -ne 0 ]; then |
| echo "ERROR: $2: retval=$1" >&2 |
| cd ${CUR_DIR} |
| rm -rf ${TEMP_DIR} |
| exit $1 |
| fi |
| } |
| |
| CUR_DIR=$(pwd) |
| GKI_FILES=( |
| System.map |
| vmlinux |
| vmlinux.symvers |
| modules.builtin |
| modules.builtin.modinfo |
| boot-lz4.img |
| Image.lz4 |
| ) |
| GKI_PREBUILTS_DIR=${2:-${CUR_DIR}/prebuilts/boot-artifacts/kernel/} |
| GKI_BUILD=$1 |
| ALLOW_PREBUILTS_MISMATCH=${ALLOW_PREBUILTS_MISMATCH:-0} |
| USE_UNSIGNED_USER_IMG=${USE_UNSIGNED_USER_IMG:-0} |
| BASE_TARGET="kernel_aarch64" |
| FETCH_ARTIFACT_CMD="/google/data/ro/projects/android/fetch_artifact" |
| IMG_TAR_FILE="certified-boot-img-${GKI_BUILD}.tar.gz" |
| |
| if [ -z "${GKI_BUILD}" ]; then |
| echo "No GKI build number provided." |
| exit 1 |
| fi |
| |
| mkdir -p ${GKI_PREBUILTS_DIR} |
| TEMP_DIR=$(mktemp -d) |
| |
| cd ${TEMP_DIR} |
| echo "Downloading GKI binaries from build ab/${GKI_BUILD} via fetch_artifact..." |
| if [ "${USE_UNSIGNED_USER_IMG}" = "0" ]; then |
| file="signed/${IMG_TAR_FILE}" |
| echo "Downloading signed boot.img..." |
| ${FETCH_ARTIFACT_CMD} \ |
| --bid ${GKI_BUILD} \ |
| --target ${BASE_TARGET} ${file} |
| exit_and_clean_if_error $? "Unable to download signed boot image" |
| fi |
| |
| echo "Downloading prebuilts..." |
| for file in "${GKI_FILES[@]}"; do |
| if grep -q "boot.*\.img" <<< ${file} ; then |
| BOOT_IMG_NAME=${file} |
| fi |
| ${FETCH_ARTIFACT_CMD} \ |
| --bid ${GKI_BUILD} \ |
| --target ${BASE_TARGET} ${file} |
| exit_and_clean_if_error $? "Error downloading ${file}" |
| done |
| |
| if [ "${USE_UNSIGNED_USER_IMG}" = "0" ]; then |
| tar -zxvf ${IMG_TAR_FILE} |
| exit_and_clean_if_error $? "Failed to extract ${IMG_TAR_FILE}" |
| fi |
| |
| if [ -f "vmlinux" ]; then |
| SHA_FILE="vmlinux" |
| else |
| exit_and_clean_if_error 1 "No vmlinux downloaded" |
| fi |
| |
| echo "Checking if GKI binaries match the current aosp/ revision..." |
| PREBUILTS_SHA=$(strings ${SHA_FILE} | grep "Linux version [0-9]\+\.[0-9]\+" | |
| sed -n "s/^.*-g\([0-9a-fA-F]\{12\}\)-.*/\1/p") |
| MANIFEST_SHA=$(cat ${CUR_DIR}/.repo/manifests/default.xml | |
| grep "path=\"aosp\"" | |
| sed -n "s/^.*revision=\"\([0-9a-fA-F]\{12\}\).*/\1/p") |
| if [ "${PREBUILTS_SHA}" != "${MANIFEST_SHA}" -a \ |
| "${ALLOW_PREBUILTS_MISMATCH}" = "0" ]; then |
| echo "The downloaded prebuilts do not match the manifest's SHA! Please" |
| echo " check the GKI_BUILD provided, or use ALLOW_PREBUILTS_MISMATCH=1" |
| echo " if this difference is expected." |
| echo " PREBUILTS_SHA=${PREBUILTS_SHA}" |
| echo " MANIFEST_SHA=${MANIFEST_SHA}" |
| exit_and_clean_if_error 1 "Mismatch between manifest and prebuilts" |
| fi |
| |
| echo "Copying GKI files to ${GKI_PREBUILTS_DIR}..." |
| mv -v ${GKI_FILES[@]} ${GKI_PREBUILTS_DIR} |
| exit_and_clean_if_error $? "Unable to copy all files" |
| |
| cd ${GKI_PREBUILTS_DIR} |
| if [ -n "${BOOT_IMG_NAME}" -a -f "${BOOT_IMG_NAME}" ]; then |
| mv ${BOOT_IMG_NAME} boot.img |
| echo "Copied ${BOOT_IMG_NAME} to boot.img." |
| fi |
| echo "Update the GKI binaries to ab/${GKI_BUILD} |
| |
| Update the GKI binaries based on the given build. The prebuilts now have |
| the following SHA, taken from the ${SHA_FILE} banner: ${PREBUILTS_SHA} |
| " > ${TEMP_DIR}/commit_body |
| git add * |
| git commit -s -F ${TEMP_DIR}/commit_body |
| |
| cd ${CUR_DIR} |
| rm -rf ${TEMP_DIR} |
| |
| echo "Done." |