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

Commit 37c0c7c8 authored by Yifan Hong's avatar Yifan Hong
Browse files

Build image for super partition

... for bootstrapping / initializing the device.
Image is built to $(PRODUCT_OUT)/super.img when running
`m dist`. For A/B devices, the image contains other
partitions in the _a slot.

Change-Id: I1459d62f02b95f142dfb3b7608f88ec6801dbf37
Fixes: 111758129
Test: m superimage -j
parent ebc041af
Loading
Loading
Loading
Loading
+58 −13
Original line number Diff line number Diff line
@@ -2556,6 +2556,62 @@ $(INSTALLED_VBMETAIMAGE_TARGET): $(AVBTOOL)

endif # BOARD_AVB_ENABLE

# -----------------------------------------------------------------
# super partition image

# (1): list of items like "system", "vendor", "product", "product_services"
# return: map each item to the corresponding image target.
# system => $(BUILT_SYSTEMIMAGE), vendor => $(INSTALLED_VENDORIMAGE_TARGET), etc.
define image-for-partitions
$(foreach item,$(1),$(or $(strip $(foreach mapping,
            system:$(BUILT_SYSTEMIMAGE)
            product_services:$(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET),
        $(if $(filter $(call word-colon,1,$(mapping)),$(item)),
            $(patsubst $(call word-colon,1,$(mapping)),$(call word-colon,2,$(mapping)),$(item))))),
    $(INSTALLED_$(call to-upper,$(item)IMAGE_TARGET))))
endef

# (1): list of items like "system", "vendor", "product", "product_services"
# return: map each item into a command ( wrapped in $$() ) that reads the size
define read-size-of-partitions
$(foreach p,$(1),$(call read-image-prop-dictionary,$($(p)image_intermediates)/generated_$(p)_image_info.txt,$(p)_size))
endef

ifeq (true,$(USE_LOGICAL_PARTITIONS))

# BOARD_SUPER_PARTITION_SIZE must be defined to build super image.
ifdef BOARD_SUPER_PARTITION_SIZE

INSTALLED_SUPERIMAGE_TARGET := $(PRODUCT_OUT)/super.img
$(INSTALLED_SUPERIMAGE_TARGET): $(call image-for-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST))

# For A/B devices, super partition always contains sub-partitions in the _a slot, because this
# image should only be used for bootstrapping / initializing the device. When flashing the image,
# bootloader fastboot should always mark _a slot as bootable.
ifeq ($(AB_OTA_UPDATER),true)
$(INSTALLED_SUPERIMAGE_TARGET): PRIVATE_PARTITION_SUFFIX=_a
$(INSTALLED_SUPERIMAGE_TARGET): PRIVATE_METADATA_SLOTS=2
else
$(INSTALLED_SUPERIMAGE_TARGET): PRIVATE_METADATA_SLOTS=1
endif # AB_OTA_UPDATER


$(INSTALLED_SUPERIMAGE_TARGET): $(HOST_OUT_EXECUTABLES)/lpmake
	$< \
		--sparse \
		--metadata-size 65536 \
		--metadata-slots $(PRIVATE_METADATA_SLOTS) \
		--device-size $(BOARD_SUPER_PARTITION_SIZE) \
		--output $@ \
		$(foreach name,$(BOARD_SUPER_PARTITION_PARTITION_LIST), \
			--partition $(name)$(PRIVATE_PARTITION_SUFFIX):$$($(UUIDGEN) $(name)$(PRIVATE_PARTITION_SUFFIX)):readonly:$(call read-size-of-partitions,$(name)) \
			--image $(name)$(PRIVATE_PARTITION_SUFFIX)=$(call image-for-partitions,$(name)))

$(call dist-for-goals,dist_files,$(INSTALLED_SUPERIMAGE_TARGET))

endif # BOARD_SUPER_PARTITION_SIZE
endif # USE_LOGICAL_PARTITIONS

# -----------------------------------------------------------------
# Check image sizes <= size of super partition

@@ -2571,21 +2627,10 @@ droid_targets: check_android_partition_sizes
.PHONY: check_android_partition_sizes

# Add image dependencies so that generated_*_image_info.txt are written before checking.
ifneq (,$(filter system,$(BOARD_SUPER_PARTITION_PARTITION_LIST)))
check_android_partition_sizes: $(BUILT_SYSTEMIMAGE)
endif
ifneq (,$(filter vendor,$(BOARD_SUPER_PARTITION_PARTITION_LIST)))
check_android_partition_sizes: $(INSTALLED_VENDORIMAGE_TARGET)
endif
ifneq (,$(filter product,$(BOARD_SUPER_PARTITION_PARTITION_LIST)))
check_android_partition_sizes: $(INSTALLED_PRODUCTIMAGE_TARGET)
endif
ifneq (,$(filter productservices,$(BOARD_SUPER_PARTITION_PARTITION_LIST)))
check_android_partition_sizes: $(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET)
endif
check_android_partition_sizes: $(call image-for-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST))

check_android_partition_sizes:
	partition_size_list="$(foreach p,$(BOARD_SUPER_PARTITION_PARTITION_LIST),$(call read-image-prop-dictionary,$($(p)image_intermediates)/generated_$(p)_image_info.txt,$(p)_size))"; \
	partition_size_list="$(call read-size-of-partitions,$(BOARD_SUPER_PARTITION_PARTITION_LIST))"; \
	sum_sizes_expr=$$(sed -e 's/ /+/g' <<< "$${partition_size_list}"); \
	if [ $$(( $${sum_sizes_expr} )) -gt $(BOARD_SUPER_PARTITION_SIZE) ]; then \
		echo 'The sum of sizes of all logical partitions is larger than BOARD_SUPER_PARTITION_SIZE.'; \
+1 −0
Original line number Diff line number Diff line
@@ -701,6 +701,7 @@ JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar
DATA_BINDING_COMPILER := $(HOST_OUT_JAVA_LIBRARIES)/databinding-compiler.jar
FAT16COPY := build/make/tools/fat16copy.py
CHECK_LINK_TYPE := build/make/tools/check_link_type.py
UUIDGEN := build/make/tools/uuidgen.py

PROGUARD := external/proguard/bin/proguard.sh
JAVATAGS := build/make/tools/java-event-log-tags.py
+3 −0
Original line number Diff line number Diff line
@@ -1190,6 +1190,9 @@ productservicesimage: $(INSTALLED_PRODUCT_SERVICESIMAGE_TARGET)
.PHONY: systemotherimage
systemotherimage: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)

.PHONY: superimage
superimage: $(INSTALLED_SUPERIMAGE_TARGET)

.PHONY: bootimage
bootimage: $(INSTALLED_BOOTIMAGE_TARGET)

tools/uuidgen.py

0 → 100755
+29 −0
Original line number Diff line number Diff line
#!/usr/bin/env python
#
# Copyright 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import print_function
import sys
import uuid

def uuidgen(name):
    return uuid.uuid5(uuid.uuid5(uuid.NAMESPACE_URL, "android.com"), name)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: uuidgen.py <name>")
        sys.exit(1)
    name = sys.argv[1]
    print(uuidgen(name))