Skip to content

Instantly share code, notes, and snippets.

@xingrz
Created January 1, 2020 14:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xingrz/d955e9bd8bcecac5aceec5a4ecf357b2 to your computer and use it in GitHub Desktop.
Save xingrz/d955e9bd8bcecac5aceec5a4ecf357b2 to your computer and use it in GitHub Desktop.
Extract an update.zip
SOURCE := $(TARGET).zip
MOUNT := $(TARGET)/.mount
BOOT := $(TARGET)/boot
SYSTEM := $(TARGET)/system
VENDOR := $(SYSTEM)/vendor
BOOT_IMG := $(TARGET)/boot.img
SYSTEM_IMG := $(TARGET)/system.img
SYSTEM_DAT := $(TARGET)/system.new.dat
SYSTEM_LST := $(TARGET)/system.transfer.list
ifneq (false,$(USE_BROTLI))
SYSTEM_BRO := $(SYSTEM_DAT).br
endif
VENDOR_IMG := $(TARGET)/vendor.img
VENDOR_DAT := $(TARGET)/vendor.new.dat
VENDOR_LST := $(TARGET)/vendor.transfer.list
ifneq (false,$(USE_BROTLI))
VENDOR_BRO := $(VENDOR_DAT).br
endif
UNPACK := ~/android/packing/unpack.sh
SDAT2IMG := ~/android/mokee-next/vendor/mk/build/tools/sdat2img.py
ifeq (,$(shell which brotli))
$(error `brotli` not found.)
endif
define extract-ext4-image
vagrant ssh -c "mkdir -p ~/mount && rsync --progress /vagrant/$(1) ~/source.img && sudo mount -t ext4 ~/source.img ~/mount && sudo cp -Rvf ~/mount /vagrant/$(2) && sudo umount ~/mount && rm ~/source.img"
chown -R $(shell id -un):$(shell id -gn) $(2)
chmod -R +r $(2)
chmod +w $(2)
endef
HAS_VENDOR := $(if $(strip $(shell unzip -l $(SOURCE) | grep 'vendor')),true,false)
USE_BROTLI := $(if $(strip $(shell unzip -l $(SOURCE) | grep '.dat.br')),true,false)
$(info SOURCE: $(SOURCE))
$(info HAS_VENDOR: $(HAS_VENDOR))
$(info USE_BROTLI: $(USE_BROTLI))
TARGETS := $(BOOT) $(SYSTEM)
ifneq (false,$(HAS_VENDOR))
TARGETS += $(VENDOR)
endif
.PHONY: unpack
unpack: $(TARGETS)
rm -f $(SYSTEM_DAT) $(SYSTEM_LST)
ifneq (false,$(HAS_VENDOR))
rm -f $(VENDOR_DAT) $(VENDOR_LST)
endif
ifneq (false,$(USE_BROTLI))
rm -f $(SYSTEM_BRO) $(VENDOR_BRO)
endif
@echo "=== Done ==="
$(BOOT): $(BOOT_IMG)
pushd $(dir $@) && $(UNPACK) $(notdir $^) && popd
$(SYSTEM): $(SYSTEM_IMG)
$(call extract-ext4-image,$(SYSTEM_IMG),$@)
rm -f $(SYSTEM_IMG)
ifneq (false,$(HAS_VENDOR))
rm -rf $(VENDOR)
endif
$(VENDOR): $(VENDOR_IMG) $(SYSTEM)
$(call extract-ext4-image,$(VENDOR_IMG),$@)
rm -f $(VENDOR_IMG)
$(SYSTEM_IMG): $(SYSTEM_LST) $(SYSTEM_DAT)
$(SDAT2IMG) $^ $@
$(VENDOR_IMG): $(VENDOR_LST) $(VENDOR_DAT)
$(SDAT2IMG) $^ $@
ifneq (false,$(USE_BROTLI))
$(SYSTEM_DAT): $(SYSTEM_BRO)
brotli --decompress --output=$@ $^
$(VENDOR_DAT): $(VENDOR_BRO)
brotli --decompress --output=$@ $^
endif
$(BOOT_IMG): $(TARGET)
ifneq (false,$(USE_BROTLI))
$(SYSTEM_BRO): $(TARGET)
$(VENDOR_BRO): $(TARGET)
else
$(SYSTEM_DAT): $(TARGET)
$(VENDOR_DAT): $(TARGET)
endif
$(TARGET): $(SOURCE)
mkdir -p $@
unzip $^ -d $@
.PHONY: clean
clean:
rm -rf $(TARGET)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment