xref: /aosp_15_r20/tools/acloud/internal/lib/ota_tools.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
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