1*800a58d9SAndroid Build Coastguard Worker# Copyright 2019 - The Android Open Source Project 2*800a58d9SAndroid Build Coastguard Worker# 3*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*800a58d9SAndroid Build Coastguard Worker# 7*800a58d9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*800a58d9SAndroid Build Coastguard Worker# 9*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*800a58d9SAndroid Build Coastguard Worker# limitations under the License. 14*800a58d9SAndroid Build Coastguard Worker"""OtaTools class.""" 15*800a58d9SAndroid Build Coastguard Worker 16*800a58d9SAndroid Build Coastguard Workerimport logging 17*800a58d9SAndroid Build Coastguard Workerimport os 18*800a58d9SAndroid Build Coastguard Workerimport tempfile 19*800a58d9SAndroid Build Coastguard Worker 20*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors 21*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils 22*800a58d9SAndroid Build Coastguard Worker 23*800a58d9SAndroid Build Coastguard Workerlogger = logging.getLogger(__name__) 24*800a58d9SAndroid Build Coastguard Worker 25*800a58d9SAndroid Build Coastguard Worker_BIN_DIR_NAME = "bin" 26*800a58d9SAndroid Build Coastguard Worker_LPMAKE = "lpmake" 27*800a58d9SAndroid Build Coastguard Worker_BUILD_SUPER_IMAGE = "build_super_image" 28*800a58d9SAndroid Build Coastguard Worker_AVBTOOL = "avbtool" 29*800a58d9SAndroid Build Coastguard Worker_SGDISK = "sgdisk" 30*800a58d9SAndroid Build Coastguard Worker_SIMG2IMG = "simg2img" 31*800a58d9SAndroid Build Coastguard Worker_MK_COMBINED_IMG = "mk_combined_img" 32*800a58d9SAndroid Build Coastguard Worker_UNPACK_BOOTIMG = "unpack_bootimg" 33*800a58d9SAndroid Build Coastguard Worker 34*800a58d9SAndroid Build Coastguard Worker_BUILD_SUPER_IMAGE_TIMEOUT_SECS = 30 35*800a58d9SAndroid Build Coastguard Worker_AVBTOOL_TIMEOUT_SECS = 30 36*800a58d9SAndroid Build Coastguard Worker_MK_COMBINED_IMG_TIMEOUT_SECS = 180 37*800a58d9SAndroid Build Coastguard Worker_UNPACK_BOOTIMG_TIMEOUT_SECS = 30 38*800a58d9SAndroid Build Coastguard Worker 39*800a58d9SAndroid Build Coastguard Worker_MISSING_OTA_TOOLS_MSG = ("%(tool_name)s is not found. Run `make otatools` " 40*800a58d9SAndroid Build Coastguard Worker "in build environment, or set --local-tool to an " 41*800a58d9SAndroid Build Coastguard Worker "extracted otatools.zip.") 42*800a58d9SAndroid Build Coastguard Worker 43*800a58d9SAndroid Build Coastguard Worker 44*800a58d9SAndroid Build Coastguard Workerdef FindOtaToolsDir(search_paths): 45*800a58d9SAndroid Build Coastguard Worker """Find OTA tools directory in the search paths. 46*800a58d9SAndroid Build Coastguard Worker 47*800a58d9SAndroid Build Coastguard Worker Args: 48*800a58d9SAndroid Build Coastguard Worker search_paths: List of paths, the directories to search for OTA tools. 49*800a58d9SAndroid Build Coastguard Worker 50*800a58d9SAndroid Build Coastguard Worker Returns: 51*800a58d9SAndroid Build Coastguard Worker The directory containing OTA tools. 52*800a58d9SAndroid Build Coastguard Worker 53*800a58d9SAndroid Build Coastguard Worker Raises: 54*800a58d9SAndroid Build Coastguard Worker errors.CheckPathError if OTA tools are not found. 55*800a58d9SAndroid Build Coastguard Worker """ 56*800a58d9SAndroid Build Coastguard Worker for search_path in search_paths: 57*800a58d9SAndroid Build Coastguard Worker if os.path.isfile(os.path.join(search_path, _BIN_DIR_NAME, 58*800a58d9SAndroid Build Coastguard Worker _BUILD_SUPER_IMAGE)): 59*800a58d9SAndroid Build Coastguard Worker return search_path 60*800a58d9SAndroid Build Coastguard Worker raise errors.CheckPathError(_MISSING_OTA_TOOLS_MSG % 61*800a58d9SAndroid Build Coastguard Worker {"tool_name": "OTA tool directory"}) 62*800a58d9SAndroid Build Coastguard Worker 63*800a58d9SAndroid Build Coastguard Worker 64*800a58d9SAndroid Build Coastguard Workerdef FindOtaTools(search_paths): 65*800a58d9SAndroid Build Coastguard Worker """Find OTA tools in the search paths. 66*800a58d9SAndroid Build Coastguard Worker 67*800a58d9SAndroid Build Coastguard Worker Args: 68*800a58d9SAndroid Build Coastguard Worker search_paths: List of paths, the directories to search for OTA tools. 69*800a58d9SAndroid Build Coastguard Worker 70*800a58d9SAndroid Build Coastguard Worker Returns: 71*800a58d9SAndroid Build Coastguard Worker An OtaTools object. 72*800a58d9SAndroid Build Coastguard Worker 73*800a58d9SAndroid Build Coastguard Worker Raises: 74*800a58d9SAndroid Build Coastguard Worker errors.CheckPathError if OTA tools are not found. 75*800a58d9SAndroid Build Coastguard Worker """ 76*800a58d9SAndroid Build Coastguard Worker return OtaTools(FindOtaToolsDir(search_paths)) 77*800a58d9SAndroid Build Coastguard Worker 78*800a58d9SAndroid Build Coastguard Worker 79*800a58d9SAndroid Build Coastguard Workerdef GetImageForPartition(partition_name, image_dir, **image_paths): 80*800a58d9SAndroid Build Coastguard Worker """Map a partition name to an image path. 81*800a58d9SAndroid Build Coastguard Worker 82*800a58d9SAndroid Build Coastguard Worker This function is used with BuildSuperImage or MkCombinedImg to mix 83*800a58d9SAndroid Build Coastguard Worker image_dir and image_paths into the output file. 84*800a58d9SAndroid Build Coastguard Worker 85*800a58d9SAndroid Build Coastguard Worker Args: 86*800a58d9SAndroid Build Coastguard Worker partition_name: String, e.g., "system", "product", and "vendor". 87*800a58d9SAndroid Build Coastguard Worker image_dir: String, the directory to search for the images that are not 88*800a58d9SAndroid Build Coastguard Worker given in image_paths. 89*800a58d9SAndroid Build Coastguard Worker image_paths: Pairs of partition names and image paths. 90*800a58d9SAndroid Build Coastguard Worker 91*800a58d9SAndroid Build Coastguard Worker Returns: 92*800a58d9SAndroid Build Coastguard Worker The image path if the partition is in image_paths. 93*800a58d9SAndroid Build Coastguard Worker Otherwise, this function returns the path under image_dir. 94*800a58d9SAndroid Build Coastguard Worker 95*800a58d9SAndroid Build Coastguard Worker Raises 96*800a58d9SAndroid Build Coastguard Worker errors.GetLocalImageError if the image does not exist. 97*800a58d9SAndroid Build Coastguard Worker """ 98*800a58d9SAndroid Build Coastguard Worker image_path = (image_paths.get(partition_name) or 99*800a58d9SAndroid Build Coastguard Worker os.path.join(image_dir, partition_name + ".img")) 100*800a58d9SAndroid Build Coastguard Worker if not os.path.isfile(image_path): 101*800a58d9SAndroid Build Coastguard Worker raise errors.GetLocalImageError( 102*800a58d9SAndroid Build Coastguard Worker "Cannot find image for partition %s" % partition_name) 103*800a58d9SAndroid Build Coastguard Worker return image_path 104*800a58d9SAndroid Build Coastguard Worker 105*800a58d9SAndroid Build Coastguard Worker 106*800a58d9SAndroid Build Coastguard Workerclass OtaTools: 107*800a58d9SAndroid Build Coastguard Worker """The class that executes OTA tool commands.""" 108*800a58d9SAndroid Build Coastguard Worker 109*800a58d9SAndroid Build Coastguard Worker def __init__(self, ota_tools_dir): 110*800a58d9SAndroid Build Coastguard Worker self._ota_tools_dir = os.path.abspath(ota_tools_dir) 111*800a58d9SAndroid Build Coastguard Worker 112*800a58d9SAndroid Build Coastguard Worker def _GetBinary(self, name): 113*800a58d9SAndroid Build Coastguard Worker """Get an executable file from _ota_tools_dir. 114*800a58d9SAndroid Build Coastguard Worker 115*800a58d9SAndroid Build Coastguard Worker Args: 116*800a58d9SAndroid Build Coastguard Worker name: String, the file name. 117*800a58d9SAndroid Build Coastguard Worker 118*800a58d9SAndroid Build Coastguard Worker Returns: 119*800a58d9SAndroid Build Coastguard Worker String, the absolute path. 120*800a58d9SAndroid Build Coastguard Worker 121*800a58d9SAndroid Build Coastguard Worker Raises: 122*800a58d9SAndroid Build Coastguard Worker errors.NoExecuteCmd if the file does not exist. 123*800a58d9SAndroid Build Coastguard Worker """ 124*800a58d9SAndroid Build Coastguard Worker path = os.path.join(self._ota_tools_dir, _BIN_DIR_NAME, name) 125*800a58d9SAndroid Build Coastguard Worker if not os.path.isfile(path): 126*800a58d9SAndroid Build Coastguard Worker raise errors.NoExecuteCmd(_MISSING_OTA_TOOLS_MSG % 127*800a58d9SAndroid Build Coastguard Worker {"tool_name": name}) 128*800a58d9SAndroid Build Coastguard Worker utils.SetExecutable(path) 129*800a58d9SAndroid Build Coastguard Worker return path 130*800a58d9SAndroid Build Coastguard Worker 131*800a58d9SAndroid Build Coastguard Worker @staticmethod 132*800a58d9SAndroid Build Coastguard Worker def _RewriteMiscInfo(output_file, input_file, lpmake_path, get_image): 133*800a58d9SAndroid Build Coastguard Worker """Rewrite lpmake and image paths in misc_info.txt. 134*800a58d9SAndroid Build Coastguard Worker 135*800a58d9SAndroid Build Coastguard Worker Misc info consists of multiple lines of <key>=<value>. 136*800a58d9SAndroid Build Coastguard Worker Sample input_file: 137*800a58d9SAndroid Build Coastguard Worker lpmake=lpmake 138*800a58d9SAndroid Build Coastguard Worker dynamic_partition_list= system system_ext product vendor 139*800a58d9SAndroid Build Coastguard Worker 140*800a58d9SAndroid Build Coastguard Worker Sample output_file: 141*800a58d9SAndroid Build Coastguard Worker lpmake=/path/to/lpmake 142*800a58d9SAndroid Build Coastguard Worker dynamic_partition_list= system system_ext product vendor 143*800a58d9SAndroid Build Coastguard Worker system_image=/path/to/system.img 144*800a58d9SAndroid Build Coastguard Worker system_ext_image=/path/to/system_ext.img 145*800a58d9SAndroid Build Coastguard Worker product_image=/path/to/product.img 146*800a58d9SAndroid Build Coastguard Worker vendor_image=/path/to/vendor.img 147*800a58d9SAndroid Build Coastguard Worker 148*800a58d9SAndroid Build Coastguard Worker This method replaces lpmake with the specified path, and sets 149*800a58d9SAndroid Build Coastguard Worker *_image for every partition in dynamic_partition_list. 150*800a58d9SAndroid Build Coastguard Worker 151*800a58d9SAndroid Build Coastguard Worker Args: 152*800a58d9SAndroid Build Coastguard Worker output_file: The output file object. 153*800a58d9SAndroid Build Coastguard Worker input_file: The input file object. 154*800a58d9SAndroid Build Coastguard Worker lpmake_path: The path to lpmake binary. 155*800a58d9SAndroid Build Coastguard Worker get_image: A function that takes the partition name as the 156*800a58d9SAndroid Build Coastguard Worker parameter and returns the image path. 157*800a58d9SAndroid Build Coastguard Worker """ 158*800a58d9SAndroid Build Coastguard Worker partition_names = () 159*800a58d9SAndroid Build Coastguard Worker for line in input_file: 160*800a58d9SAndroid Build Coastguard Worker split_line = line.strip().split("=", 1) 161*800a58d9SAndroid Build Coastguard Worker if len(split_line) < 2: 162*800a58d9SAndroid Build Coastguard Worker split_line = (split_line[0], "") 163*800a58d9SAndroid Build Coastguard Worker if split_line[0] == "dynamic_partition_list": 164*800a58d9SAndroid Build Coastguard Worker partition_names = split_line[1].split() 165*800a58d9SAndroid Build Coastguard Worker elif split_line[0] == "lpmake": 166*800a58d9SAndroid Build Coastguard Worker output_file.write("lpmake=%s\n" % lpmake_path) 167*800a58d9SAndroid Build Coastguard Worker continue 168*800a58d9SAndroid Build Coastguard Worker elif split_line[0].endswith("_image"): 169*800a58d9SAndroid Build Coastguard Worker continue 170*800a58d9SAndroid Build Coastguard Worker output_file.write(line) 171*800a58d9SAndroid Build Coastguard Worker 172*800a58d9SAndroid Build Coastguard Worker if not partition_names: 173*800a58d9SAndroid Build Coastguard Worker logger.w("No dynamic partition list in misc info.") 174*800a58d9SAndroid Build Coastguard Worker 175*800a58d9SAndroid Build Coastguard Worker for partition_name in partition_names: 176*800a58d9SAndroid Build Coastguard Worker output_file.write("%s_image=%s\n" % 177*800a58d9SAndroid Build Coastguard Worker (partition_name, get_image(partition_name))) 178*800a58d9SAndroid Build Coastguard Worker 179*800a58d9SAndroid Build Coastguard Worker @utils.TimeExecute(function_description="Build super image") 180*800a58d9SAndroid Build Coastguard Worker @utils.TimeoutException(_BUILD_SUPER_IMAGE_TIMEOUT_SECS) 181*800a58d9SAndroid Build Coastguard Worker def BuildSuperImage(self, output_path, misc_info_path, get_image): 182*800a58d9SAndroid Build Coastguard Worker """Use build_super_image to create a super image. 183*800a58d9SAndroid Build Coastguard Worker 184*800a58d9SAndroid Build Coastguard Worker Args: 185*800a58d9SAndroid Build Coastguard Worker output_path: The path to the output super image. 186*800a58d9SAndroid Build Coastguard Worker misc_info_path: The path to the misc info that provides parameters 187*800a58d9SAndroid Build Coastguard Worker to create the super image. 188*800a58d9SAndroid Build Coastguard Worker get_image: A function that takes the partition name as the 189*800a58d9SAndroid Build Coastguard Worker parameter and returns the image path. 190*800a58d9SAndroid Build Coastguard Worker """ 191*800a58d9SAndroid Build Coastguard Worker build_super_image = self._GetBinary(_BUILD_SUPER_IMAGE) 192*800a58d9SAndroid Build Coastguard Worker lpmake = self._GetBinary(_LPMAKE) 193*800a58d9SAndroid Build Coastguard Worker 194*800a58d9SAndroid Build Coastguard Worker new_misc_info_path = None 195*800a58d9SAndroid Build Coastguard Worker try: 196*800a58d9SAndroid Build Coastguard Worker with open(misc_info_path, "r") as misc_info: 197*800a58d9SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile( 198*800a58d9SAndroid Build Coastguard Worker prefix="misc_info_", suffix=".txt", 199*800a58d9SAndroid Build Coastguard Worker delete=False, mode="w") as new_misc_info: 200*800a58d9SAndroid Build Coastguard Worker new_misc_info_path = new_misc_info.name 201*800a58d9SAndroid Build Coastguard Worker self._RewriteMiscInfo(new_misc_info, misc_info, lpmake, 202*800a58d9SAndroid Build Coastguard Worker get_image) 203*800a58d9SAndroid Build Coastguard Worker 204*800a58d9SAndroid Build Coastguard Worker utils.Popen(build_super_image, new_misc_info_path, output_path) 205*800a58d9SAndroid Build Coastguard Worker finally: 206*800a58d9SAndroid Build Coastguard Worker if new_misc_info_path: 207*800a58d9SAndroid Build Coastguard Worker os.remove(new_misc_info_path) 208*800a58d9SAndroid Build Coastguard Worker 209*800a58d9SAndroid Build Coastguard Worker @utils.TimeExecute(function_description="Make disabled vbmeta image.") 210*800a58d9SAndroid Build Coastguard Worker @utils.TimeoutException(_AVBTOOL_TIMEOUT_SECS) 211*800a58d9SAndroid Build Coastguard Worker def MakeDisabledVbmetaImage(self, output_path): 212*800a58d9SAndroid Build Coastguard Worker """Use avbtool to create a vbmeta image with verification disabled. 213*800a58d9SAndroid Build Coastguard Worker 214*800a58d9SAndroid Build Coastguard Worker Args: 215*800a58d9SAndroid Build Coastguard Worker output_path: The path to the output vbmeta image. 216*800a58d9SAndroid Build Coastguard Worker """ 217*800a58d9SAndroid Build Coastguard Worker avbtool = self._GetBinary(_AVBTOOL) 218*800a58d9SAndroid Build Coastguard Worker utils.Popen(avbtool, "make_vbmeta_image", 219*800a58d9SAndroid Build Coastguard Worker "--flag", "2", 220*800a58d9SAndroid Build Coastguard Worker "--padding_size", "4096", 221*800a58d9SAndroid Build Coastguard Worker "--output", output_path) 222*800a58d9SAndroid Build Coastguard Worker 223*800a58d9SAndroid Build Coastguard Worker @staticmethod 224*800a58d9SAndroid Build Coastguard Worker def _RewriteSystemQemuConfig(output_file, input_file, get_image): 225*800a58d9SAndroid Build Coastguard Worker """Rewrite image paths in system-qemu-config.txt. 226*800a58d9SAndroid Build Coastguard Worker 227*800a58d9SAndroid Build Coastguard Worker Sample input_file: 228*800a58d9SAndroid Build Coastguard Worker out/target/product/generic_x86_64/vbmeta.img vbmeta 1 229*800a58d9SAndroid Build Coastguard Worker out/target/product/generic_x86_64/super.img super 2 230*800a58d9SAndroid Build Coastguard Worker 231*800a58d9SAndroid Build Coastguard Worker Sample output_file: 232*800a58d9SAndroid Build Coastguard Worker /path/to/vbmeta.img vbmeta 1 233*800a58d9SAndroid Build Coastguard Worker /path/to/super.img super 2 234*800a58d9SAndroid Build Coastguard Worker 235*800a58d9SAndroid Build Coastguard Worker This method replaces the first entry of each line with the path 236*800a58d9SAndroid Build Coastguard Worker returned by get_image. 237*800a58d9SAndroid Build Coastguard Worker 238*800a58d9SAndroid Build Coastguard Worker Args: 239*800a58d9SAndroid Build Coastguard Worker output_file: The output file object. 240*800a58d9SAndroid Build Coastguard Worker input_file: The input file object. 241*800a58d9SAndroid Build Coastguard Worker get_image: A function that takes the partition name as the 242*800a58d9SAndroid Build Coastguard Worker parameter and returns the image path. 243*800a58d9SAndroid Build Coastguard Worker """ 244*800a58d9SAndroid Build Coastguard Worker for line in input_file: 245*800a58d9SAndroid Build Coastguard Worker split_line = line.split() 246*800a58d9SAndroid Build Coastguard Worker if len(split_line) == 3: 247*800a58d9SAndroid Build Coastguard Worker output_file.write("%s %s %s\n" % (get_image(split_line[1]), 248*800a58d9SAndroid Build Coastguard Worker split_line[1], 249*800a58d9SAndroid Build Coastguard Worker split_line[2])) 250*800a58d9SAndroid Build Coastguard Worker else: 251*800a58d9SAndroid Build Coastguard Worker output_file.write(line) 252*800a58d9SAndroid Build Coastguard Worker 253*800a58d9SAndroid Build Coastguard Worker @utils.TimeExecute(function_description="Make combined image") 254*800a58d9SAndroid Build Coastguard Worker @utils.TimeoutException(_MK_COMBINED_IMG_TIMEOUT_SECS) 255*800a58d9SAndroid Build Coastguard Worker def MkCombinedImg(self, output_path, system_qemu_config_path, get_image): 256*800a58d9SAndroid Build Coastguard Worker """Use mk_combined_img to create a disk image. 257*800a58d9SAndroid Build Coastguard Worker 258*800a58d9SAndroid Build Coastguard Worker Args: 259*800a58d9SAndroid Build Coastguard Worker output_path: The path to the output disk image. 260*800a58d9SAndroid Build Coastguard Worker system_qemu_config: The path to the config that provides the 261*800a58d9SAndroid Build Coastguard Worker parition information on the disk. 262*800a58d9SAndroid Build Coastguard Worker get_image: A function that takes the partition name as the 263*800a58d9SAndroid Build Coastguard Worker parameter and returns the image path. 264*800a58d9SAndroid Build Coastguard Worker """ 265*800a58d9SAndroid Build Coastguard Worker mk_combined_img = self._GetBinary(_MK_COMBINED_IMG) 266*800a58d9SAndroid Build Coastguard Worker sgdisk = self._GetBinary(_SGDISK) 267*800a58d9SAndroid Build Coastguard Worker simg2img = self._GetBinary(_SIMG2IMG) 268*800a58d9SAndroid Build Coastguard Worker 269*800a58d9SAndroid Build Coastguard Worker new_config_path = None 270*800a58d9SAndroid Build Coastguard Worker try: 271*800a58d9SAndroid Build Coastguard Worker with open(system_qemu_config_path, "r") as config: 272*800a58d9SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile( 273*800a58d9SAndroid Build Coastguard Worker prefix="system-qemu-config_", suffix=".txt", 274*800a58d9SAndroid Build Coastguard Worker delete=False, mode="w") as new_config: 275*800a58d9SAndroid Build Coastguard Worker new_config_path = new_config.name 276*800a58d9SAndroid Build Coastguard Worker self._RewriteSystemQemuConfig(new_config, config, 277*800a58d9SAndroid Build Coastguard Worker get_image) 278*800a58d9SAndroid Build Coastguard Worker 279*800a58d9SAndroid Build Coastguard Worker mk_combined_img_env = {"SGDISK": sgdisk, "SIMG2IMG": simg2img} 280*800a58d9SAndroid Build Coastguard Worker utils.Popen(mk_combined_img, 281*800a58d9SAndroid Build Coastguard Worker "-i", new_config_path, 282*800a58d9SAndroid Build Coastguard Worker "-o", output_path, 283*800a58d9SAndroid Build Coastguard Worker env=mk_combined_img_env) 284*800a58d9SAndroid Build Coastguard Worker finally: 285*800a58d9SAndroid Build Coastguard Worker if new_config_path: 286*800a58d9SAndroid Build Coastguard Worker os.remove(new_config_path) 287*800a58d9SAndroid Build Coastguard Worker 288*800a58d9SAndroid Build Coastguard Worker @utils.TimeExecute(function_description="Unpack boot image") 289*800a58d9SAndroid Build Coastguard Worker @utils.TimeoutException(_UNPACK_BOOTIMG_TIMEOUT_SECS) 290*800a58d9SAndroid Build Coastguard Worker def UnpackBootImg(self, out_dir, boot_img): 291*800a58d9SAndroid Build Coastguard Worker """Use unpack_bootimg to unpack a boot image to a direcotry. 292*800a58d9SAndroid Build Coastguard Worker 293*800a58d9SAndroid Build Coastguard Worker Args: 294*800a58d9SAndroid Build Coastguard Worker out_dir: The output directory. 295*800a58d9SAndroid Build Coastguard Worker boot_img: The path to the boot image. 296*800a58d9SAndroid Build Coastguard Worker """ 297*800a58d9SAndroid Build Coastguard Worker unpack_bootimg = self._GetBinary(_UNPACK_BOOTIMG) 298*800a58d9SAndroid Build Coastguard Worker utils.Popen(unpack_bootimg, 299*800a58d9SAndroid Build Coastguard Worker "--out", out_dir, 300*800a58d9SAndroid Build Coastguard Worker "--boot_img", boot_img) 301*800a58d9SAndroid Build Coastguard Worker 302*800a58d9SAndroid Build Coastguard Worker def MixSuperImage(self, super_image, misc_info, image_dir, 303*800a58d9SAndroid Build Coastguard Worker system_image=None, system_ext_image=None, 304*800a58d9SAndroid Build Coastguard Worker product_image=None, system_dlkm_image=None, 305*800a58d9SAndroid Build Coastguard Worker vendor_image=None, vendor_dlkm_image=None, 306*800a58d9SAndroid Build Coastguard Worker odm_image=None, odm_dlkm_image=None): 307*800a58d9SAndroid Build Coastguard Worker """Create mixed super image from device images and given partition 308*800a58d9SAndroid Build Coastguard Worker images. 309*800a58d9SAndroid Build Coastguard Worker 310*800a58d9SAndroid Build Coastguard Worker Args: 311*800a58d9SAndroid Build Coastguard Worker super_image: Path to the output super image. 312*800a58d9SAndroid Build Coastguard Worker misc_info: Path to the misc_info.txt. 313*800a58d9SAndroid Build Coastguard Worker image_dir: Path to image files excluding system image. 314*800a58d9SAndroid Build Coastguard Worker system_image: Path to the system image. 315*800a58d9SAndroid Build Coastguard Worker system_ext_image: Path to the system_ext image. 316*800a58d9SAndroid Build Coastguard Worker product_image: Path to the product image. 317*800a58d9SAndroid Build Coastguard Worker system_dlkm_image: Path to the system_dlkm image. 318*800a58d9SAndroid Build Coastguard Worker vendor_image: Path to the vendor image. 319*800a58d9SAndroid Build Coastguard Worker vendor_dlkm_image: Path to the vendor_dlkm image. 320*800a58d9SAndroid Build Coastguard Worker odm_image: Path to the odm image. 321*800a58d9SAndroid Build Coastguard Worker odm_dlkm_image: Path to the odm_dlkm image. 322*800a58d9SAndroid Build Coastguard Worker """ 323*800a58d9SAndroid Build Coastguard Worker self.BuildSuperImage( 324*800a58d9SAndroid Build Coastguard Worker super_image, misc_info, 325*800a58d9SAndroid Build Coastguard Worker lambda partition: GetImageForPartition( 326*800a58d9SAndroid Build Coastguard Worker partition, image_dir, 327*800a58d9SAndroid Build Coastguard Worker system=system_image, 328*800a58d9SAndroid Build Coastguard Worker system_ext=system_ext_image, 329*800a58d9SAndroid Build Coastguard Worker product=product_image, 330*800a58d9SAndroid Build Coastguard Worker system_dlkm=system_dlkm_image, 331*800a58d9SAndroid Build Coastguard Worker vendor=vendor_image, 332*800a58d9SAndroid Build Coastguard Worker vendor_dlkm=vendor_dlkm_image, 333*800a58d9SAndroid Build Coastguard Worker odm=odm_image, 334*800a58d9SAndroid Build Coastguard Worker odm_dlkm=odm_dlkm_image)) 335