1 #!/bin/bash -ex 2 usage () { 3 echo "Create a Mixed Build archive with the given system and device archives." 4 echo 5 echo "Usage: $0 [-v <vendor_version>] [-m <modify_system_image_path>] [-p <override_vbmeta_image_path>]" 6 echo " system_build_dir device_build_dir out_dir [check_tool]" 7 echo 8 echo "Options -v, -m, -p must precede positional arguments." 9 echo 10 echo "vendor_version is the version of the vendor image when the mixed" 11 echo " build is inter branch. Optional." 12 echo " eg. 8.1.0 for a mixed build of GSI and O-MR1 vendor image." 13 echo "modify_system_image_path is the path to the script that modifies the" 14 echo " system image for an inter branch build target. Optional." 15 echo "override_vbmeta_image_path is the path to a vbmeta.img to use" 16 echo " to override the existing vbmeta.img of device. Optional." 17 echo "system_build_dir is the path to the system build" 18 echo " eg. aosp_arm64_ab-userdebug." 19 echo "device_build_dir is the path to the device build" 20 echo " eg. sailfish-user." 21 echo "out_dir is the path to where the new build will be placed." 22 echo "check_tool is the path to the checkvintf executable that will be" 23 echo " used to verify the compatibility of the given images. Optional." 24 } 25 26 # Print error message and exit. 27 # Usage: exit_badparam message 28 # 29 # message is a string to be displayed before exit. 30 exit_badparam () { 31 echo "ERROR: $1" >&2 32 usage 33 exit 1 34 } 35 36 cleanup_and_exit () { 37 readonly result="$?" 38 rm -rf "$TEMP_DIR" 39 exit "$result" 40 } 41 42 trap cleanup_and_exit EXIT 43 44 while getopts :v:m:p: opt; do 45 case "$opt" in 46 v) 47 readonly VENDOR_VERSION="$OPTARG" 48 ;; 49 m) 50 readonly MODIFY_SYSTEM_SCRIPT="$OPTARG" 51 ;; 52 p) 53 readonly OVERRIDE_VBMETA_IMAGE_PATH="$OPTARG" 54 ;; 55 \?) 56 exit_badparam "Invalid options: -"$OPTARG"" 57 ;; 58 :) 59 exit_badparam "Option -"$OPTARG" requires an argument." 60 ;; 61 esac 62 done 63 64 if [[ -z "${VENDOR_VERSION+x}" && ! -z "${MODIFY_SYSTEM_SCRIPT+x}" ]] || [[ ! -z "${VENDOR_VERSION+x}" && -z "${MODIFY_SYSTEM_SCRIPT+x}" ]]; then 65 exit_badparam "Options -v and -m must be set together." 66 fi 67 68 shift "$((OPTIND-1))" 69 70 if [[ ! -z "${MODIFY_SYSTEM_SCRIPT+x}" && ! -f "$MODIFY_SYSTEM_SCRIPT" ]]; then 71 exit_badparam "Script not found: "$MODIFY_SYSTEM_SCRIPT"" 72 fi 73 74 if [[ ! -z "${OVERRIDE_VBMETA_IMAGE_PATH+x}" && ! -f "$OVERRIDE_VBMETA_IMAGE_PATH" ]]; then 75 exit_badparam "Specified vbmeta.img not found: "$OVERRIDE_VBMETA_IMAGE_PATH"" 76 fi 77 78 if [[ $# -lt 3 ]]; then 79 exit_badparam "Unexpected number of arguments" 80 fi 81 82 readonly SYSTEM_DIR="$1" 83 readonly DEVICE_DIR="$2" 84 readonly DIST_DIR="$3" 85 readonly CHECK_TOOL="$4" 86 readonly TEMP_DIR="$(mktemp -d /tmp/"$(basename $0)"_XXXXXXXX)" 87 88 readonly SYSTEM_TARGET_FILES_ARCHIVE="$(find "$SYSTEM_DIR" -name "*-target_files-*.zip" -print)" 89 if [[ ! -f "$SYSTEM_TARGET_FILES_ARCHIVE" ]]; then 90 exit_badparam "Could not find system target files archive in $SYSTEM_DIR." 91 fi 92 93 readonly DEVICE_ARCHIVE="$(find "$DEVICE_DIR" -name "*-img-*.zip" -print)" 94 if [[ ! -f "$DEVICE_ARCHIVE" ]]; then 95 exit_badparam "Could not find device img archive in $DEVICE_DIR." 96 fi 97 98 readonly DEVICE_TARGET_FILES_ARCHIVE="$(find "$DEVICE_DIR" -name "*-target_files-*.zip" -print)" 99 if [[ ! -f "$DEVICE_ARCHIVE" ]]; then 100 exit_badparam "Could not find device target_files archive in $DEVICE_DIR." 101 fi 102 103 readonly DEVICE_ARTIFACTS_DIR="$TEMP_DIR"/device_archive_artifacts 104 readonly DEVICE_IMAGES_DIR="$DEVICE_ARTIFACTS_DIR"/IMAGES 105 readonly SYSTEM_ARTIFACTS_DIR="$TEMP_DIR"/system_artifacts 106 readonly SYSTEM_IMAGES_DIR="$SYSTEM_ARTIFACTS_DIR"/IMAGES 107 108 readonly SPL_PROPERTY_NAME="ro.build.version.security_patch" 109 readonly SYSTEM_BUILD_PROP="SYSTEM/build.prop" 110 111 ### 112 # Uncompress the archives. 113 mkdir -p "$SYSTEM_ARTIFACTS_DIR" 114 # Get the system images and meta data. 115 unzip "$SYSTEM_TARGET_FILES_ARCHIVE" \ 116 IMAGES/system.img IMAGES/vbmeta.img META/system_matrix.xml META/system_manifest.xml "$SYSTEM_BUILD_PROP" \ 117 -d "$SYSTEM_ARTIFACTS_DIR" 118 119 mkdir -p "$DEVICE_IMAGES_DIR" 120 # Get the device images. 121 unzip "$DEVICE_ARCHIVE" -d "$DEVICE_IMAGES_DIR" 122 # Get the device meta data. 123 unzip "$DEVICE_TARGET_FILES_ARCHIVE" \ 124 META/vendor_matrix.xml META/vendor_manifest.xml "$SYSTEM_BUILD_PROP" \ 125 -d "$DEVICE_ARTIFACTS_DIR" 126 127 ### 128 # Check compatibility between the system and device. 129 if [[ -f "$CHECK_TOOL" ]]; then 130 chmod 755 "$CHECK_TOOL" 131 "$CHECK_TOOL" \ 132 "$DEVICE_ARTIFACTS_DIR"/META/vendor_manifest.xml \ 133 "$SYSTEM_ARTIFACTS_DIR"/META/system_matrix.xml 134 "$CHECK_TOOL" \ 135 "$SYSTEM_ARTIFACTS_DIR"/META/system_manifest.xml \ 136 "$DEVICE_ARTIFACTS_DIR"/META/vendor_matrix.xml 137 fi 138 139 ### 140 # Modify system.img if vendor version is provided. 141 if [[ ! -z "${VENDOR_VERSION+x}" ]]; then 142 # Create copy of system target files package that can be modified 143 # since the original $SYSTEM_TARGET_FILES_ARCHIVE is a symlink to 144 # prebuilt files in cache 145 cp "$SYSTEM_TARGET_FILES_ARCHIVE" "$TEMP_DIR" 146 readonly COPY_SYSTEM_TARGET_FILES_ARCHIVE="$TEMP_DIR"/"$(basename "$SYSTEM_TARGET_FILES_ARCHIVE")" 147 148 # Check compatibility of security patch level 149 readonly SYSTEM_SPL=$(sed -n -r "s/^"$SPL_PROPERTY_NAME"=(.*)$/\1/p" "$SYSTEM_ARTIFACTS_DIR"/"$SYSTEM_BUILD_PROP") 150 readonly VENDOR_SPL=$(sed -n -r "s/^"$SPL_PROPERTY_NAME"=(.*)$/\1/p" "$DEVICE_ARTIFACTS_DIR"/"$SYSTEM_BUILD_PROP") 151 declare -a args 152 args=(-v "$VENDOR_VERSION" "$COPY_SYSTEM_TARGET_FILES_ARCHIVE") 153 if [[ "$SYSTEM_SPL" != "$VENDOR_SPL" ]]; then 154 echo "Security patch level mismatch detected..." 155 echo " SPL of system: "$SYSTEM_SPL"" 156 echo " SPL of vendor: "$VENDOR_SPL"" 157 args+=("$VENDOR_SPL") 158 fi 159 "$MODIFY_SYSTEM_SCRIPT" "${args[@]}" 160 # Replace system.img with newly modified system.img 161 unzip -o "$COPY_SYSTEM_TARGET_FILES_ARCHIVE" IMAGES/system.img -d "$SYSTEM_ARTIFACTS_DIR" 162 fi 163 164 ### 165 # Overwrite artifacts in the device archive to create the Mixed Build artifacts. 166 cp "$SYSTEM_IMAGES_DIR"/system.img "$DEVICE_IMAGES_DIR"/ 167 168 # Only override vbmeta if it is already present since fastboot update will try 169 # to flash whatever is in the archive. 170 if [[ -f "$DEVICE_IMAGES_DIR"/vbmeta.img ]]; then 171 readonly VBMETA_IMAGE_PATH="${OVERRIDE_VBMETA_IMAGE_PATH:-"$SYSTEM_IMAGES_DIR"/vbmeta.img}" 172 cp "$VBMETA_IMAGE_PATH" "$DEVICE_IMAGES_DIR"/ 173 fi 174 175 ### 176 # Create the Mixed Build archive. 177 ( 178 cd "$DEVICE_IMAGES_DIR" 179 zip -r mixed.zip ./* 180 ) 181 182 ### 183 # Archive the artifacts. 184 if [ -n "$DIST_DIR" ]; then 185 mkdir -p "$DIST_DIR" || true 186 fi 187 # Archive all the device artifacts. 188 rsync --archive --verbose --copy-links --exclude='logs' \ 189 "$DEVICE_DIR"/* "$DIST_DIR" 190 # Overwrite the image archive with the Mixed Build archive. 191 OUT_ARCHIVE="$DIST_DIR"/"$(basename $DEVICE_ARCHIVE)" 192 cp "$DEVICE_IMAGES_DIR"/mixed.zip "$OUT_ARCHIVE" 193