Add system_other partition, install odex files
For AB devices, support flashing two system partitions for factory use.
The normal system image on one partition, but without dex preopt. And a
system_other image that just contains the odex files. The dex files will
not be stripped out of the system image, in case the second system
partition is wiped.
Setting BOARD_USES_SYSTEM_OTHER_ODEX := true in the BoardConfig.mk
enables this behavior.
One can control which directories are placed in system_other by the
SYSTEM_OTHER_ODEX_FILTER configuration variable. Currently we default
to only copying only app and priv-app odexs.
Bug: 29278988
Change-Id: I7f4e87da919e7dc6a89fd8c668193cd4e98631bc
diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
index 7cb9072..ddc0d0b 100755
--- a/tools/releasetools/add_img_to_target_files.py
+++ b/tools/releasetools/add_img_to_target_files.py
@@ -78,6 +78,24 @@
return CreateImage(input_dir, info_dict, "system", block_list=block_list)
+def AddSystemOther(output_zip, prefix="IMAGES/"):
+ """Turn the contents of SYSTEM_OTHER into a system_other image
+ and store it in output_zip."""
+
+ prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "system_other.img")
+ if os.path.exists(prebuilt_path):
+ print "system_other.img already exists in %s, no need to rebuild..." % (prefix,)
+ return
+
+ imgname = BuildSystemOther(OPTIONS.input_tmp, OPTIONS.info_dict)
+ common.ZipWrite(output_zip, imgname, prefix + "system_other.img")
+
+def BuildSystemOther(input_dir, info_dict):
+ """Build the (sparse) system_other image and return the name of a temp
+ file containing it."""
+ return CreateImage(input_dir, info_dict, "system_other", block_list=None)
+
+
def AddVendor(output_zip, prefix="IMAGES/"):
"""Turn the contents of VENDOR into a vendor image and store in it
output_zip."""
@@ -268,6 +286,8 @@
except KeyError:
has_vendor = False
+ has_system_other = "SYSTEM_OTHER/" in input_zip.namelist()
+
OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.input_tmp)
common.ZipClose(input_zip)
@@ -314,6 +334,9 @@
if has_vendor:
banner("vendor")
AddVendor(output_zip)
+ if has_system_other:
+ banner("system_other")
+ AddSystemOther(output_zip)
banner("userdata")
AddUserdata(output_zip)
banner("cache")
diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
index 3d41e83..a9217ee 100755
--- a/tools/releasetools/build_image.py
+++ b/tools/releasetools/build_image.py
@@ -556,6 +556,19 @@
copy_prop("system_squashfs_block_size", "squashfs_block_size")
copy_prop("system_squashfs_disable_4k_align", "squashfs_disable_4k_align")
copy_prop("system_base_fs_file", "base_fs_file")
+ elif mount_point == "system_other":
+ # We inherit the selinux policies of /system since we contain some of its files.
+ d["mount_point"] = "system"
+ copy_prop("fs_type", "fs_type")
+ copy_prop("system_fs_type", "fs_type")
+ copy_prop("system_size", "partition_size")
+ copy_prop("system_journal_size", "journal_size")
+ copy_prop("system_verity_block_device", "verity_block_device")
+ copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
+ copy_prop("system_squashfs_compressor", "squashfs_compressor")
+ copy_prop("system_squashfs_compressor_opt", "squashfs_compressor_opt")
+ copy_prop("system_squashfs_block_size", "squashfs_block_size")
+ copy_prop("system_base_fs_file", "base_fs_file")
elif mount_point == "data":
# Copy the generic fs type first, override with specific one if available.
copy_prop("fs_type", "fs_type")
@@ -618,6 +631,8 @@
mount_point = ""
if image_filename == "system.img":
mount_point = "system"
+ elif image_filename == "system_other.img":
+ mount_point = "system_other"
elif image_filename == "userdata.img":
mount_point = "data"
elif image_filename == "cache.img":