Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59dd38cd authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Include complete boot image on builds containing gki apex"

parents d320cbc6 65029a28
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -217,10 +217,13 @@ from __future__ import print_function

import logging
import multiprocessing
import os
import os.path
import re
import shlex
import shutil
import struct
import subprocess
import sys
import zipfile

@@ -968,6 +971,50 @@ def GeneratePartitionTimestampFlagsDowngrade(pre_partition_state, post_partition
    ",".join([key + ":" + val for (key, val) in partition_timestamps.items()])
    ]

def IsSparseImage(filepath):
  with open(filepath, 'rb') as fp:
    # Magic for android sparse image format
    # https://source.android.com/devices/bootloader/images
    return fp.read(4) == b'\x3A\xFF\x26\xED'

def SupportsMainlineGkiUpdates(target_file):
  """Return True if the build supports MainlineGKIUpdates.

  This function scans the product.img file in IMAGES/ directory for
  pattern |*/apex/com.android.gki.*.apex|. If there are files
  matching this pattern, conclude that build supports mainline
  GKI and return True

  Args:
    target_file: Path to a target_file.zip, or an extracted directory
  Return:
    True if thisb uild supports Mainline GKI Updates.
  """
  if target_file is None:
    return False
  if os.path.isfile(target_file):
    target_file = common.UnzipTemp(target_file, ["IMAGES/product.img"])
  if not os.path.isdir(target_file):
    assert os.path.isdir(target_file), \
        "{} must be a path to zip archive or dir containing extracted"\
        " target_files".format(target_file)
  image_file = os.path.join(target_file, "IMAGES", "product.img")

  if not os.path.isfile(image_file):
    return False

  if IsSparseImage(image_file):
    # Unsparse the image
    tmp_img = common.MakeTempFile(suffix=".img")
    subprocess.check_output(["simg2img", image_file, tmp_img])
    image_file = tmp_img

  cmd = ["debugfs_static", "-R", "ls -p /apex", image_file]
  output = subprocess.check_output(cmd).decode()

  pattern = re.compile(r"com\.android\.gki\..*\.apex")
  return pattern.search(output) is not None

def GenerateAbOtaPackage(target_file, output_file, source_file=None):
  """Generates an Android OTA package that has A/B update payload."""
  # Stage the output zip package for package signing.
@@ -1039,6 +1086,10 @@ def GenerateAbOtaPackage(target_file, output_file, source_file=None):

  additional_args += ["--max_timestamp", max_timestamp]

  if SupportsMainlineGkiUpdates(source_file):
    logger.info("Detected build with mainline GKI, include full boot image.")
    additional_args.extend(["--full_boot", "true"])

  payload.Generate(
      target_file,
      source_file,