Merge "Reject Google's build of JDK."
diff --git a/core/Makefile b/core/Makefile
index 7acf162..cb3074f 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -1407,6 +1407,36 @@
# -----------------------------------------------------------------
+# partition table image
+ifdef BOARD_BPT_INPUT_FILES
+
+BUILT_BPTIMAGE_TARGET := $(PRODUCT_OUT)/partition-table.img
+
+INTERNAL_BVBTOOL_MAKE_TABLE_ARGS := \
+ --output_gpt $(BUILT_BPTIMAGE_TARGET) \
+ --output_json $(PRODUCT_OUT)/partition-table.bpt \
+ $(foreach file, $(BOARD_BPT_INPUT_FILES), --input $(file))
+
+ifdef BOARD_BPT_DISK_SIZE
+INTERNAL_BVBTOOL_MAKE_TABLE_ARGS += --disk_size $(BOARD_BPT_DISK_SIZE)
+endif
+
+define build-bptimage-target
+ $(call pretty,"Target partition table image: $(INSTALLED_BPTIMAGE_TARGET)")
+ $(hide) $(BPTTOOL) make_table $(INTERNAL_BVBTOOL_MAKE_TABLE_ARGS) $(BOARD_BPT_MAKE_TABLE_ARGS)
+endef
+
+INSTALLED_BPTIMAGE_TARGET := $(BUILT_BPTIMAGE_TARGET)
+$(INSTALLED_BPTIMAGE_TARGET): $(BPTTOOL) $(BOARD_BPT_INPUT_FILES)
+ $(build-bptimage-target)
+
+.PHONY: bptimage-nodeps
+bptimage-nodeps:
+ $(build-bptimage-target)
+
+endif # BOARD_BPT_INPUT_FILES
+
+# -----------------------------------------------------------------
# cache partition image
ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
INTERNAL_CACHEIMAGE_FILES := \
@@ -1812,6 +1842,14 @@
$(hide) echo "board_bvb_rollback_index=$(BOARD_BVB_ROLLBACK_INDEX)" >> $(zip_root)/META/misc_info.txt
$(hide) echo "board_bvb_add_image_hashes_args=$(BOARD_BVB_ADD_IMAGE_HASHES_ARGS)" >> $(zip_root)/META/misc_info.txt
endif
+ifdef BOARD_BPT_INPUT_FILES
+ $(hide) echo "board_bpt_enable=true" >> $(zip_root)/META/misc_info.txt
+ $(hide) echo "board_bpt_make_table_args=$(BOARD_BPT_MAKE_TABLE_ARGS)" >> $(zip_root)/META/misc_info.txt
+ $(hide) echo "board_bpt_input_files=$(BOARD_BPT_INPUT_FILES)" >> $(zip_root)/META/misc_info.txt
+endif
+ifdef BOARD_BPT_DISK_SIZE
+ $(hide) echo "board_bpt_disk_size=$(BOARD_BPT_DISK_SIZE)" >> $(zip_root)/META/misc_info.txt
+endif
$(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt)
ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
diff --git a/core/config.mk b/core/config.mk
index 6df4430..e63a135 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -525,6 +525,11 @@
else
MKBOOTIMG := $(BOARD_CUSTOM_MKBOOTIMG)
endif
+ifeq (,$(strip $(BOARD_CUSTOM_BPTTOOL)))
+BPTTOOL := $(HOST_OUT_EXECUTABLES)/bpttool$(HOST_EXECUTABLE_SUFFIX)
+else
+BPTTOOL := $(BOARD_CUSTOM_BPTTOOL)
+endif
ifeq (,$(strip $(BOARD_CUSTOM_BVBTOOL)))
BVBTOOL := $(HOST_OUT_EXECUTABLES)/bvbtool$(HOST_EXECUTABLE_SUFFIX)
else
diff --git a/core/main.mk b/core/main.mk
index e57d304..ad1b663 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -77,6 +77,7 @@
stnod systemtarball-nodeps \
userdataimage-nodeps userdatatarball-nodeps \
cacheimage-nodeps \
+ bptimage-nodeps \
vendorimage-nodeps \
ramdisk-nodeps \
bootimage-nodeps \
@@ -916,6 +917,9 @@
.PHONY: cacheimage
cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)
+.PHONY: bptimage
+bptimage: $(INSTALLED_BPTIMAGE_TARGET)
+
.PHONY: vendorimage
vendorimage: $(INSTALLED_VENDORIMAGE_TARGET)
@@ -945,6 +949,7 @@
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
+ $(INSTALLED_BPTIMAGE_TARGET) \
$(INSTALLED_VENDORIMAGE_TARGET) \
$(INSTALLED_FILES_FILE) \
$(INSTALLED_FILES_FILE_VENDOR)
diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
index d0027dc..f98a281 100755
--- a/tools/releasetools/add_img_to_target_files.py
+++ b/tools/releasetools/add_img_to_target_files.py
@@ -228,6 +228,35 @@
shutil.rmtree(temp_dir)
+def AddPartitionTable(output_zip, prefix="IMAGES/"):
+ """Create a partition table image and store it in output_zip."""
+
+ _, img_file_name = tempfile.mkstemp()
+ _, bpt_file_name = tempfile.mkstemp()
+
+ # use BPTTOOL from environ, or "bpttool" if empty or not set.
+ bpttool = os.getenv("BPTTOOL") or "bpttool"
+ cmd = [bpttool, "make_table", "--output_json", bpt_file_name,
+ "--output_gpt", img_file_name]
+ input_files_str = OPTIONS.info_dict["board_bpt_input_files"]
+ input_files = input_files_str.split(" ")
+ for i in input_files:
+ cmd.extend(["--input", i])
+ disk_size = OPTIONS.info_dict.get("board_bpt_disk_size")
+ if disk_size:
+ cmd.extend(["--disk_size", disk_size])
+ args = OPTIONS.info_dict.get("board_bpt_make_table_args")
+ if args:
+ cmd.extend(shlex.split(args))
+
+ p = common.Run(cmd, stdout=subprocess.PIPE)
+ p.communicate()
+ assert p.returncode == 0, "bpttool make_table failed"
+
+ common.ZipWrite(output_zip, img_file_name, prefix + "partition-table.img")
+ common.ZipWrite(output_zip, bpt_file_name, prefix + "partition-table.bpt")
+
+
def AddCache(output_zip, prefix="IMAGES/"):
"""Create an empty cache image and store it in output_zip."""
@@ -362,6 +391,9 @@
AddUserdata(output_zip)
banner("cache")
AddCache(output_zip)
+ if OPTIONS.info_dict.get("board_bpt_enable", None) == "true":
+ banner("partition-table")
+ AddPartitionTable(output_zip)
# For devices using A/B update, copy over images from RADIO/ to IMAGES/ and
# make sure we have all the needed images ready under IMAGES/.
diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
index 625dca2..d49112f 100644
--- a/tools/releasetools/blockimgdiff.py
+++ b/tools/releasetools/blockimgdiff.py
@@ -272,6 +272,8 @@
self.src_basenames = {}
self.src_numpatterns = {}
self._max_stashed_size = 0
+ self.touched_src_ranges = RangeSet()
+ self.touched_src_sha1 = None
assert version in (1, 2, 3, 4)
@@ -373,6 +375,7 @@
else:
stashes[sh] = 1
stashed_blocks += sr.size()
+ self.touched_src_ranges = self.touched_src_ranges.union(sr)
out.append("stash %s %s\n" % (sh, sr.to_string_raw()))
if stashed_blocks > max_stashed_blocks:
@@ -479,6 +482,9 @@
if temp_stash_usage > max_stashed_blocks:
max_stashed_blocks = temp_stash_usage
+ self.touched_src_ranges = self.touched_src_ranges.union(
+ xf.src_ranges)
+
out.append("%s %s %s %s\n" % (
xf.style,
self.HashBlocks(self.tgt, xf.tgt_ranges),
@@ -502,6 +508,9 @@
if temp_stash_usage > max_stashed_blocks:
max_stashed_blocks = temp_stash_usage
+ self.touched_src_ranges = self.touched_src_ranges.union(
+ xf.src_ranges)
+
out.append("%s %d %d %s %s %s %s\n" % (
xf.style,
xf.patch_start, xf.patch_len,
@@ -537,6 +546,10 @@
self.tgt.blocksize, max_allowed, cache_size,
stash_threshold)
+ if self.version >= 3:
+ self.touched_src_sha1 = self.HashBlocks(
+ self.src, self.touched_src_ranges)
+
# Zero out extended blocks as a workaround for bug 20881595.
if self.tgt.extended:
out.append("zero %s\n" % (self.tgt.extended.to_string_raw(),))
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index e54bbb0..f68596b 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -1425,6 +1425,8 @@
self.path = os.path.join(tmpdir, partition)
b.Compute(self.path)
self._required_cache = b.max_stashed_size
+ self.touched_src_ranges = b.touched_src_ranges
+ self.touched_src_sha1 = b.touched_src_sha1
if src is None:
_, self.device = GetTypeAndDevice("/" + partition, OPTIONS.info_dict)
@@ -1468,26 +1470,31 @@
self.device))
script.AppendExtra("")
- def WriteVerifyScript(self, script):
+ def WriteVerifyScript(self, script, touched_blocks_only=False):
partition = self.partition
if not self.src:
script.Print("Image %s will be patched unconditionally." % (partition,))
else:
- ranges = self.src.care_map.subtract(self.src.clobbered_blocks)
+ if touched_blocks_only and self.version >= 3:
+ ranges = self.touched_src_ranges
+ expected_sha1 = self.touched_src_sha1
+ else:
+ ranges = self.src.care_map.subtract(self.src.clobbered_blocks)
+ expected_sha1 = self.src.TotalSha1()
ranges_str = ranges.to_string_raw()
if self.version >= 4:
script.AppendExtra(('if (range_sha1("%s", "%s") == "%s" || '
'block_image_verify("%s", '
'package_extract_file("%s.transfer.list"), '
'"%s.new.dat", "%s.patch.dat")) then') % (
- self.device, ranges_str, self.src.TotalSha1(),
+ self.device, ranges_str, expected_sha1,
self.device, partition, partition, partition))
elif self.version == 3:
script.AppendExtra(('if (range_sha1("%s", "%s") == "%s" || '
'block_image_verify("%s", '
'package_extract_file("%s.transfer.list"), '
'"%s.new.dat", "%s.patch.dat")) then') % (
- self.device, ranges_str, self.src.TotalSha1(),
+ self.device, ranges_str, expected_sha1,
self.device, partition, partition, partition))
else:
script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % (
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index 1f37eb4..582412a 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -1003,9 +1003,9 @@
""" % bcb_dev)
# Verify the existing partitions.
- system_diff.WriteVerifyScript(script)
+ system_diff.WriteVerifyScript(script, touched_blocks_only=True)
if vendor_diff:
- vendor_diff.WriteVerifyScript(script)
+ vendor_diff.WriteVerifyScript(script, touched_blocks_only=True)
script.Comment("---- start making changes here ----")
diff --git a/tools/releasetools/rangelib.py b/tools/releasetools/rangelib.py
index 31ed83a..1638f8c 100644
--- a/tools/releasetools/rangelib.py
+++ b/tools/releasetools/rangelib.py
@@ -104,7 +104,7 @@
if last <= s:
last = s+1
else:
- monotonic = True
+ monotonic = False
data.sort()
self.data = tuple(self._remove_pairs(data))
self.monotonic = monotonic
diff --git a/tools/releasetools/test_rangelib.py b/tools/releasetools/test_rangelib.py
index 853012e..1c57cbc 100644
--- a/tools/releasetools/test_rangelib.py
+++ b/tools/releasetools/test_rangelib.py
@@ -117,6 +117,7 @@
self.assertTrue(RangeSet("").monotonic)
self.assertTrue(RangeSet("0-4 5-9").monotonic)
self.assertFalse(RangeSet("5-9 0-4").monotonic)
+ self.assertFalse(RangeSet("258768-259211 196604").monotonic)
self.assertTrue(RangeSet(data=[0, 10]).monotonic)
self.assertTrue(RangeSet(data=[0, 10, 15, 20]).monotonic)