本文轉載自:https://blog.csdn.net/ttxgz/article/details/7542380
1. 系統需要,把需要預置在系統的所有apk放在目錄 device/softwinner/crane-gm-g9/pre/下,在編譯android源碼時,出現下面錯誤:
1 make_ext4fs -l 268435456 -a system out/target/product/Mary/system.img.ext4 out/target/product/Mary/system
2 Creating filesystem with parameters:
3 Size: 167772160
4 Block size: 4096
5 Blocks per group: 32768
6 Inodes per group: 5120
7 Inode size: 256
8 Journal blocks: 1024
9 Label:
10 Blocks: 40960
11 Block groups: 2
12 Reserved block group size: 15
13 error: do_inode_allocate_extents: Failed to allocate 119 blocks
14
15 make: *** [out/target/product/Mary/obj/PACKAGING/systemimage_intermediates/system.img] 錯誤 4
16 make: *** 正在刪除文件“out/target/product/Mary/obj/PACKAGING/systemimage_intermediates/system.img”
這個錯誤是由於增加了預置apk,導致system.img超過了分配的空間大小導致的。
修改device/softwinner/crane-gm-g9/BoardConfig.mk里BOARD_SYSTEMIMAGE_PARTITION_SIZE的大小為536870912,即把.img的文件大小從256M擴展為512M。在我們系統里,除了要修改此處,還要修改打包配置文件:lichee3.0/tools/pack/chips/sun4i/configs/crane/gm-g9/sys_config.fex把partition user/data的空間縮小,把system的空間開大(打包系統以后再記錄)。
2. 為什么把apk放在目錄device/softwinner/crane-gm-g9/pre/下就能把apk預置到系統呢?
首先看一下device/softwinner/crane-gm-g9/下面的幾個mk文件:
AndroidBoard.mk
只定義了LOCAL_PATH, 為當前目錄 device/softwinner/crane-gm-g9
crane-gm-g9.mk
定義宏PRODUCT_COPY_FILES, 加上了很多idc, rle, fstab,xml,init.rc等文件,也包含了當前目錄下的所有apk;
-> 調用 find-copy-subdir-files(), 生成copy file的語義,而查看build/core/product_config.mk, 宏的定義如下:
find $(2) -name "$(1)" | $(SED_EXTENDED) "s:($(2)/?(.*)):\\1\\:$(3)/\\2:" | sed "s://:/:g"
舉個例子,例如:
PRODUCT_COPY_FILES += $(call find-copy-subdir-files, *.apk, *(LOCAL_PATH)/pre, system/preinstall)
如果device/softwinner/crane-gm-g9/pre下有a.apk,b.apk,那么上述調用等價於:
PRODUCT_COPY_FILES += device/softwinner/crane-gm-g9/a.apk:system/preinstall/a.apk \
device/softwinner/crane-gm-g9/b.apk:system/preinstall/b.apk
所以,PRODUCT_COPY_FILES是定義了所有需要copy到生成系統時需要copy的文件。把預置的apk放在device/softwinner/crane-gm-g9/pre/,相當於把apk放在生成系統的system/preinstall下。
定義宏PRODUCT_PROPERTY_OVERRIDES, 定義了語言,區域等persist的內容
BoardConfig.mk
硬件和kernel相關的宏,例如CMDLINE,SYSTEMIMAGE_PARTITION_SIZE, sensor, wifi, gps, kernel base等設置
AndroidProducts.mk
定義宏 PRODUCT_MAKEFILES為crane_gm_g9.mk
3.BOARD_SYSTEMIMAGE_PARTITION_SIZE在哪里起作用呢?
在 build/core/Makefile里有下面一段:
ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true)
## generate an ext image
# $(1): output file
define build-systemimage-target
@echo "Target system fs image: $(1)"
$(call build-userimage-ext-target,$(TARGET_OUT),$(1),system,$(INTERNAL_USERIMAGES_EXT_VARIANT),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))
endef
else # INTERNAL_USERIMAGES_USE_EXT != true
## generate a yaffs2 image
# $(1): output file
define build-systemimage-target
@echo "Target system fs image: $(1)"
@mkdir -p $(dir $(1))
$(hide) $(MKYAFFS2) -f $(mkyaffs2_extra_flags) $(TARGET_OUT) $(1)
endef
endif # INTERNAL_USERIMAGES_USE_EXT
$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)
$(call build-systemimage-target,$@)
INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT)
由上面代碼可知,當需要生成ext格式的img時,會讀入這個宏變量來生成system.img,否則生成yaffs2文件。