xref: /aosp_15_r20/development/vndk/tools/build_mixed (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker#!/bin/bash -ex
2*90c8c64dSAndroid Build Coastguard Workerusage () {
3*90c8c64dSAndroid Build Coastguard Worker  echo "Create a Mixed Build archive with the given system and device archives."
4*90c8c64dSAndroid Build Coastguard Worker  echo
5*90c8c64dSAndroid Build Coastguard Worker  echo "Usage: $0 [-v <vendor_version>] [-m <modify_system_image_path>]"
6*90c8c64dSAndroid Build Coastguard Worker  echo "    [-t <prebuilt_otatools_path>] [-p <override_vbmeta_image_path>]"
7*90c8c64dSAndroid Build Coastguard Worker  echo "    [-b <override_boot_image_path>]"
8*90c8c64dSAndroid Build Coastguard Worker  echo "    [-s] [-d] system_build_dir device_build_dir out_dir"
9*90c8c64dSAndroid Build Coastguard Worker  echo
10*90c8c64dSAndroid Build Coastguard Worker  echo "Options -v, -m, -t, -p, -b, -s, -d must precede positional arguments."
11*90c8c64dSAndroid Build Coastguard Worker  echo
12*90c8c64dSAndroid Build Coastguard Worker  echo "vendor_version is the version of the vendor image when Keymaster v3"
13*90c8c64dSAndroid Build Coastguard Worker  echo "    related modifications to the system image is necessary. Optional."
14*90c8c64dSAndroid Build Coastguard Worker  echo "    eg. 8.1.0 for a mixed build of GSI and O-MR1 vendor image."
15*90c8c64dSAndroid Build Coastguard Worker  echo "modify_system_image_path is the path to the script that modifies the"
16*90c8c64dSAndroid Build Coastguard Worker  echo "    system image, needed for Keymaster v3. Optional."
17*90c8c64dSAndroid Build Coastguard Worker  echo "prebuilt_otatools_path is the path to otatools.zip file that has all"
18*90c8c64dSAndroid Build Coastguard Worker  echo "    required host binaries to modify system image. It also must include"
19*90c8c64dSAndroid Build Coastguard Worker  echo "    VINTF check tool to verify the compatibility of the given images."
20*90c8c64dSAndroid Build Coastguard Worker  echo "    Optional."
21*90c8c64dSAndroid Build Coastguard Worker  echo "override_vbmeta_image_path is the path to a vbmeta.img to use"
22*90c8c64dSAndroid Build Coastguard Worker  echo "    to override the existing vbmeta.img of device. Optional."
23*90c8c64dSAndroid Build Coastguard Worker  echo "override_boot_image_path is the path to a boot imgage to use to"
24*90c8c64dSAndroid Build Coastguard Worker  echo "    override the existing boot.img of device. Optional."
25*90c8c64dSAndroid Build Coastguard Worker  echo "-s is used to fetch and flash both product.img and system.img from"
26*90c8c64dSAndroid Build Coastguard Worker  echo "    the system_build_dir for devices with a product partition."
27*90c8c64dSAndroid Build Coastguard Worker  echo "    product.img will be removed if system_build_dir does not have"
28*90c8c64dSAndroid Build Coastguard Worker  echo "    product.img when -s option is declared."
29*90c8c64dSAndroid Build Coastguard Worker  echo "    By default, only system.img is flashed to the target device for"
30*90c8c64dSAndroid Build Coastguard Worker  echo "    independent system update. No parameter required. Optional"
31*90c8c64dSAndroid Build Coastguard Worker  echo "-d is used to skip vbmeta.img replacement in its entirety and the"
32*90c8c64dSAndroid Build Coastguard Worker  echo "    one from the device build (if exists) is left untouched"
33*90c8c64dSAndroid Build Coastguard Worker  echo "system_build_dir is the path to the system build"
34*90c8c64dSAndroid Build Coastguard Worker  echo "    eg. aosp_arm64-userdebug."
35*90c8c64dSAndroid Build Coastguard Worker  echo "device_build_dir is the path to the device build"
36*90c8c64dSAndroid Build Coastguard Worker  echo "    eg. sailfish-user."
37*90c8c64dSAndroid Build Coastguard Worker  echo "out_dir is the path to where the new build will be placed."
38*90c8c64dSAndroid Build Coastguard Worker}
39*90c8c64dSAndroid Build Coastguard Worker
40*90c8c64dSAndroid Build Coastguard Worker# Print error message and exit.
41*90c8c64dSAndroid Build Coastguard Worker# Usage: exit_badparam message
42*90c8c64dSAndroid Build Coastguard Worker#
43*90c8c64dSAndroid Build Coastguard Worker# message is a string to be displayed before exit.
44*90c8c64dSAndroid Build Coastguard Workerexit_badparam () {
45*90c8c64dSAndroid Build Coastguard Worker  echo "ERROR: $1" >&2
46*90c8c64dSAndroid Build Coastguard Worker  usage
47*90c8c64dSAndroid Build Coastguard Worker  exit 1
48*90c8c64dSAndroid Build Coastguard Worker}
49*90c8c64dSAndroid Build Coastguard Worker
50*90c8c64dSAndroid Build Coastguard Workercleanup_and_exit () {
51*90c8c64dSAndroid Build Coastguard Worker  readonly result="$?"
52*90c8c64dSAndroid Build Coastguard Worker  rm -rf "$TEMP_DIR"
53*90c8c64dSAndroid Build Coastguard Worker  exit "$result"
54*90c8c64dSAndroid Build Coastguard Worker}
55*90c8c64dSAndroid Build Coastguard Worker
56*90c8c64dSAndroid Build Coastguard Workertrap cleanup_and_exit EXIT
57*90c8c64dSAndroid Build Coastguard Worker
58*90c8c64dSAndroid Build Coastguard Workerwhile getopts :v:m:p:b:t:sd opt; do
59*90c8c64dSAndroid Build Coastguard Worker  case "$opt" in
60*90c8c64dSAndroid Build Coastguard Worker    v)
61*90c8c64dSAndroid Build Coastguard Worker      readonly VENDOR_VERSION="$OPTARG"
62*90c8c64dSAndroid Build Coastguard Worker      ;;
63*90c8c64dSAndroid Build Coastguard Worker    m)
64*90c8c64dSAndroid Build Coastguard Worker      readonly MODIFY_SYSTEM_SCRIPT="$OPTARG"
65*90c8c64dSAndroid Build Coastguard Worker      ;;
66*90c8c64dSAndroid Build Coastguard Worker    p)
67*90c8c64dSAndroid Build Coastguard Worker      readonly OVERRIDE_VBMETA_IMAGE_PATH="$OPTARG"
68*90c8c64dSAndroid Build Coastguard Worker      ;;
69*90c8c64dSAndroid Build Coastguard Worker    b)
70*90c8c64dSAndroid Build Coastguard Worker      readonly OVERRIDE_BOOT_IMAGE_PATH="$OPTARG"
71*90c8c64dSAndroid Build Coastguard Worker      ;;
72*90c8c64dSAndroid Build Coastguard Worker    t)
73*90c8c64dSAndroid Build Coastguard Worker      readonly OTATOOLS_ZIP="$OPTARG"
74*90c8c64dSAndroid Build Coastguard Worker      ;;
75*90c8c64dSAndroid Build Coastguard Worker    s)
76*90c8c64dSAndroid Build Coastguard Worker      readonly INCLUDE_PRODUCT=true
77*90c8c64dSAndroid Build Coastguard Worker      ;;
78*90c8c64dSAndroid Build Coastguard Worker    d)
79*90c8c64dSAndroid Build Coastguard Worker      readonly SKIP_VBMETA_REPLACE=true
80*90c8c64dSAndroid Build Coastguard Worker      ;;
81*90c8c64dSAndroid Build Coastguard Worker    \?)
82*90c8c64dSAndroid Build Coastguard Worker      exit_badparam "Invalid options: -"$OPTARG""
83*90c8c64dSAndroid Build Coastguard Worker      ;;
84*90c8c64dSAndroid Build Coastguard Worker    :)
85*90c8c64dSAndroid Build Coastguard Worker      exit_badparam "Option -"$OPTARG" requires an argument."
86*90c8c64dSAndroid Build Coastguard Worker      ;;
87*90c8c64dSAndroid Build Coastguard Worker  esac
88*90c8c64dSAndroid Build Coastguard Workerdone
89*90c8c64dSAndroid Build Coastguard Worker
90*90c8c64dSAndroid Build Coastguard Workerif [[ -z "${VENDOR_VERSION+x}" && ! -z "${MODIFY_SYSTEM_SCRIPT+x}" ]] || \
91*90c8c64dSAndroid Build Coastguard Worker  [[ ! -z "${VENDOR_VERSION+x}" && -z "${MODIFY_SYSTEM_SCRIPT+x}" ]]; then
92*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Options -v and -m must be set together."
93*90c8c64dSAndroid Build Coastguard Workerfi
94*90c8c64dSAndroid Build Coastguard Worker
95*90c8c64dSAndroid Build Coastguard Workershift "$((OPTIND-1))"
96*90c8c64dSAndroid Build Coastguard Worker
97*90c8c64dSAndroid Build Coastguard Workerif [[ $# -lt 3 ]]; then
98*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Unexpected number of arguments"
99*90c8c64dSAndroid Build Coastguard Workerfi
100*90c8c64dSAndroid Build Coastguard Worker
101*90c8c64dSAndroid Build Coastguard Workerreadonly SYSTEM_DIR="$1"
102*90c8c64dSAndroid Build Coastguard Workerreadonly DEVICE_DIR="$2"
103*90c8c64dSAndroid Build Coastguard Workerreadonly DIST_DIR="$3"
104*90c8c64dSAndroid Build Coastguard Workerreadonly TEMP_DIR="$(mktemp -d /tmp/"$(basename $0)"_XXXXXXXX)"
105*90c8c64dSAndroid Build Coastguard Worker
106*90c8c64dSAndroid Build Coastguard Workerreadonly SYSTEM_TARGET_FILES_ARCHIVE="$(find "$SYSTEM_DIR" -name "*-target_files-*.zip" -print)"
107*90c8c64dSAndroid Build Coastguard Workerif [[ ! -f "$SYSTEM_TARGET_FILES_ARCHIVE" ]]; then
108*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Could not find system target files archive in $SYSTEM_DIR."
109*90c8c64dSAndroid Build Coastguard Workerfi
110*90c8c64dSAndroid Build Coastguard Worker
111*90c8c64dSAndroid Build Coastguard Workerreadonly DEVICE_ARCHIVE="$(find "$DEVICE_DIR" -name "*-img-*.zip" -print)"
112*90c8c64dSAndroid Build Coastguard Workerif [[ ! -f "$DEVICE_ARCHIVE" ]]; then
113*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Could not find device img archive in $DEVICE_DIR."
114*90c8c64dSAndroid Build Coastguard Workerfi
115*90c8c64dSAndroid Build Coastguard Worker
116*90c8c64dSAndroid Build Coastguard Workerreadonly DEVICE_TARGET_FILES_ARCHIVE="$(find "$DEVICE_DIR" -name "*-target_files-*.zip" -print)"
117*90c8c64dSAndroid Build Coastguard Workerif [[ ! -f "$DEVICE_TARGET_FILES_ARCHIVE" ]]; then
118*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Could not find device target_files archive in $DEVICE_DIR."
119*90c8c64dSAndroid Build Coastguard Workerfi
120*90c8c64dSAndroid Build Coastguard Worker
121*90c8c64dSAndroid Build Coastguard Workerif [[ ! -z "${MODIFY_SYSTEM_SCRIPT+x}" && ! -f "$MODIFY_SYSTEM_SCRIPT" ]]; then
122*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Script not found: "$MODIFY_SYSTEM_SCRIPT""
123*90c8c64dSAndroid Build Coastguard Workerfi
124*90c8c64dSAndroid Build Coastguard Worker
125*90c8c64dSAndroid Build Coastguard Workerif [[ ! -z "${OVERRIDE_VBMETA_IMAGE_PATH+x}" && ! -f "$OVERRIDE_VBMETA_IMAGE_PATH" ]]; then
126*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Specified vbmeta.img not found: "$OVERRIDE_VBMETA_IMAGE_PATH""
127*90c8c64dSAndroid Build Coastguard Workerfi
128*90c8c64dSAndroid Build Coastguard Worker
129*90c8c64dSAndroid Build Coastguard Workerif [[ ! -z "${OVERRIDE_BOOT_IMAGE_PATH+x}" && ! -f "$OVERRIDE_BOOT_IMAGE_PATH" ]]; then
130*90c8c64dSAndroid Build Coastguard Worker  exit_badparam "Specified boot image not found: "$OVERRIDE_BOOT_IMAGE_PATH""
131*90c8c64dSAndroid Build Coastguard Workerfi
132*90c8c64dSAndroid Build Coastguard Worker
133*90c8c64dSAndroid Build Coastguard Workerreadonly DEVICE_ARTIFACTS_DIR="$TEMP_DIR"/device_archive_artifacts
134*90c8c64dSAndroid Build Coastguard Workerreadonly DEVICE_IMAGES_DIR="$DEVICE_ARTIFACTS_DIR"/IMAGES
135*90c8c64dSAndroid Build Coastguard Workerreadonly SYSTEM_ARTIFACTS_DIR="$TEMP_DIR"/system_artifacts
136*90c8c64dSAndroid Build Coastguard Workerreadonly SYSTEM_IMAGES_DIR="$SYSTEM_ARTIFACTS_DIR"/IMAGES
137*90c8c64dSAndroid Build Coastguard Workerreadonly OTATOOLS_DIR="$TEMP_DIR"/otatools
138*90c8c64dSAndroid Build Coastguard Worker
139*90c8c64dSAndroid Build Coastguard Workerreadonly SPL_PROPERTY_NAME="ro.build.version.security_patch"
140*90c8c64dSAndroid Build Coastguard Workerreadonly SYSTEM_BUILD_PROP="SYSTEM/build.prop"
141*90c8c64dSAndroid Build Coastguard Worker
142*90c8c64dSAndroid Build Coastguard Workerdeclare -a EXTRACT_SYSTEM_FILE_LIST
143*90c8c64dSAndroid Build Coastguard WorkerEXTRACT_SYSTEM_FILE_LIST=(
144*90c8c64dSAndroid Build Coastguard Worker  IMAGES/system.img \
145*90c8c64dSAndroid Build Coastguard Worker  IMAGES/vbmeta.img \
146*90c8c64dSAndroid Build Coastguard Worker  "$SYSTEM_BUILD_PROP" \
147*90c8c64dSAndroid Build Coastguard Worker)
148*90c8c64dSAndroid Build Coastguard Worker
149*90c8c64dSAndroid Build Coastguard Workerdeclare -a EXTRACT_VINTF_SYSTEM_FILE_LIST
150*90c8c64dSAndroid Build Coastguard WorkerEXTRACT_VINTF_SYSTEM_FILE_LIST=(
151*90c8c64dSAndroid Build Coastguard Worker  "$SYSTEM_BUILD_PROP" \
152*90c8c64dSAndroid Build Coastguard Worker)
153*90c8c64dSAndroid Build Coastguard Worker
154*90c8c64dSAndroid Build Coastguard Workerdeclare -a EXTRACT_DEVICE_FILE_LIST
155*90c8c64dSAndroid Build Coastguard WorkerEXTRACT_DEVICE_FILE_LIST=(
156*90c8c64dSAndroid Build Coastguard Worker  */build.prop \
157*90c8c64dSAndroid Build Coastguard Worker  META/* \
158*90c8c64dSAndroid Build Coastguard Worker)
159*90c8c64dSAndroid Build Coastguard Worker
160*90c8c64dSAndroid Build Coastguard Workerdeclare -A SYSTEM_SEARCH_PATH
161*90c8c64dSAndroid Build Coastguard WorkerSYSTEM_SEARCH_PATH=( \
162*90c8c64dSAndroid Build Coastguard Worker  [/system]="SYSTEM" \
163*90c8c64dSAndroid Build Coastguard Worker  [/product]="PRODUCT SYSTEM/product" \
164*90c8c64dSAndroid Build Coastguard Worker  [/system_ext]="SYSTEM_EXT SYSTEM/system_ext" \
165*90c8c64dSAndroid Build Coastguard Worker)
166*90c8c64dSAndroid Build Coastguard Worker
167*90c8c64dSAndroid Build Coastguard Workerdeclare -A DEVICE_SEARCH_PATH
168*90c8c64dSAndroid Build Coastguard Worker# Mixed build will not have /vendor to SYSTEM/vendor case
169*90c8c64dSAndroid Build Coastguard WorkerDEVICE_SEARCH_PATH=( \
170*90c8c64dSAndroid Build Coastguard Worker  [/vendor]="VENDOR" \
171*90c8c64dSAndroid Build Coastguard Worker  [/odm]="ODM VENDOR/odm" \
172*90c8c64dSAndroid Build Coastguard Worker)
173*90c8c64dSAndroid Build Coastguard Worker
174*90c8c64dSAndroid Build Coastguard Worker###
175*90c8c64dSAndroid Build Coastguard Worker# Uncompress otatools.zip and get vintf file list.
176*90c8c64dSAndroid Build Coastguard Workerif [[ ! -f "$OTATOOLS_ZIP" ]]; then
177*90c8c64dSAndroid Build Coastguard Worker  echo "WARNING: otatools.zip is missing. Add \"-t otatools.zip\" to enable checkvintf"
178*90c8c64dSAndroid Build Coastguard Workerelse
179*90c8c64dSAndroid Build Coastguard Worker  readonly OTATOOLS_AVAILABLE=true
180*90c8c64dSAndroid Build Coastguard Worker  # Uncompress otatools
181*90c8c64dSAndroid Build Coastguard Worker  mkdir -p "$OTATOOLS_DIR"
182*90c8c64dSAndroid Build Coastguard Worker  unzip "$OTATOOLS_ZIP" bin/* lib64/* -d "$OTATOOLS_DIR"
183*90c8c64dSAndroid Build Coastguard Worker  # Set paths for using prebuilt host binaries.
184*90c8c64dSAndroid Build Coastguard Worker  export PATH="$OTATOOLS_DIR"/bin:"$PATH"
185*90c8c64dSAndroid Build Coastguard Worker  export LD_LIBRARY_PATH="$OTATOOLS_DIR"/lib64:"$LD_LIBRARY_PATH"
186*90c8c64dSAndroid Build Coastguard Worker
187*90c8c64dSAndroid Build Coastguard Worker  # Add vintf file to extract file list
188*90c8c64dSAndroid Build Coastguard Worker  declare -a VINTF_DUMP_FILE_LIST
189*90c8c64dSAndroid Build Coastguard Worker  VINTF_DUMP_FILE_LIST=( "$(checkvintf --dump-file-list)" )
190*90c8c64dSAndroid Build Coastguard Worker
191*90c8c64dSAndroid Build Coastguard Worker  for vintf_file_list in ${VINTF_DUMP_FILE_LIST[*]}; do
192*90c8c64dSAndroid Build Coastguard Worker    if [[ "$vintf_file_list" == */ ]]; then
193*90c8c64dSAndroid Build Coastguard Worker      vintf_file_list="$vintf_file_list"\*
194*90c8c64dSAndroid Build Coastguard Worker      # Create system vintf file list for system target files archive
195*90c8c64dSAndroid Build Coastguard Worker      for system_dir in "${!SYSTEM_SEARCH_PATH[@]}"; do
196*90c8c64dSAndroid Build Coastguard Worker        if [[ "$vintf_file_list" == "$system_dir"/* ]]; then
197*90c8c64dSAndroid Build Coastguard Worker          for search_dir in ${SYSTEM_SEARCH_PATH["$system_dir"]}; do
198*90c8c64dSAndroid Build Coastguard Worker            search_file=${vintf_file_list/$system_dir/$search_dir}
199*90c8c64dSAndroid Build Coastguard Worker            unzip -l "$SYSTEM_TARGET_FILES_ARCHIVE" "$search_file" > /dev/null && \
200*90c8c64dSAndroid Build Coastguard Worker              EXTRACT_VINTF_SYSTEM_FILE_LIST+=( "$search_file" )
201*90c8c64dSAndroid Build Coastguard Worker          done
202*90c8c64dSAndroid Build Coastguard Worker          break
203*90c8c64dSAndroid Build Coastguard Worker        fi
204*90c8c64dSAndroid Build Coastguard Worker      done
205*90c8c64dSAndroid Build Coastguard Worker      # Create device vintf file list for device target files archive
206*90c8c64dSAndroid Build Coastguard Worker      for device_dir in "${!DEVICE_SEARCH_PATH[@]}"; do
207*90c8c64dSAndroid Build Coastguard Worker        if [[ "$vintf_file_list" == "$device_dir"/* ]]; then
208*90c8c64dSAndroid Build Coastguard Worker          for search_dir in ${DEVICE_SEARCH_PATH["$device_dir"]}; do
209*90c8c64dSAndroid Build Coastguard Worker            search_file=${vintf_file_list/$device_dir/$search_dir}
210*90c8c64dSAndroid Build Coastguard Worker            unzip -l "$DEVICE_TARGET_FILES_ARCHIVE" "$search_file" > /dev/null && \
211*90c8c64dSAndroid Build Coastguard Worker              EXTRACT_DEVICE_FILE_LIST+=( "$search_file" )
212*90c8c64dSAndroid Build Coastguard Worker          done
213*90c8c64dSAndroid Build Coastguard Worker          break
214*90c8c64dSAndroid Build Coastguard Worker        fi
215*90c8c64dSAndroid Build Coastguard Worker      done
216*90c8c64dSAndroid Build Coastguard Worker     fi
217*90c8c64dSAndroid Build Coastguard Worker  done
218*90c8c64dSAndroid Build Coastguard Workerfi
219*90c8c64dSAndroid Build Coastguard Worker
220*90c8c64dSAndroid Build Coastguard Worker###
221*90c8c64dSAndroid Build Coastguard Worker# Uncompress the system archives.
222*90c8c64dSAndroid Build Coastguard Workerif [[ "$INCLUDE_PRODUCT" == true ]]; then
223*90c8c64dSAndroid Build Coastguard Worker  unzip -l "$SYSTEM_TARGET_FILES_ARCHIVE" | grep -q IMAGES/product.img &&
224*90c8c64dSAndroid Build Coastguard Worker  EXTRACT_SYSTEM_FILE_LIST+=(IMAGES/product.img)
225*90c8c64dSAndroid Build Coastguard Workerfi
226*90c8c64dSAndroid Build Coastguard Worker
227*90c8c64dSAndroid Build Coastguard Workermkdir -p "$SYSTEM_ARTIFACTS_DIR"
228*90c8c64dSAndroid Build Coastguard Worker# Get system images.
229*90c8c64dSAndroid Build Coastguard Workerunzip "$SYSTEM_TARGET_FILES_ARCHIVE" "${EXTRACT_SYSTEM_FILE_LIST[@]}" \
230*90c8c64dSAndroid Build Coastguard Worker  -d "$SYSTEM_ARTIFACTS_DIR"
231*90c8c64dSAndroid Build Coastguard Worker
232*90c8c64dSAndroid Build Coastguard Worker###
233*90c8c64dSAndroid Build Coastguard Worker# Uncompress the device archives.
234*90c8c64dSAndroid Build Coastguard Workermkdir -p "$DEVICE_IMAGES_DIR"
235*90c8c64dSAndroid Build Coastguard Worker# Get device images.
236*90c8c64dSAndroid Build Coastguard Workerunzip "$DEVICE_ARCHIVE" -d "$DEVICE_IMAGES_DIR"
237*90c8c64dSAndroid Build Coastguard Worker# Get the device meta data.
238*90c8c64dSAndroid Build Coastguard Workerunzip "$DEVICE_TARGET_FILES_ARCHIVE" "${EXTRACT_DEVICE_FILE_LIST[@]}" \
239*90c8c64dSAndroid Build Coastguard Worker  -d "$DEVICE_ARTIFACTS_DIR"
240*90c8c64dSAndroid Build Coastguard Worker
241*90c8c64dSAndroid Build Coastguard Worker###
242*90c8c64dSAndroid Build Coastguard Worker# Modify system.img if vendor version is provided.
243*90c8c64dSAndroid Build Coastguard Workerif [[ ! -z "${VENDOR_VERSION+x}" ]]; then
244*90c8c64dSAndroid Build Coastguard Worker  # Create copy of system target files package that can be modified
245*90c8c64dSAndroid Build Coastguard Worker  # since the original $SYSTEM_TARGET_FILES_ARCHIVE is a symlink to
246*90c8c64dSAndroid Build Coastguard Worker  # prebuilt files in cache
247*90c8c64dSAndroid Build Coastguard Worker  cp "$SYSTEM_TARGET_FILES_ARCHIVE" "$TEMP_DIR"
248*90c8c64dSAndroid Build Coastguard Worker  readonly COPY_SYSTEM_TARGET_FILES_ARCHIVE="$TEMP_DIR"/"$(basename "$SYSTEM_TARGET_FILES_ARCHIVE")"
249*90c8c64dSAndroid Build Coastguard Worker
250*90c8c64dSAndroid Build Coastguard Worker  # Check compatibility of security patch level
251*90c8c64dSAndroid Build Coastguard Worker  readonly SYSTEM_SPL=$(sed -n -r "s/^"$SPL_PROPERTY_NAME"=(.*)$/\1/p" "$SYSTEM_ARTIFACTS_DIR"/"$SYSTEM_BUILD_PROP")
252*90c8c64dSAndroid Build Coastguard Worker  readonly VENDOR_SPL=$(sed -n -r "s/^"$SPL_PROPERTY_NAME"=(.*)$/\1/p" "$DEVICE_ARTIFACTS_DIR"/"$SYSTEM_BUILD_PROP")
253*90c8c64dSAndroid Build Coastguard Worker  declare -a args
254*90c8c64dSAndroid Build Coastguard Worker  args=(-v "$VENDOR_VERSION" "$COPY_SYSTEM_TARGET_FILES_ARCHIVE")
255*90c8c64dSAndroid Build Coastguard Worker  if [[ "$SYSTEM_SPL" != "$VENDOR_SPL" ]]; then
256*90c8c64dSAndroid Build Coastguard Worker    echo "Security patch level mismatch detected..."
257*90c8c64dSAndroid Build Coastguard Worker    echo "  SPL of system: "$SYSTEM_SPL""
258*90c8c64dSAndroid Build Coastguard Worker    echo "  SPL of vendor: "$VENDOR_SPL""
259*90c8c64dSAndroid Build Coastguard Worker    args+=("$VENDOR_SPL")
260*90c8c64dSAndroid Build Coastguard Worker  fi
261*90c8c64dSAndroid Build Coastguard Worker  "$MODIFY_SYSTEM_SCRIPT" "${args[@]}"
262*90c8c64dSAndroid Build Coastguard Worker  # Replace system.img with newly modified system.img
263*90c8c64dSAndroid Build Coastguard Worker  unzip -o "$COPY_SYSTEM_TARGET_FILES_ARCHIVE" IMAGES/system.img -d "$SYSTEM_ARTIFACTS_DIR"
264*90c8c64dSAndroid Build Coastguard Workerfi
265*90c8c64dSAndroid Build Coastguard Worker
266*90c8c64dSAndroid Build Coastguard Worker# Check vintf
267*90c8c64dSAndroid Build Coastguard Workerif [[ "$OTATOOLS_AVAILABLE" == true ]]; then
268*90c8c64dSAndroid Build Coastguard Worker  # Overwrite VINTF system matrix to device artifacts dir
269*90c8c64dSAndroid Build Coastguard Worker  unzip -o "$SYSTEM_TARGET_FILES_ARCHIVE" "${EXTRACT_VINTF_SYSTEM_FILE_LIST[@]}" \
270*90c8c64dSAndroid Build Coastguard Worker    -d "$DEVICE_ARTIFACTS_DIR"
271*90c8c64dSAndroid Build Coastguard Worker  check_target_files_vintf "$DEVICE_ARTIFACTS_DIR"
272*90c8c64dSAndroid Build Coastguard Workerfi
273*90c8c64dSAndroid Build Coastguard Worker
274*90c8c64dSAndroid Build Coastguard Worker###
275*90c8c64dSAndroid Build Coastguard Worker# Overwrite artifacts in the device archive to create the Mixed Build artifacts.
276*90c8c64dSAndroid Build Coastguard Workercp "$SYSTEM_IMAGES_DIR"/system.img "$DEVICE_IMAGES_DIR"/
277*90c8c64dSAndroid Build Coastguard Workerif [[ "$INCLUDE_PRODUCT" == true ]]; then
278*90c8c64dSAndroid Build Coastguard Worker  if [[ -f "$SYSTEM_IMAGES_DIR"/product.img ]]; then
279*90c8c64dSAndroid Build Coastguard Worker    cp "$SYSTEM_IMAGES_DIR"/product.img "$DEVICE_IMAGES_DIR"/
280*90c8c64dSAndroid Build Coastguard Worker  else
281*90c8c64dSAndroid Build Coastguard Worker    rm -f "$DEVICE_IMAGES_DIR"/product.img
282*90c8c64dSAndroid Build Coastguard Worker    # Removed product partition from required partition list
283*90c8c64dSAndroid Build Coastguard Worker    sed -i "/partition-exists=product$/d" "$DEVICE_IMAGES_DIR"/android-info.txt
284*90c8c64dSAndroid Build Coastguard Worker  fi
285*90c8c64dSAndroid Build Coastguard Workerfi
286*90c8c64dSAndroid Build Coastguard Worker
287*90c8c64dSAndroid Build Coastguard Workerif [[ "$SKIP_VBMETA_REPLACE" == true ]]; then
288*90c8c64dSAndroid Build Coastguard Worker    # Totally skip the vbmeta.img replacement
289*90c8c64dSAndroid Build Coastguard Worker    echo "Skip vbmeta.img replacement."
290*90c8c64dSAndroid Build Coastguard Workerelse
291*90c8c64dSAndroid Build Coastguard Worker    # Only override vbmeta if it is already present since fastboot update will try
292*90c8c64dSAndroid Build Coastguard Worker    # to flash whatever is in the archive.
293*90c8c64dSAndroid Build Coastguard Worker    if [[ -f "$DEVICE_IMAGES_DIR"/vbmeta.img ]]; then
294*90c8c64dSAndroid Build Coastguard Worker      readonly VBMETA_IMAGE_PATH="${OVERRIDE_VBMETA_IMAGE_PATH:-"$SYSTEM_IMAGES_DIR"/vbmeta.img}"
295*90c8c64dSAndroid Build Coastguard Worker      cp "$VBMETA_IMAGE_PATH" "$DEVICE_IMAGES_DIR"/
296*90c8c64dSAndroid Build Coastguard Worker    fi
297*90c8c64dSAndroid Build Coastguard Workerfi
298*90c8c64dSAndroid Build Coastguard Worker
299*90c8c64dSAndroid Build Coastguard Worker# Override boot.img with the provided boot image file since fastboot update cmd
300*90c8c64dSAndroid Build Coastguard Worker# will try to flash boot.img in the archive.
301*90c8c64dSAndroid Build Coastguard Workerif [[ ! -z "${OVERRIDE_BOOT_IMAGE_PATH+x}" && -f "$DEVICE_IMAGES_DIR"/boot.img ]]; then
302*90c8c64dSAndroid Build Coastguard Worker  cp "$OVERRIDE_BOOT_IMAGE_PATH" "$DEVICE_IMAGES_DIR"/boot.img
303*90c8c64dSAndroid Build Coastguard Workerfi
304*90c8c64dSAndroid Build Coastguard Worker
305*90c8c64dSAndroid Build Coastguard Worker###
306*90c8c64dSAndroid Build Coastguard Worker# Create the Mixed Build archive.
307*90c8c64dSAndroid Build Coastguard Worker(
308*90c8c64dSAndroid Build Coastguard Worker  cd "$DEVICE_IMAGES_DIR"
309*90c8c64dSAndroid Build Coastguard Worker  zip -r mixed.zip ./*
310*90c8c64dSAndroid Build Coastguard Worker)
311*90c8c64dSAndroid Build Coastguard Worker
312*90c8c64dSAndroid Build Coastguard Worker###
313*90c8c64dSAndroid Build Coastguard Worker# Archive the artifacts.
314*90c8c64dSAndroid Build Coastguard Workerif [ -n "$DIST_DIR" ]; then
315*90c8c64dSAndroid Build Coastguard Worker  mkdir -p "$DIST_DIR" || true
316*90c8c64dSAndroid Build Coastguard Workerfi
317*90c8c64dSAndroid Build Coastguard Worker# Archive all the device artifacts.
318*90c8c64dSAndroid Build Coastguard Workerrsync --archive --verbose --copy-links --exclude='logs' \
319*90c8c64dSAndroid Build Coastguard Worker  "$DEVICE_DIR"/* "$DIST_DIR"
320*90c8c64dSAndroid Build Coastguard Worker# Overwrite the image archive with the Mixed Build archive.
321*90c8c64dSAndroid Build Coastguard WorkerOUT_ARCHIVE="$DIST_DIR"/"$(basename $DEVICE_ARCHIVE)"
322*90c8c64dSAndroid Build Coastguard Workercp "$DEVICE_IMAGES_DIR"/mixed.zip "$OUT_ARCHIVE"
323*90c8c64dSAndroid Build Coastguard Worker# Overwrite android-info.txt with the updated one.
324*90c8c64dSAndroid Build Coastguard Workercp "$DEVICE_IMAGES_DIR"/android-info.txt "$DIST_DIR"/
325