Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Androidϵͳ¾µÏñÎļþµÄ´ò°ü¹ý³Ì·ÖÎö
 
×÷Õß ÂÞÉýÑôµÄ²©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-07-23
  3801  次浏览      30
 

ÔÚÇ°ÃæÒ»ÆªÎÄÕÂÖУ¬ÎÒÃÇ·ÖÎöÁËAndroidÄ£¿éµÄ±àÒë¹ý³Ì¡£µ±AndroidϵͳµÄËùÓÐÄ£¿é¶¼±àÒëºÃÖ®ºó£¬ÎÒÃǾͿÉÒÔ¶Ô±àÒë³öÀ´µÄÄ£¿éÎļþ½øÐдò°üÁË¡£´ò°ü½á¹ûÊÇ»ñµÃһϵÁеľµÏñÎļþ£¬ÀýÈçsystem.img¡¢boot.img¡¢ramdisk.img¡¢userdata.imgºÍrecovery.imgµÈ¡£ÕâЩ¾µÏñÎļþ×îÖÕ¿ÉÒÔÉÕ¼µ½ÊÖ»úÉÏÔËÐС£ÔÚ±¾ÎÄÖУ¬ÎÒÃǾÍÏêϸ·ÖÎöAndroidϵͳµÄ¾µÏñÎļþµÄ´ò°ü¹ý³Ì¡£

Androidϵͳ¾µÏñÎļþµÄ´ò°ü¹¤×÷ͬÑùÊÇÓÉAndroid±àÒëϵͳÀ´Íê³ÉµÄ£¬Èçͼ1Ëùʾ£º

ͼ1 Androidϵͳ¾µÏñÎļþµÄ´ò°ü¹ý³Ì

´ÓÇ°ÃæAndroid±àÒëϵͳ»·¾³³õʼ»¯¹ý³Ì·ÖÎöºÍAndroidÔ´´úÂë±àÒëÃüÁîm/mm/mmm/make·ÖÎöÕâÁ½ÆªÎÄÕ¿ÉÒÔÖªµÀ£¬Android±àÒëϵͳÔÚ³õʼ»¯µÄ¹ý³ÌÖУ¬»áͨ¹ý¸ùĿ¼ÏµÄMakefile½Å±¾¼ÓÔØbuild/core/main.mk½Å±¾£¬½Ó×Åbuild/core/main.mk½Å±¾ÓÖ»á¼ÓÔØbuild/core/Makefile½Å±¾£¬¶øAndroidϵͳ¾µÏñÎļþ¾ÍÊÇÓÉbuild/core/Makefile½Å±¾¸ºÔð´ò°üÉú³ÉµÄ¡£

ÔÚbuild/core/main.mkÎļþÖУ¬ÓëAndroidϵͳ¾µÏñÎļþ´ò°ü¹ý³ÌÏà¹ØµÄÄÚÈÝÈçÏÂËùʾ£º

......
ifdef FULL_BUILD
# The base list of modules to build for this product is specified
# by the appropriate product definition file, which was included
# by product_config.make.
product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
# Filter out the overridden packages before doing expansion
product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
$(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
$(call expand-required-modules,product_MODULES,$(product_MODULES))
product_FILES := $(call module-installed-files, $(product_MODULES))
......
else
# We're not doing a full build, and are probably only including
# a subset of the module makefiles. Don't try to build any modules
# requested by the product, because we probably won't have rules
# to build them.
product_FILES :=
endif
......
modules_to_install := $(sort \
$(ALL_DEFAULT_INSTALLED_MODULES) \
$(product_FILES) \
$(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \
$(call get-tagged-modules, shell_$(TARGET_SHELL)) \
$(CUSTOM_MODULES) \
)
# Some packages may override others using LOCAL_OVERRIDES_PACKAGES.
# Filter out (do not install) any overridden packages.
overridden_packages := $(call get-package-overrides,$(modules_to_install))
ifdef overridden_packages
# old_modules_to_install := $(modules_to_install)
modules_to_install := \
$(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk), \
$(modules_to_install))
endif
......
# Install all of the host modules
modules_to_install += $(sort $(modules_to_install) $(ALL_HOST_INSTALLED_FILES))
# build/core/Makefile contains extra stuff that we don't want to pollute this
# top-level makefile with. It expects that ALL_DEFAULT_INSTALLED_MODULES
# contains everything that's built during the current make, but it also further
# extends ALL_DEFAULT_INSTALLED_MODULES.
ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)
include $(BUILD_SYSTEM)/Makefile
modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))
ALL_DEFAULT_INSTALLED_MODULES :=
......
.PHONY: ramdisk
ramdisk: $(INSTALLED_RAMDISK_TARGET)
......
.PHONY: userdataimage
userdataimage: $(INSTALLED_USERDATAIMAGE_TARGET)
......
.PHONY: bootimage
bootimage: $(INSTALLED_BOOTIMAGE_TARGET)
......

Èç¹û¶¨ÒåÔÚFULL_BUILDÕâ¸ö±äÁ¿£¬¾ÍÒâζ×ÅÎÒÃÇÊÇÒª¶ÔÕû¸öϵͳ½øÐбàÒ룬²¢ÇÒ±àÒëÍê³ÉÖ®ºó £¬ÐèÒª½«±àÒëµÃµ½µÄÎļþ½øÐдò°ü£¬ÒÔ±ã¿ÉÒԵõ½ÏàÓ¦µÄ¾µÏñÎļþ£¬·ñÔòµÄ»°£¬¾Í½ö½öÊǶÔijЩģ¿é½øÐбàÒë¡£

ÔÚÇ°ÃæAndroid±àÒëϵͳ»·¾³³õʼ»¯¹ý³Ì·ÖÎöһƪÎÄÕÂÖУ¬ÎÒÃÇÌáµ½£¬±äÁ¿INTERNAL_PRODUCTÃèÊöµÄÊÇÖ´ÐÐlunchÃüÁîʱËùÑ¡ÔñµÄ²úÆ·Ëù¶ÔÓ¦µÄ²úÆ·MakefileÎļþ£¬¶ø±äÁ¿PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGESÃèÊöµÄÊÇÔڸòúÆ·MakefileÎļþÖÐͨ¹ý±äÁ¿PRODUCT_PACKAGESËù¶¨ÒåµÄÄ£¿éÃû³ÆÁÐ±í¡£Òò´Ë£¬ÎÒÃǵõ½µÄ±äÁ¿product_MODULESÃèÊöµÄ¾ÍÊÇÒª°²×°µÄÄ£¿éÃû³ÆÁÐ±í¡£

ÎÒÃÇÖªµÀ£¬AndroidÔ´ÂëÖÐ×Ô´øÁ˺ܶàĬÈϵÄAPKÄ£¿é¡£Èç¹ûÎÒÃÇÏëÓÃ×Ô¼º±àдµÄÒ»¸öAPKÀ´´úÌæÄ³Ò»¸öϵͳ×Ô´øµÄAPK£¬ÄÇô¾Í¿ÉÒÔͨ¹ý±äÁ¿PACKAGES.<new>.OVERRIDES := <old>À´ËµÃ÷¡£ÆäÖУ¬<new>±íʾÓÃÀ´Ìæ»»µÄAPK£¬¶ø<old>±íʾ±»Ìæ»»µÄAPK¡£ÔÚÕâÖÖÇé¿öÏ£¬±»Ìæ»»µÄAPKÊDz»Ó¦¸Ã±»´ò°üµ½ÏµÍ³¾µÏñÖÐÈ¥µÄ¡£Òò´Ë£¬ÎÒÃÇÐèÒª´ÓÉÏÒ»²½µÃµ½µÄÄ£¿éÃû³ÆÁбíÖÐÌÞ³ýÄÇЩ±»Ìæ»»µÄAPK£¬ÕâÊÇͨ¹ýMakefile½Å±¾ÌṩµÄfilter-outº¯ÊýÀ´Íê³ÉµÄ¡£

Ò»¸öÄ£¿é¿ÉÒÔͨ¹ýLOCAL_REQUIRED_MODULES±äÁ¿À´Ö¸¶¨ËüËùÒÀÀµµÄÆäËüÄ£¿é£¬Òò´Ë£¬µ±Ò»¸öÄ£¿é±»°²×°µÄʱºò£¬ËüËùÒÀÀµµÄÆäËüÄ£¿éÒ²»áÒ»Æð±»°²×°¡£µ÷Óú¯Êýexpand-required-modules»ñµÃµÄ¾ÍÊÇËùÓÐÒª°²×°µÄÄ£¿éËùÒÀÀµµÄÆäËüÄ£¿é£¬²¢ÇÒ½«ÕâЩ±»ÒÀÀµµÄÄ£¿éÒ²Ò»Æð±£´æÔÚ±äÁ¿product_MODULESÖС£

×¢Ò⣬ÕâʱºòÎÒÃǵõ½µÄproduct_MODULESÃèÊöµÄ½ö½öÊÇÒª°²×°µÄÄ£¿éµÄÃû³Æ£¬µ«ÊÇÎÒÃÇʵ¼ÊÐèÒªµÄÕâЩģ¿é¶ÔÓ¦µÄ¾ßÌåÎļþ£¬Òò´Ë£¬ÐèÒª½øÒ»²½µ÷Óú¯Êýmodule-installed-filesÀ´»ñµÃÒª°²×°µÄÄ£¿éËù¶ÔÓ¦µÄÎļþ£¬Ò²¾ÍÊÇÒª°²×°µÄÄ£¿é¾­¹ý±àÒëÖ®ºóÉú³ÉµÄÎļþ£¬ÕâЩÎļþ¾Í±£´æÔÚ±äÁ¿product_FILESÖС£

×îÖÕÐèÒª°²×°µÄÎļþ³ýÁ˱äÁ¿product_FILESËùÃèÊöµÄÎļþÖ®ºó£¬ »¹°üº¬ÒÔÏÂËÄÀàÄ£¿éÎļþ£º

1. ±äÁ¿ALL_DEFAULT_INSTALLED_MODULESÃèÊöµÄÎļþ¡£

2. ±äÁ¿CUSTOM_MODULESÃèÊöµÄÎļþ¡£

3. Ó뵱ǰ±àÒëÀàÐͶÔÓ¦µÄÄ£¿éÎļþ¡£ÀýÈ磬Èç¹ûµ±Ç°É趨µÄ±àÒëÀàÐÍΪdebug£¬ÄÇôËùÓÐͨ¹ý½«±äÁ¿LOCAL_MODULE_TAGS½«×Ô¼ºÉèÖÃΪdebugµÄÄ£¿éÒ²»á±»´ò°üµ½ÏµÍ³¾µÏñÎļþÖÐÈ¥¡£

4. Ó뵱ǰshellÃû³Æ¶ÔÓ¦µÄÄ£¿éÎļþ¡£ÀýÈ磬Èç¹ûµ±Ç°Ê¹ÓõÄshellÊÇmksh£¬ÄÇôËùÓÐͨ¹ý½«±äÁ¿LOCAL_MODULE_TAGS½«×Ô¼ºÉèÖÃΪshell_mkshµÄÄ£¿éÒ²»á±»´ò°üµ½ÏµÍ³¾µÏñÎļþÖÐÈ¥¡£

×îºó£¬modules_to_install¾ÍÃèÊöµ±Ç°ÐèÒª´ò°üµ½ÏµÍ³¾µÏñÖÐÈ¥µÄÄ£¿éÎļþ¡£Êµ¼ÊÉÏ£¬ÎÒÃdzýÁË¿ÉÒÔͨ¹ýPACKAGES.$(p).OVERRIDESÀ´ÃèÊöÒªÌæ»»µÄAPKÖ®ºó£¬»¹¿ÉÒÔÔÚÒ»¸öÄ£¿éÖÐͨ¹ýLOCAL_OVERRIDES_PACKAGESÀ´ÃèÊöËüËùÌæ»»µÄÄ£¿é¡£Òò´Ë£¬ÎÒÃÇÐèҪͨ¹ýº¯Êýget-package-overridesÀ´»ñµÃ´ËÀà±»Ìæ»»µÄÄ£¿éÎļþ£¬²¢ÇÒ½«ËüÃÇ´Ómodules_to_installÖÐÌÞ³ý£¬ÕâÑùµÃµ½µÄÄ£¿éÎļþ²ÅÊÇ×îÖÕÐèÒª°²×°µÄ¡£

È·¶¨ÁËÒª°²×°µÄËùÓÐÄ£¿éÎļþÖ®ºó£¬¾Í¿ÉÒÔ½«build/core/MakefileÎļþ¼ÓÔØ½øÀ´ÁË¡£×¢Ò⣬Îļþbuild/core/MakefileÊÇͨ¹ý±äÁ¿ALL_DEFAULT_INSTALLED_MODULESÀ´»ñµÃµ±Ç°ËùÓÐÒª´ò°üµ½ÏµÍ³¾µÏñÎļþÖÐÈ¥µÄÄ£¿éÎļþµÄ¡£

Îļþbuild/core/MakefileÖ÷Òª¾ÍÊÇÓÃÀ´´ò°ü¸÷ÖÖAndroidϵͳ¾µÏñÎļþµÄ£¬µ±È»ËüÒ²ÊÇͨ¹ýmake¹æÔòÀ´Ö´Ðи÷ÖÖAndroidϵͳ¾µÏñÎļþ´ò°üÃüÁîµÄ¡£Ã¿Ò»¸öAndroid¾µÏñÎļþ¶¼¶ÔÓ¦ÓÐÒ»¸ömakeαĿ±ê¡£ÀýÈ磬ÔÚbuild/core/main.mkÎļþÖУ¬¾Í¶¨ÒåÁËÈý¸ömakeαĿ±êramdisk¡¢userdataimageºÍbootimage£¬ËüÃÇ·Ö±ðÒÀÀµÓÚ±äÁ¿INSTALLED_USERDATAIMAGE_TARGET¡¢INSTALLED_USERDATAIMAGE_TARGETºÍINSTALLED_BOOTIMAGE_TARGETËùÃèÊöµÄÎļþ£¬²¢ÇÒËüÃÇ·Ö±ð±íʾµÄ¾ÍÊÇramdisk.img¡¢userdata.imgºÍboot.imgÎļþ¡£

±äÁ¿INSTALLED_USERDATAIMAGE_TARGET¡¢INSTALLED_USERDATAIMAGE_TARGETºÍINSTALLED_BOOTIMAGE_TARGET¶¼ÊÇÔÚbuild/core/MakefileÎļþÖж¨ÒåµÄ¡£´ËÍ⣬build/core/MakefileÎļþ»¹¶¨ÒåÁËÁíÍâÁ½¸ö¾µÏñÎļþsystem.imgºÍrecovery.imgµÄÉú³É¹æÔò¡£½ÓÏÂÀ´£¬ÎÒÃǾͷֱð¶ÔÕâЩ¾µÏñÎļþµÄ´ò°ü¹ý³Ì½øÐзÖÎö¡£

Ò». system.img

system.img¾µÏñÎļþÃèÊöµÄÊÇÉ豸ÉϵÄsystem·ÖÇø£¬¼´/systemĿ¼£¬ËüÊÇÔÚbuild/core/MakefileÎļþÖÐÉú³ÉµÄ£¬Ïà¹ØµÄÄÚÈÝÈçÏÂËùʾ£º

# Rules that need to be present for the all targets, even
# if they don't do anything.
.PHONY: systemimage
systemimage:
......
INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img
......
$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP)
@echo "Install system fs image: $@"
$(copy-file-to-target)
$(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH), $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)
systemimage: $(INSTALLED_SYSTEMIMAGE)
.PHONY: systemimage-nodeps snod
systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \
| $(INTERNAL_USERIMAGES_DEPS)
@echo "make $@: ignoring dependencies"
$(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE))
$(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE), $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)

´ÓÕâÀï¾Í¿ÉÒÔ¿´³ö£¬build/core/MakefileÎļþ¶¨ÒåÁËÁ½¸öαĿ±êÀ´Éú³Ésystem.img£º1. systemimg£»2. systemimg-nodeps»òÕßsnod¡£Î±Ä¿±êsystemimg±íʾÔÚ´ò°üsystem.img֮ǰ£¬Òª¸ù¾ÝÒÀÀµ¹æÔòÖØÐÂÉú³ÉËùÓÐÒª½øÐдò°üµÄÎļþ£¬¶øÎ±Ä¿±êsystemimg-nodepsÔò²»ÐèÒª¸ù¾ÝÒÀÀµ¹æÔòÖØÐÂÉú³ÉËùÓÐÐèÒª´ò°üµÄÎļþ¶øÖ±½Ó´ò°üsystem.imgÎļþ¡£Òò´Ë£¬Ö´ÐÐsystemimg-nodep±ÈÖ´ÐÐsystemimgÒª¿ìºÜ¶à¡£Í¨³££¬Èç¹ûÎÒÃÇÔÚAndroidÔ´ÂëÖÐÐÞ¸ÄÁËijһ¸öÄ£¿é£¬²¢ÇÒÕâ¸öÄ£¿é²»±»ÆäËüÄ£¿éÒÀÀµ£¬ÄÇô¶ÔÕâ¸öÄ£¿é½øÐбàÒëÖ®ºó£¬¾Í¿ÉÒÔ¼òµ¥µØÖ´ÐÐmake systemimg-nodepsÀ´ÖØÐ´ò°üsystem.img¡£µ«ÊÇ£¬Èç¹ûÎÒÃÇÐ޸ĵÄÄ£¿é»á±»ÆäËüÄ£¿éÒýÓã¬ÀýÈ磬ÎÒÃÇÐÞ¸ÄÁËAndroidϵͳµÄºËÐÄÄ£¿éframework.jarºÍservices.jar£¬ÄÇô¾ÍÐèÒªÖ´ÐÐmake systemimgÀ´¸üÐÂËùÓÐÒÀÀµÓÚframework.jarºÍservices.jarµÄÄ£¿é£¬ÄÇô×îºóµÃµ½µÄsystem.img²ÅÊÇÕýÈ·µÄ¾µÏñ¡£·ñÔòµÄ»°£¬»áµ¼ÖÂAndroidϵͳÆô¶¯Ê§°Ü¡£

½ÓÏÂÀ´£¬ÎÒÃǾÍÖ÷Òª¹Ø×¢Î±Ä¿±êsystemimgÉú³Ésystem.img¾µÏñÎļþµÄ¹ý³Ì¡£Î±Ä¿±êsystemimgÒÀÀµÓÚINSTALLED_SYSTEMIMAGE£¬Ò²¾ÍÊÇ×îÖÕÉú³ÉµÄ$(PRODUCT_OUT)/system.imgÎļþ¡£INSTALLED_SYSTEMIMAGEÓÖÒÀÀµÓÚBUILT_SYSTEMIMAGE¡¢RECOVERY_FROM_BOOT_PATCHºÍACP¡£×¢Ò⣬BUILT_SYSTEMIMAGE¡¢RECOVERY_FROM_BOOT_PATCHºÍACPÖ®¼äÓÐÒ»¸ö¹ÜµÀ·ûºÅÏà¸ô¡£ÔÚÒ»¸ömake¹æÔòÖ®ÖУ¬Ò»¸öÄ¿±êµÄÒÀÀµÎļþ¿ÉÒÔ»®·ÖΪÁ½Àà¡£Ò»¸öÀàÊÇÆÕͨÒÀÀµÎļþ£¬ËüÃÇλÓڹܵÀ·ûºÅµÄ×óÔò£¬ÁíÒ»Àà³ÆÎª¡°order-only¡±ÒÀÀµÎļþ£¬ËüÃÇλÓÚ¹ÜÀí·ûºÅµÄÓҲࡣÿһ¸öÆÕͨÒÀÀµÎļþ·¢ÉúÐ޸ĺó£¬Ä¿±ê¶¼»á±»¸üС£µ«ÊÇ"order-only"ÒÀÀµÎļþ·¢ÉúÐÞ¸Äʱ£¬È´²»Ò»¶¨»áµ¼ÖÂÄ¿±ê¸üС£Ö»Óе±Ä¿±êÎļþ²»´æÔÚµÄÇé¿öÏ£¬"order-only"ÒÀÀµÎļþµÄÐ޸IJŻá¸üÐÂÄ¿±êÎļþ¡£Ò²¾ÍÊÇ˵£¬Ö»ÓÐÔÚÄ¿±êÎļþ²»´æÔÚµÄÇé¿öÏ£¬¡°order-only¡±ÒÀÀµÎļþ²Å»á²ÎÓëµ½¹æÔòµÄÖ´Ðйý³ÌÖÐÈ¥¡£

ACPÃèÊöµÄÊÇÒ»¸öAndroidרÓõÄcpÃüÁÔÚÉú³Ésystem.img¾µÏñÎļþµÄ¹ý³ÌÖÐÊÇÐèÒªÓõ½µÄ¡£ÆÕͨµÄcpÃüÁîÔÚ²»Í¬µÄƽ̨£¨Mac OS X¡¢MinGW/CygwinºÍLinux£©µÄʵÏÖÂÔÓвîÒ죬²¢ÇÒ¿ÉÄܻᵼÖÂһЩÎÊÌ⣬ÓÚÊÇAndroid±àÒëϵͳ¾ÍÖØÐ´ÁË×Ô¼ºµÄcpÃüÁʹµÃËüÔÚ²»Í¬Æ½Ì¨ÏÂÖ´ÐоßÓÐͳһµÄÐÐΪ£¬²¢ÇÒ½â¾öÆÕͨcpÃüÁî¿ÉÄÜ»á³öÏÖµÄÎÊÌâ¡£ÀýÈ磬ÔÚLinuxƽ̨ÉÏ£¬µ±ÎÒÃǰÑÒ»¸öÎļþ´ÓNFSÎļþϵͳ¿½±´µ½±¾µØÎļþϵͳʱ£¬ÆÕͨµÄcpÃüÁî×ÜÊÇ»áÈÏΪÔÚNFSÎļþϵͳÉϵÄÎļþ±ÈÔÚ±¾µØÎļþϵͳÉϵÄÎļþҪУ¬ÒòΪǰÕßµÄʱ¼ä´Á¾«¶ÈÊÇ΢Ã룬¶øºóÕßµÄʱ¼ä´Á¾«¶È²»ÊÇ΢Ãë¡£AndroidרÓõÄcpÃüÁîÔ´Âë¿ÉÒԲο¼build/tools/acpĿ¼¡£

RECOVERY_FROM_BOOT_PATCHÃèÊöµÄÊÇÒ»¸öpatchÎļþ£¬ËüµÄÒÀÀµ¹æÔòÈçÏÂËùʾ£º

# The system partition needs room for the recovery image as well.  We
# now store the recovery image as a binary patch using the boot image
# as the source (since they are very similar). Generate the patch so
# we can see how big it's going to be, and include that in the system
# image size check calculation.
ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(HOST_OUT_EXECUTABLES)/imgdiff \
$(HOST_OUT_EXECUTABLES)/bsdiff
@echo "Construct recovery from boot"
mkdir -p $(dir $@)
PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES) /imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
endif

Õâ¸öpatchÎļþµÄÃû³ÆÎªrecovery_from_boot.p£¬±£´æÔÚÉ豸ÉÏsystem·ÖÇøÖУ¬ÃèÊöµÄÊÇrecovery.imgÓëboot.imgÖ®¼äµÄ²îÒì¡£Ò²¾ÍÊÇ˵£¬ÔÚÉ豸ÉÏ£¬ÎÒÃÇ¿ÉÒÔͨ¹ýboot.imgºÍrecovery_from_boot.pÎļþÉú³ÉÒ»¸örecovery.imgÎļþ£¬Ê¹µÃÉ豸¿ÉÒÔ½øÈërecoveryģʽ¡£
INSTALLED_SYSTEMIMAGEÃèÊöµÄÊÇsystem.img¾µÏñËù°üº¬µÄºËÐÄÎļþ£¬ËüµÄÒÀÀµ¹æÔòÈçÏÂËùʾ£º

systemimage_intermediates := \
$(call intermediates-dir-for,PACKAGING,systemimage)
BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
# $(1): output file
define build-systemimage-target
@echo "Target system fs image: $(1)"
@mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt
$(call generate-userimage-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt)
$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
./build/tools/releasetools/build_image.py \
$(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1)
endef
$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)
$(call build-systemimage-target,$@)

INSTALLED_SYSTEMIMAGEÃèÊöµÄÊÇ$(systemimage_intermediates)/system.imgÎļþ£¬ËüÒÀÀµÓÚFULL_SYSTEMIMAGE_DEPSºÍINSTALLED_FILES_FILE£¬²¢ÇÒÊÇͨ¹ýµ÷Óú¯Êýbuild-systemimage-targetÀ´Éú³É£¬¶øº¯Êýbuild-systemimage-targetʵ¼ÊÉÏÓÖÊÇͨ¹ýµ÷ÓÃpython½Å±¾build_image.pyÀ´Éú³Ésystem.imgÎļþµÄ¡£

INSTALLED_FILES_FILEµÄÒÀÀµ¹æÔòÈçÏÂËùʾ£º

# installed file list
# Depending on anything that $(BUILT_SYSTEMIMAGE) depends on.
# We put installed-files.txt ahead of image itself in the dependency graph
# so that we can get the size stat even if the build fails due to too large
# system image.
INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
$(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS)
@echo Installed file list: $@
@mkdir -p $(dir $@)
@rm -f $@
$(hide) build/tools/fileslist.py $(TARGET_OUT) > $@

INSTALLED_FILES_FILEÃèÊöµÄÊÇ$(PRODUCT_OUT)/installed-files.txtÎļþ£¬¸ÃÎļþÃèÊöÁËÒª´ò°üÔÚsystem.img¾µÏñÖÐÈ¥µÄÎļþÁÐ±í£¬Í¬Ê±ËüÓëINSTALLED_SYSTEMIMAGEÒ»Ñù£¬Ò²ÒÀÀµÓÚFULL_SYSTEMIMAGE_DEPS¡£

FULL_SYSTEMIMAGE_DEPSµÄ¶¨ÒåÈçÏÂËùʾ£º

FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS)

INTERNAL_USERIMAGES_DEPSÃèÊöµÄÊÇÖÆ×÷system.img¾µÏñËùÒÀÀµµÄ¹¤¾ß¡£ÀýÈ磬Èç¹ûÒªÖÆ×÷µÄsystem.imgʹÓõÄÊÇyaffs2Îļþϵͳ£¬ÄÇô¶ÔÓ¦¹¤¾ß¾ÍÊÇmkyaffs2image¡£

INTERNAL_SYSTEMIMAGE_FILESÃèÊöµÄÊÇÓÃÀ´ÖÆ×÷system.img¾µÏñµÄÎļþ£¬ËüµÄ¶¨ÒåÈçÏÂËùʾ£º

INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \
$(ALL_PREBUILT) \
$(ALL_COPIED_HEADERS) \
$(ALL_GENERATED_SOURCES) \
$(ALL_DEFAULT_INSTALLED_MODULES) \
$(PDK_FUSION_SYSIMG_FILES) \
$(RECOVERY_RESOURCE_ZIP))

´ÓÕâÀï¾Í¿ÉÒÔ¿´³ö£¬INTERNAL_SYSTEMIMAGE_FILESÃèÊöµÄ¾ÍÊÇ´ÓALL_PREBUILT¡¢ALL_COPIED_HEADERS¡¢ALL_GENERATED_SOURCES¡¢ALL_DEFAULT_INSTALLED_MODULES¡¢PDK_FUSION_SYSIMG_FILESºÍRECOVERY_RESOURCE_ZIPÖйýÂ˳öÀ´µÄ´æ·ÅÔÚTARGET_OUTĿ¼ÏµÄÄÇЩÎļþ£¬¼´ÔÚÄ¿±ê²úÆ·Êä³öĿ¼ÖеÄsystem×ÓĿ¼ÏÂÄÇЩÎļþ¡£

ALL_PREBUILTÊÇÒ»¸ö¹ýʱµÄ±äÁ¿£¬ÓÃÀ´ÃèÊöÒª¿½±´µ½Ä¿±êÉ豸ÉÏÈ¥µÄÎļþ£¬ÏÖÔÚ½¨ÒéʹÓÃPRODUCT_COPY_FILESÀ´ÃèÊöÒª¿½±´µ½Ä¿±êÉ豸ÉÏÈ¥µÄÎļþ¡£

ALL_COPIED_HEADERSÃèÊöµÄÊÇÒª¿½±´µ½Ä¿±êÉ豸ÉÏÈ¥µÄÍ·Îļþ¡£

ALL_GENERATED_SOURCESÃèÊöµÄÊÇÒª¿½±´µ½Ä¿±êÉ豸ÉÏÈ¥µÄÓɹ¤¾ß×Ô¶¯Éú³ÉµÄÔ´´úÂëÎļþ¡£

ALL_DEFAULT_INSTALLED_MODULESÃèÊöµÄ¾ÍÊÇÒª°²×°ÒªÄ¿±êÉ豸ÉϵÄÄ£¿éÎļþ£¬ÕâЩģ¿éÎļþÊÇÔÚbuild/core/main.mkÎļþÖÐÉèÖúò¢ÇÒ´«µÝ¸øbuild/core/MakefileÎļþʹÓõġ£

PDK_FUSION_SYSIMG_FILESÊÇ´ÓPDK(Platform Development Kit)ÌáÈ¡³öÀ´µÄÏà¹ØÎļþ¡£PDKÊÇGoogleΪÁ˽â¾öAndroidË鯬»¯ÎÊÌâ¶øÎªÊÖ»ú³§ÉÌÌṩµÄÒ»¸öа汾µÄ¡¢»¹Î´·¢²¼µÄAndroid¿ª·¢°ü£¬Ä¿µÄÊÇΪÁËÈÃÊÖ»ú³§É̸úÉϹٷ½Ð°æAndroidµÄ¿ª·¢½Ú×à¡£¾ßÌå¿ÉÒԲο¼ÕâÆªÎÄÕ£ºhttp://www.xinwengao.net/release/af360/67079.shtml¡£

RECOVERY_RESOURCE_ZIPÃèÊöµÄÊÇAndroidµÄrecoveryϵͳҪʹÓõÄ×ÊÔ´Îļþ£¬¶ÔÓ¦ÓÚ/system/etcĿ¼ÏµÄrecovery-resource.datÎļþ¡£

×¢Ò⣬ALL_DEFAULT_INSTALLED_MODULESÃèÊöµÄÎļþ³ýÁËÔÚbuild/core/main.mkÎļþÖж¨ÒåµÄÄ£¿éÎļþÖ®Í⣬»¹°üº¬ÒÔÏÂÕâЩÎļþ£º

1. ͨ¹ýPRODUCT_COPY_FILES¶¨ÒåµÄÒª¿½±´µ½Ä¿±êÉ豸ÉÏÈ¥µÄÎļþ

unique_product_copy_files_pairs :=
$(foreach cf,$(PRODUCT_COPY_FILES), \
$(if $(filter $(unique_product_copy_files_pairs),$(cf)),,\
$(eval unique_product_copy_files_pairs += $(cf))))
unique_product_copy_files_destinations :=
$(foreach cf,$(unique_product_copy_files_pairs), \
$(eval _src := $(call word-colon,1,$(cf))) \
$(eval _dest := $(call word-colon,2,$(cf))) \
$(call check-product-copy-files,$(cf)) \
$(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \
$(info PRODUCT_COPY_FILES $(cf) ignored.), \
$(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \
$(if $(filter %.xml,$(_dest)),\
$(eval $(call copy-xml-file-checked,$(_src),$(_fulldest))),\
$(eval $(call copy-one-file,$(_src),$(_fulldest)))) \
<span style="color:#FF0000;"><strong>$(eval ALL_DEFAULT_INSTALLED_MODULES += $(_fulldest)) \</strong></span>
$(eval unique_product_copy_files_destinations += $(_dest))))

2. ÓÉADDITIONAL_DEFAULT_PROPERTIES¶¨ÒåµÄÊôÐÔËù×é³ÉµÄdefault.propÎļþ

INSTALLED_DEFAULT_PROP_TARGET := $(TARGET_ROOT_OUT)/default.prop
<span style="color:#FF0000;"><strong>ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DEFAULT_PROP_TARGET)</strong></span>
ADDITIONAL_DEFAULT_PROPERTIES := \
$(call collapse-pairs, $(ADDITIONAL_DEFAULT_PROPERTIES))
ADDITIONAL_DEFAULT_PROPERTIES += \
$(call collapse-pairs, $(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
ADDITIONAL_DEFAULT_PROPERTIES := $(call uniq-pairs-by-first-component, \
$(ADDITIONAL_DEFAULT_PROPERTIES),=)
$(INSTALLED_DEFAULT_PROP_TARGET):
@echo Target buildinfo: $@
@mkdir -p $(dir $@)
$(hide) echo "#" > $@; \
echo "# ADDITIONAL_DEFAULT_PROPERTIES" >> $@; \
echo "#" >> $@;
$(hide) $(foreach line,$(ADDITIONAL_DEFAULT_PROPERTIES), \
echo "$(line)" >> $@;)
build/tools/post_process_props.py $@

3. ÓÉADDITIONAL_BUILD_PROPERTIESµÈ¶¨ÒåµÄÊôÐÔËù×é³ÉµÄbuild.propÎļþ

INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop
<span style="color:#FF0000;"><strong>ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_BUILD_PROP_TARGET)</strong></span>
ADDITIONAL_BUILD_PROPERTIES := \
$(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))
ADDITIONAL_BUILD_PROPERTIES := $(call uniq-pairs-by-first-component, \
$(ADDITIONAL_BUILD_PROPERTIES),=)
......
BUILDINFO_SH := build/tools/buildinfo.sh
$(INSTALLED_BUILD_PROP_TARGET): $(BUILDINFO_SH) $(INTERNAL_BUILD_ID_MAKEFILE) $(BUILD_SYSTEM)/version_defaults.mk $(wildcard $(TARGET_DEVICE_DIR)/system.prop)
@echo Target buildinfo: $@
@mkdir -p $(dir $@)
$(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \
TARGET_DEVICE="$(TARGET_DEVICE)" \
PRODUCT_NAME="$(TARGET_PRODUCT)" \
PRODUCT_BRAND="$(PRODUCT_BRAND)" \
PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \
PRODUCT_MODEL="$(PRODUCT_MODEL)" \
PRODUCT_MANUFACTURER="$(PRODUCT_MANUFACTURER)" \
PRIVATE_BUILD_DESC="$(PRIVATE_BUILD_DESC)" \
BUILD_ID="$(BUILD_ID)" \
BUILD_DISPLAY_ID="$(BUILD_DISPLAY_ID)" \
BUILD_NUMBER="$(BUILD_NUMBER)" \
PLATFORM_VERSION="$(PLATFORM_VERSION)" \
PLATFORM_SDK_VERSION="$(PLATFORM_SDK_VERSION)" \
PLATFORM_VERSION_CODENAME="$(PLATFORM_VERSION_CODENAME)" \
BUILD_VERSION_TAGS="$(BUILD_VERSION_TAGS)" \
TARGET_BOOTLOADER_BOARD_NAME="$(TARGET_BOOTLOADER_BOARD_NAME)" \
BUILD_FINGERPRINT="$(BUILD_FINGERPRINT)" \
TARGET_BOARD_PLATFORM="$(TARGET_BOARD_PLATFORM)" \
TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \
TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \
TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \
bash $(BUILDINFO_SH) > $@
$(hide) if [ -f $(TARGET_DEVICE_DIR)/system.prop ]; then \
cat $(TARGET_DEVICE_DIR)/system.prop >> $@; \
fi
$(if $(ADDITIONAL_BUILD_PROPERTIES), \
$(hide) echo >> $@; \
echo "#" >> $@; \
echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \
echo "#" >> $@; )
$(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \
echo "$(line)" >> $@;)
$(hide) build/tools/post_process_props.py $@

4. ÓÃÀ´ÃèÊöeventÀàÐÍÈÕÖ¾¸ñʽµÄevent-log-tagsÎļþ

all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
# Include tags from all packages that we know about
all_event_log_tags_src := \
$(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
# PDK builds will already have a full list of tags that needs to get merged
# in with the ones from source
pdk_fusion_log_tags_file := $(patsubst $(PRODUCT_OUT)/%,$(_pdk_fusion_intermediates)/%, $(filter $(event_log_tags_file),$(ALL_PDK_FUSION_FILES)))
$(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src) $(pdk_fusion_log_tags_file)
$(hide) mkdir -p $(dir $@)
$(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES)
# Include tags from all packages included in this product, plus all
# tags that are part of the system (ie, not in a vendor/ or device/
# directory).
event_log_tags_src := \
$(sort $(foreach m,\
$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES) \
$(call module-names-for-tag-list,user), \
$(ALL_MODULES.$(m).EVENT_LOG_TAGS)) \
$(filter-out vendor/% device/% out/%,$(all_event_log_tags_src)))
$(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src) $(pdk_fusion_log_tags_file)
$(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file)
$(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file) $(pdk_fusion_log_tags_file)
$(hide) mkdir -p $(dir $@)
$(hide) build/tools/merge-event-log-tags.py -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES)
event-log-tags: $(event_log_tags_file)
<strong><span style="color:#FF0000;">ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file)</span></strong>

¹ØÓÚAndroidϵͳµÄeventÈÕÖ¾£¬¿ÉÒԲο¼AndroidÈÕ־ϵͳÇý¶¯³ÌÐòLoggerÔ´´úÂë·ÖÎö¡¢AndroidÓ¦ÓóÌÐò¿ò¼Ü²ãºÍϵͳÔËÐпâ²ãÈÕ־ϵͳԴ´úÂë·ÖÎöºÍAndroidÈÕ־ϵͳLogcatÔ´´úÂë¼òÒª·ÖÎöÕâ¸öϵÁеÄÎÄÕ¡£

5. ÓÉÓÚʹÓÃÁËBSD¡¢GPLºÍApacheÐí¿ÉµÄÄ£¿é¶ø±ØÐëÔÚ·¢²¼Ê±¸½´øµÄNoticeÎļþ

target_notice_file_txt := $(TARGET_OUT_INTERMEDIATES)/NOTICE.txt
target_notice_file_html := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html
target_notice_file_html_gz := $(TARGET_OUT_INTERMEDIATES)/NOTICE.html.gz
tools_notice_file_txt := $(HOST_OUT_INTERMEDIATES)/NOTICE.txt
tools_notice_file_html := $(HOST_OUT_INTERMEDIATES)/NOTICE.html
kernel_notice_file := $(TARGET_OUT_NOTICE_FILES)/src/kernel.txt
pdk_fusion_notice_files := $(filter $(TARGET_OUT_NOTICE_FILES)/%, $(ALL_PDK_FUSION_FILES))
......
# Install the html file at /system/etc/NOTICE.html.gz.
# This is not ideal, but this is very late in the game, after a lot of
# the module processing has already been done -- in fact, we used the
# fact that all that has been done to get the list of modules that we
# need notice files for.
$(target_notice_file_html_gz): $(target_notice_file_html) | $(MINIGZIP)
$(hide) $(MINIGZIP) -9 < $< > $@
installed_notice_html_gz := $(TARGET_OUT)/etc/NOTICE.html.gz
$(installed_notice_html_gz): $(target_notice_file_html_gz) | $(ACP)
$(copy-file-to-target)
# if we've been run my mm, mmm, etc, don't reinstall this every time
ifeq ($(ONE_SHOT_MAKEFILE),)
<span style="color:#FF0000;"><strong>ALL_DEFAULT_INSTALLED_MODULES += $(installed_notice_html_gz)</strong></span>
endif

6. ÓÃÀ´ÑéÖ¤OTA¸üеÄÖ¤ÊéÎļþ

<span style="color:#FF0000;"><strong>ALL_DEFAULT_INSTALLED_MODULES 
+= $(TARGET_OUT_ETC)/security/otacerts.zip</strong></span>
$(TARGET_OUT_ETC)/security/otacerts.zip: KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR)
$(TARGET_OUT_ETC)/security/otacerts.zip: $(addsuffix .x509.pem,$(DEFAULT_KEY_CERT_PAIR))
$(hide) rm -f $@
$(hide) mkdir -p $(dir $@)
$(hide) zip -qj $@ $<
.PHONY: otacerts
otacerts: $(TARGET_OUT_ETC)/security/otacerts.zip

¶þ. boot.img

´ÓÇ°ÃæµÄ·ÖÎö¿ÉÒÔÖªµÀ£¬build/core/main.mkÎļþ¶¨ÒåÁËboot.img¾µÏñÎļþµÄÒÀÀµ¹æÔò£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÖ´ÐÐmake bootimageÃüÁîÀ´Ö´ÐС£ÆäÖУ¬bootimageÊÇÒ»¸öαĿ±ê£¬ËüÒÀÀµÓÚINSTALLED_BOOTIMAGE_TARGET¡£

INSTALLED_BOOTIMAGE_TARGET¶¨ÒåÔÚbuild/core/MakefileÎļþÖУ¬ÈçÏÂËùʾ£º

ifneq ($(strip $(TARGET_NO_KERNEL)),true)
# -----------------------------------------------------------------
# the boot image, which is a collection of other images.
INTERNAL_BOOTIMAGE_ARGS := \
$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
--kernel $(INSTALLED_KERNEL_TARGET) \
--ramdisk $(INSTALLED_RAMDISK_TARGET)
INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
ifdef BOARD_KERNEL_CMDLINE
INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
endif
BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
ifdef BOARD_KERNEL_BASE
INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
endif
BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
endif
INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg
INTERNAL_BOOTIMAGE_ARGS += --tmpdir $(tmp_dir_for_image)
INTERNAL_BOOTIMAGE_ARGS += --genext2fs $(MKEXT2IMG)
$(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES)
$(call pretty,"Target boot image: $@")
$(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
else # TARGET_BOOTIMAGE_USE_EXT2 != true
$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
$(call pretty,"Target boot image: $@")
$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
$(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw)
endif # TARGET_BOOTIMAGE_USE_EXT2
else # TARGET_NO_KERNEL
# HACK: The top-level targets depend on the bootimage. Not all targets
# can produce a bootimage, though, and emulator targets need the ramdisk
# instead. Fake it out by calling the ramdisk the bootimage.
# TODO: make the emulator use bootimages, and make mkbootimg accept
# kernel-less inputs.
INSTALLED_BOOTIMAGE_TARGET := $(INSTALLED_RAMDISK_TARGET)
endif

ÔÚ½éÉÜboot.img֮ǰ£¬ÎÒÃÇÊ×ÏÈÒª½éÉÜBootLoader¡£ÎÒÃǶ¼ÖªµÀ£¬PCÆô¶¯µÄʱºò£¬Ê×ÏÈÖ´ÐеÄÊÇÔÚBIOSÉϵĴúÂ룬ȻºóÔÙÓÉBIOS¸ºÔð½«Kernel¼ÓÔØÆðÀ´Ö´ÐС£ÔÚǶÈëʽÊÀ½çÀBootLoaderµÄ×÷ÓþÍÏ൱ÓÚPCµÄBIOS¡£

BootLoaderµÄÆô¶¯Í¨³£·ÖΪÁ½¸ö½×¶Î¡£µÚÒ»½×¶ÎÔÚ¹Ì̬´æ´¢ÖÐ(Flash)Ö´ÐУ¬¸ºÔð³õʼ»¯Ó²¼þ£¬ÀýÈçÉèÖÃCPU¹¤×÷ģʽ¡¢Ê±ÖÓÆµÂÊÒÔ¼°³õʼ»¯ÄÚ´æµÈ£¬²¢ÇÒ½«µÚ¶þ½×¶Î¿½±´µ½RAMÈ¥×¼±¸Ö´ÐС£µÚ¶þ½×¶Î¾ÍÊÇÔÚRAMÖÐÖ´ÐУ¬Òò´ËËÙ¶È»á¸ü¿ì£¬Ö÷Òª¸ºÔð½¨Á¢ÄÚ´æÓ³Ïñ£¬ÒÔ¼°¼ÓÔØKernel¾µÏñºÍRamdisk¾µÏñ¡£

BootLoaderµÄµÚ¶þ½×¶ÎÖ´ÐÐÍê³Éºó£¬¾Í¿ªÊ¼Æô¶¯KernelÁË¡£Kernel¸ºÔðÆô¶¯¸÷¸ö×Óϵͳ£¬ÀýÈçCPUµ÷¶È×ÓϵͳºÍÄÚ´æ¹ÜÀí×ÓϵͳµÈµÈ¡£KernelÆô¶¯Íê³ÉÖ®ºó£¬¾Í»á½«Ramdisk¾µÏñ°²×°Îª¸ùϵͳ£¬²¢ÇÒÔÚÆäÖÐÕÒµ½Ò»¸öinitÎļþ£¬½«ÆäÆô¶¯ÎªµÚÒ»¸ö½ø³Ì¡£init½ø³ÌÆô¶¯¾ÍÒâζ×Åϵͳ½øÈëµ½Óû§¿Õ¼äÖ´ÐÐÁË£¬Õâʱºò¸÷ÖÖÓû§¿Õ¼äÔËÐÐʱÒÔ¼°ÊØ»¤½ø³Ì¾Í»á±»¼ÓÔØÆðÀ´¡£×îÖÕÍê³ÉÕû¸öϵͳµÄÆô¶¯¹ý³Ì¡£

BootLoaderµÄµÚÒ»½×¶ÎÊǹ̻¯ÔÚÓ²¼þÖе쬶øboot.imgµÄ´æÔÚ¾ÍÊÇΪBootLoaderµÄµÚÒ»½×¶ÎÌṩµÚ¶þ½×¶Î¡¢Kernel¾µÏñ¡¢Ramdisk¾µÏñ£¬ÒÔ¼°ÏàÓ¦µÄÆô¶¯²ÎÊýµÈµÈ¡£Ò²¾ÍÊÇ˵£¬boot.imgÖ÷Òª°üº¬ÓÐBootLoaderµÄµÚ¶þ½×¶Î¡¢Kernel¾µÏñºÍRamdisk¾µÏñ¡£µ±È»£¬BootLoaderµÄµÚ¶þ½×¶ÎÊÇ¿ÉÑ¡µÄ¡£µ±²»´æÔÚBootLoaderµÄµÚ¶þ½×¶ÎµÄʱºò£¬BootLoaderµÄµÚÒ»½×¶ÎÆô¶¯Íê³Éºó£¬¾ÍÖ±½Ó½øÈëµ½kernelÆô¶¯½×¶Î¡£

boot.img¾µÏñµÄÎļþ¸ñʽ¶¨ÒåÔÚsystem/core/mkbootimg/bootimg.hÖУ¬ÈçÏÂËùʾ£º

/*
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
** | second stage | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
** the specified physical address (kernel_addr, etc)
** 4. prepare tags at tag_addr. kernel_args[] is
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
*/

ËüÓÉ4²¿·Ö×é³É£ºboot header¡¢kernel¡¢ramdiskºÍsecond state¡£Ã¿Ò»¸ö²¿·ÖµÄ´óС¶¼ÊÇÒÔҳΪµ¥Î»µÄ£¬ÆäÖУ¬boot headerÃèÊöÁËkernel¡¢ramdisk¡¢sencond stageµÄ¼ÓÔØµØÖ·¡¢´óС£¬ÒÔ¼°kernelÆô¶¯²ÎÊýµÈµÈÐÅÏ¢¡£

boot headerµÄ½á¹¹Í¬ÑùÊǶ¨ÒåÔÚsystem/core/mkbootimg/bootimg.hÖУ¬ÈçÏÂËùʾ£º

struct boot_img_hdr
{
unsigned char magic[BOOT_MAGIC_SIZE];
unsigned kernel_size; /* size in bytes */
unsigned kernel_addr; /* physical load addr */
unsigned ramdisk_size; /* size in bytes */
unsigned ramdisk_addr; /* physical load addr */
unsigned second_size; /* size in bytes */
unsigned second_addr; /* physical load addr */
unsigned tags_addr; /* physical addr for kernel tags */
unsigned page_size; /* flash page size we assume */
unsigned unused[2]; /* future expansion: should be 0 */
unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
unsigned char cmdline[BOOT_ARGS_SIZE];
unsigned id[8]; /* timestamp / checksum / sha1 / etc */
};

¸÷¸ö³ÉÔ±±äÁ¿µÄº¬ÒåÈçÏÂËùʾ£º

magic£ºÄ§Êý£¬µÈÓÚ¡°ANDROID!¡±¡£

kernel_size£ºKernel´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£

kernel_addr£ºKernel¼ÓÔØµÄÎïÀíµØÖ·¡£

ramdisk_size£ºRamdisk´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£

ramdisk_addr£ºRamdisk¼ÓÔØµÄÎïÀíµØÖ·¡£

second_size£ºBootLoaderµÚ¶þ½×¶ÎµÄ´óС£¬ÒÔ×Ö½ÚΪµ¥Î»¡£

second_addr£ºBootLoaderµÚ¶þ½×¶Î¼ÓÔØµÄÎïÀíµØÖ·¡£

tags_addr£ºKernelÆô¶¯Ö®Ç°£¬ËüËùÐèÒªµÄÆô¶¯²ÎÊý¶¼»áÌîÈëµ½ÓÉtags_addrËùÃèÊöµÄÒ»¸öÎïÀíµØÖ·ÖÐÈ¥¡£

unused£º±£ÁôÒÔºóʹÓá£

page_size£ºÒ³´óС¡£

name£º²úÆ·Ãû³Æ¡£

id£ºÊ±¼ä´Á¡¢Ð£ÑéÂëµÈµÈ¡£

Àí½âÁËBootLoaderµÄÆô¶¯¹ý³Ì£¬ÒÔ¼°boot.imgµÄÎļþ½á¹¹Ö®ºó£¬¾Í²»ÄÑÀí½âboot.imgÎļþµÄÉú³É¹ý³ÌÁË¡£

Ê×Ïȼì²é±äÁ¿TARGET_NO_KERNELµÄÖµÊÇ·ñµÈÓÚtrue¡£Èç¹ûµÈÓÚtrueµÄ»°£¬ÄÇô¾Í±íʾboot.img²»°üº¬ÓÐBootLoaderµÚ¶þ½×¶ÎºÍKernel£¬¼´ËüµÈͬÓÚRamdisk¾µÏñ¡£Èç¹û²»µÈÓÚtrueµÄ»°£¬ÄÇô¾Íͨ¹ýINSTALLED_2NDBOOTLOADER_TARGET¡¢INSTALLED_KERNEL_TARGETºÍINSTALLED_RAMDISK_TARGET»ñµÃBootLoaderµÚ¶þ½×¶Î¡¢KernelºÍRamdisk¶ÔÓ¦µÄ¾µÏñÎļþ£¬ÒÔ¼°Í¨¹ýBOARD_KERNEL_CMDLINE¡¢BOARD_KERNEL_BASEºÍBOARD_KERNEL_PAGESIZE»ñµÃKernelÆô¶¯ÃüÁîÐвÎÊý¡¢Äں˻ùµØÖ·ºÍÒ³´óСµÈ²ÎÊý¡£×îºó¸ù¾ÝTARGET_BOOTIMAGE_USE_EXT2µÄÖµÀ´¾ö¶¨ÊÇʹÓÃgenext2fs»¹ÊÇmkbootimg¹¤¾ßÀ´Éú³Éboot.img¡£

Èý. ramdisk.img

´ÓÇ°ÃæµÄ·ÖÎö¿ÉÒÔÖªµÀ£¬build/core/main.mkÎļþ¶¨ÒåÁËramdisk.img¾µÏñÎļþµÄÒÀÀµ¹æÔò£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÖ´ÐÐmake ramdiskÃüÁîÀ´Ö´ÐС£ÆäÖУ¬ramdiskÊÇÒ»¸öαĿ±ê£¬ËüÒÀÀµÓÚINSTALLED_RAMDISK_TARGET¡£

INSTALLED_RAMDISK_TARGET¶¨ÒåÔÚbuild/core/MakefileÎļþÖУ¬ÈçÏÂËùʾ£º

INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \
$(ALL_PREBUILT) \
$(ALL_COPIED_HEADERS) \
$(ALL_GENERATED_SOURCES) \
$(ALL_DEFAULT_INSTALLED_MODULES))
BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
# We just build this directly to the install location.
INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP)
$(call pretty,"Target ram disk: $@")
$(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@

ALL_PREBUILT¡¢ALL_COPIED_HEADERS¡¢ALL_GENERATED_SOURCESºÍALL_DEFAULT_INSTALLED_MODULESÕ⼸¸ö±äÁ¿µÄº¬ÒåÇ°Ãæ·ÖÎösystem.imgµÄÉú³É¹ý³ÌʱÒѾ­½éÉܹýÁË¡£Òò´Ë£¬ÕâÀïÎÒÃǾͺÜÈÝÒ×ÖªµÀ£¬ramdisk.img¾µÏñʵ¼ÊÉϾÍÊÇÓÉÕ⼸¸ö±äÁ¿ËùÃèÊöµÄ¡¢±£´æÔÚTARGET_ROOT_OUTĿ¼ÖеÄÎļþËù×é³É¡£Óë´ËÏà¶ÔÓ¦µÄÊÇ£¬system.imgÓɱ£´æÔÚTARGET_OUTĿ¼ÖеÄÎļþ×é³É¡£

TARGET_ROOT_OUTºÍTARGET_OUTÓÖ·Ö±ðÊÇÖ¸ÏòÊ²Ã´Ä¿Â¼ÄØ£¿¼ÙÉèÎÒÃǵıàÒëÄ¿±ê²úÆ·ÊÇÄ£ÄâÆ÷£¬ÄÇôTARGET_ROOT_OUTºÍTARGET_OUT¶ÔÓ¦µÄĿ¼¾Í·Ö±ðΪout/target/product/generic/rootºÍout/target/product/generic/system¡£

ÊÕ¼¯ºÃ¶ÔÓ¦µÄÎļþÖ®ºó£¬¾Í¿ÉÒÔͨ¹ýMKBOOTFSºÍMINIGZIPÕâÁ½¸ö±äÁ¿ÃèÊöµÄmkbootfsºÍminigzip¹¤¾ßÀ´Éú³ÉÒ»¸ö¸ñʽΪcpioµÄramdisk.imgÁË¡£mkbootfsºÍminigzipÕâÁ½¸ö¹¤¾ß¶ÔÓ¦µÄÔ´Âë·Ö±ðλÓÚsystem/core/cpioºÍexternal/zlibĿ¼ÖС£

ËÄ. userdata.img

userdata.img¾µÏñÃèÊöµÄÊÇAndroidϵͳµÄdata·ÖÇø£¬¼´/dataĿ¼£¬ÀïÃæ°üº¬ÁËÓû§°²×°µÄAPPÒÔ¼°Êý¾ÝµÈµÈ¡£

´ÓÇ°ÃæµÄ·ÖÎö¿ÉÒÔÖªµÀ£¬build/core/main.mkÎļþ¶¨ÒåÁËuserdata.img¾µÏñÎļþµÄÒÀÀµ¹æÔò£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÖ´ÐÐmake userdataimageÃüÁîÀ´Ö´ÐС£ÆäÖУ¬userdataimageÊÇÒ»¸öαĿ±ê£¬ËüÒÀÀµÓÚINSTALLED_USERDATAIMAGE_TARGET¡£

INSTALLED_USERDATAIMAGE_TARGET¶¨ÒåÔÚbuild/core/MakefileÎļþÖУ¬ÈçÏÂËùʾ£º

INTERNAL_USERDATAIMAGE_FILES := \
$(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
$(info $(TARGET_OUT_DATA))
# If we build "tests" at the same time, make sure $(tests_MODULES) get covered.
ifdef is_tests_build
INTERNAL_USERDATAIMAGE_FILES += \
$(filter $(TARGET_OUT_DATA)/%,$(tests_MODULES))
endif
userdataimage_intermediates := \
$(call intermediates-dir-for,PACKAGING,userdata)
BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img
define build-userdataimage-target
$(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)")
@mkdir -p $(TARGET_OUT_DATA)
@mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt
$(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt)
$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
./build/tools/releasetools/build_image.py \
$(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET)
$(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET), $(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs)
endef
# We just build this directly to the install location.
INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)
$(INSTALLED_USERDATAIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) \
$(INTERNAL_USERDATAIMAGE_FILES)
$(build-userdataimage-target)

INSTALLED_USERDATAIMAGE_TARGETµÄÖµµÈÓÚBUILT_USERDATAIMAGE_TARGET£¬ºóÕßÖ¸ÏòµÄ¾ÍÊÇuserdata.imgÎļþ£¬ËüÒÀÀµÓÚINTERNAL_USERDATAIMAGE_FILESÃèÊöµÄÎļþ£¬¼´ÄÇЩÓÉALL_DEFAULT_INSTALLED_MODULESÃèÊöµÄ¡¢²¢ÇÒλÓÚTARGET_OUT_DATAĿ¼ÏµÄÎļþ¡£¼ÙÉèÎÒÃǵıàÒëÄ¿±ê²úÆ·ÊÇÄ£ÄâÆ÷£¬ÄÇôTARGET_OUT_DATA¶ÔÓ¦µÄĿ¼¾ÍΪout/target/product/generic/data¡£´ËÍ⣬Èç¹ûÎÒÃÇÔÚmake userdataimageµÄʱºò£¬»¹´øÓÐÒ»¸ö¶îÍâµÄtestsÄ¿±ê£¬ÄÇôÄÇЩ½«×Ô¼ºµÄtagÉèÖÃΪtestsµÄÄ£¿éÒ²»á±»´ò°üµ½userdata.img¾µÏñÖС£

INSTALLED_USERDATAIMAGE_TARGET»¹ÒÀÀµÓÚINTERNAL_USERIMAGES_DEPS¡£Ç°ÃæÔÚ·ÖÎösystem.img¾µÏñµÄÉú³É¹ý³ÌʱÌáµ½£¬INTERNAL_USERIMAGES_DEPSÃèÊöµÄÊÇÖÆ×÷userdata.img¾µÏñËùÒÀÀµµÄ¹¤¾ß¡£ÀýÈ磬Èç¹ûÒªÖÆ×÷µÄuserdata.imgʹÓõÄÊÇyaffs2Îļþϵͳ£¬ÄÇô¶ÔÓ¦¹¤¾ß¾ÍÊÇmkyaffs2image¡£

INSTALLED_USERDATAIMAGE_TARGET¹æÔòÓɺ¯Êýbuild-userdataimage-targetÀ´Ö´ÐУ¬¸Ãº¯Êýͨ¹ýbuild_image.py½Å±¾À´Éú³Éuserdata.img¾µÏñÎļþ¡£

Óësystem.img¾µÏñÀàËÆ£¬userdata.img¾µÏñµÄÉú³ÉÒ²¿ÉÒÔͨ¹ýÒ»¸öûÓÐÈκÎÒÀÀµµÄαĿ±êuserdataimage-nodepsÉú³É£¬ÈçÏÂËùʾ£º

.PHONY: userdataimage-nodeps
userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
$(build-userdataimage-target)

µ±ÎÒÃÇÖ´ÐÐmake userdataimage-nodepsµÄʱºò£¬º¯Êýbuild-userdataimage-target¾Í»á±»µ÷ÓÃÖ±½ÓÉú³Éuserdata.imgÎļþ¡£

Îå. recovery.img

recovery.imgÊÇÉ豸½øÈërecoveryģʽʱËù¼ÓÔØµÄ¾µÏñ¡£recoveryģʽ¾ÍÊÇÓÃÀ´¸üÐÂϵͳµÄ£¬ÎÒÃÇ¿ÉÒÔÈÏΪÎÒÃǵÄÉ豸¾ßÓÐÁ½¸öϵͳ¡£Ò»¸öÊÇÕý³£µÄϵͳ£¬ËüÓÉboot.img¡¢system.img¡¢ramdisk.imgºÍuserdata.imgµÈ×é³É£¬ÁíÍâÒ»¸ö¾ÍÊÇrecoveryϵͳ£¬ÓÉrecovery.img×é³É¡£Æ½Ê±ÎÒÃǽøÈëµÄ¶¼ÊÇÕý³£µÄϵͳ£¬Ö»Óе±ÎÒÃÇÐèÒª¸üÐÂÕâ¸öÕý³£µÄϵͳʱ£¬²Å»á½øÈëµ½recoveryϵͳ¡£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔ½«recoveryϵͳÀí½âΪÔÚLinux KernelÖ®ÉÏÔËÐеÄÒ»¸öССµÄÓû§¿Õ¼äÔËÐÐʱ¡£Õâ¸öÓû§¿Õ¼äÔËÐÐʱ¿ÉÒÔ·ÃÎÊÎÒÃÇÆ½Ê±¾­³£Ê¹ÓõÄÄǸöϵͳµÄÎļþ£¬´Ó¶øÊµÏÖ¶ÔËüµÄ¸üС£

ÔÚbuild/core/MakefileÎļþÖУ¬¶¨ÒåÁËÒ»¸öαĿ±êrecoveryimage£¬ÓÃÀ´Éú³Érecovery.img£¬ÈçÏÂËùʾ£º

.PHONY: recoveryimage
recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP)

INSTALLED_RECOVERYIMAGE_TARGETÃèÊöµÄÊÇ×é³ÉrecoveryϵͳµÄÄ£¿éÎļþ£¬¶øRECOVERY_RESOURCE_ZIPÃèÊöµÄÊÇrecoveryϵͳʹÓõÄ×ÊÔ´°ü£¬ËüµÄ¶¨ÒåÈçÏÂËùʾ£º

INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
recovery_initrc := $(call include-path-for, recovery)/etc/init.rc
recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system
recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img
recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery
recovery_resources_common := $(call include-path-for, recovery)/res
recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res))
recovery_resource_deps := $(shell find $(recovery_resources_common) \
$(recovery_resources_private) -type f)
recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab))
# Named '.dat' so we don't attempt to use imgdiff for patching it.
RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat
......
INTERNAL_RECOVERYIMAGE_ARGS := \
$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
--kernel $(recovery_kernel) \
--ramdisk $(recovery_ramdisk)
# Assumes this has already been stripped
ifdef BOARD_KERNEL_CMDLINE
INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
endif
ifdef BOARD_KERNEL_BASE
INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
endif
BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
endif
# Keys authorized to sign OTA packages this build will accept. The
# build always uses dev-keys for this; release packaging tools will
# substitute other keys for this one.
OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem
# Generate a file containing the keys that will be read by the
# recovery binary.
RECOVERY_INSTALL_OTA_KEYS := \
$(call intermediates-dir-for,PACKAGING,ota_keys)/keys
DUMPKEY_JAR := $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar
$(RECOVERY_INSTALL_OTA_KEYS): PRIVATE_OTA_PUBLIC_KEYS := $(OTA_PUBLIC_KEYS)
$(RECOVERY_INSTALL_OTA_KEYS): extra_keys := $(patsubst %,%.x509.pem, $(PRODUCT_EXTRA_RECOVERY_KEYS))
$(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys)
@echo "DumpPublicKey: $@ <= $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys)"
@rm -rf $@
@mkdir -p $(dir $@)
java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@
$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \
$(INSTALLED_RAMDISK_TARGET) \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(recovery_binary) \
$(recovery_initrc) $(recovery_kernel) \
$(INSTALLED_2NDBOOTLOADER_TARGET) \
$(recovery_build_prop) $(recovery_resource_deps) \
$(recovery_fstab) \
$(RECOVERY_INSTALL_OTA_KEYS)
@echo ----- Making recovery image ------
$(hide) rm -rf $(TARGET_RECOVERY_OUT)
$(hide) mkdir -p $(TARGET_RECOVERY_OUT)
$(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/tmp
@echo Copying baseline ramdisk...
$(hide) cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)
@echo Modifying ramdisk contents...
$(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc
$(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/
$(hide) -cp $(TARGET_ROOT_OUT)/init.recovery.*.rc $(TARGET_RECOVERY_ROOT_OUT)/
$(hide) cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/
$(hide) cp -rf $(recovery_resources_common) $(TARGET_RECOVERY_ROOT_OUT)/
$(hide) $(foreach item,$(recovery_resources_private), \
cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/)
$(hide) $(foreach item,$(recovery_fstab), \
cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab)
$(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys
$(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \
> $(TARGET_RECOVERY_ROOT_OUT)/default.prop
$(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk)
$(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@
$(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE),raw)
@echo ----- Made recovery image: $@ --------
$(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET)
$(hide) mkdir -p $(dir $@)
$(hide) find $(TARGET_RECOVERY_ROOT_OUT)/res -type f | sort | zip -0qrj $@ -@

ÓÉÓÚrecovery.imgºÍboot.img¶¼ÊÇÓÃÀ´Æô¶¯ÏµÍ³µÄ£¬Òò´Ë£¬ËüÃǵÄÄÚÈÝÊDZȽÏÀàËÆ£¬ÀýÈç¶¼°üº¬ÓÐKernel¼°ÆäÆô¶¯²ÎÊý¡¢Ramdisk£¬ÒÔ¼°¿ÉÑ¡µÄBootLoaderµÚ¶þ½×¶Î¡£

´ËÍ⣬recovery.img»¹°üº¬ÓÐÒÔϵÄÖ÷ÒªÄÚÈÝ£º

1. ÓÃÀ´ÉèÖÃϵͳÊôÐÔµÄÎļþbuild.propºÍdefault.prop£»

2. ½øÈërecovery½çÃæÊ±Óõ½µÄ×ÊÔ´Îļþrecovery_resources_commonºÍrecovery_resources_private£»

3. ÃèÊö½øÈërecoveryģʽʱҪ°²×°µÄÎļþϵͳ½Å±¾recovery.fstab£»

4. ÔÚrecoveryģʽִÐÐOTA¸üÐÂÒªÓõ½µÄÖ¤ÊéOTA_PUBLIC_KEYS£»

5. ¸ºÔðÉý¼¶ÏµÍ³µÄrecovery³ÌÐò£¬ËüµÄÔ´´úÂëλÓÚbootable/recoveryĿ¼ÖС£

ͨ¹ý¶Ô±ÈAndroidÕý³£Ê¹ÓÃʱµÄϵͳºÍ½øÐÐÉý¼¶Ê±Ê¹ÓõÄRecoveryϵͳ£¬ÎÒÃǾͿÉÒÔ¶ÔÔËÐÐLinuxϵͳµÄÒÆ¶¯É豸£¨»òÕß˵ǶÈëʽÉ豸£©ÊÀ½ç¿úÒ»°ß¶øÖªÈ«±ª£¬Êµ¼ÊÉÏÎÒÃÇÖ»ÐèÒªÓÐÒ»¸öBootLoader¡¢Ò»¸öLinux Kernel£¬ÒÔ¼°Ò»¸öRamdisk£¬¾Í¿ÉÒÔ½«ËüÃÇÔËÐÐÆðÀ´¡£RamdiskÊôÓÚÓû§¿Õ¼äµÄ·¶³ë£¬ËüÀïÃæÖ÷Òª°üº¬ÁËLinux KernelÆô¶¯Íê³ÉʱËùÒª¼ÓÔØµÄ¸ùÎļþϵͳ¡£Õâ¸ö¸ùÎļþϵͳµÄ×÷ÓþÍÊÇΪÕû¸öϵͳÌṩһ¸öinit³ÌÐò£¬ÒÔ±ãLinux Kernel¿ÉÒÔ½«¿ØÖÆÈ¨´ÓÄں˿ռä×ªÒÆµ½Óû§¿Õ¼ä¡£ÏµÍ³ÌṩʲôÑùµÄ¹¦ÄܸøÓû§Ê¹ÓÃÖ÷Ҫȡ¾öÓÚÔÚÓû§¿Õ¼ä²ãÔËÐÐÁËÄÄЩ·þÎñºÍÊØ»¤½ø³Ì¡£ÕâЩ·þÎñÊØ»¤½ø³Ì¶¼ÊÇÖ±½Ó»òÕß¼ä½ÓµØÓÉinit½ø³ÌÆô¶¯µÄ¡£ÀýÈ磬¶ÔÓÚrecoveryϵͳÀ´Ëµ£¬Ëü×îÖ÷ÒªÌṩµÄ¹¦ÄܾÍÊÇÈÃÓû§Éý¼¶ÏµÍ³£¬Ò²¾ÍÊÇËüµÄÖ÷ÒªÓû§¿Õ¼ä·þÎñ¾ÍÊǸºÔðÖ´Ðг¤¼¶ÈÎÎñµÄrecovery³ÌÐò¡£ÓÖÈ磬ÎÒÃÇÕý³£Ê¹ÓõÄAndroidϵͳ£¬ËüµÄÖ÷ÒªÓû§¿Õ¼ä·þÎñºÍÊØ»¤½ø³Ì¶¼ÊÇÓÉsystem.img¾µÏñÌṩµÄ£¬´ËÍ⣬ÎÒÃÇ»¹¿ÉÒÔͨ¹ýuserdata.img¾µÏñÀ´°²×°µÚÈý·½Ó¦ÓÃÀ´·á¸»ÊÖ»úµÄ¹¦ÄÜ¡£Òò´Ë£¬ÎÒÃÇÒ²¿ÉÒÔ˵£¬init½ø³ÌÆô¶¯µÄ·þÎñ¾ö¶¨ÁËϵͳµÄ¹¦ÄÜ¡£µ±È» £¬ÕâЩ¹¦ÄÜÊǽ¨Á¢ÊÇÓ²¼þµÄ»ù´¡Ö®Éϵġ£

ÖÁ´Ë£¬ÎÒÃǾͷÖÎöÍê³ÉAndroidϵͳµÄÖ÷Òª¾µÏñÎļþsystem.img¡¢boot.img¡¢ramdisk.img¡¢userdata.imgºÍrecovery.imgµÄÖÆ×÷¹ý³ÌÁË£¬Ï£Íûͨ¹ýÕâЩ¾µÏñÎļþµÄÖÆ×÷¹ý³ÌÒÔ¼°ËüÃǵÄ×÷ÓõĽéÉÜ£¬Ê¹µÃС»ï°éºó¶ÔAndroidϵͳÓиü½øÒ»²½µÄÈÏʶ¡£Í¬Ê±£¬ÎÒÃÇÒ²½áÊøÁ˶ÔAndroid±àÒëϵͳµÄѧϰÁË¡£ÖØÐÂѧϰÇë²Î¿¼Android±àÒëϵͳ¼òÒª½éÉܺÍѧϰ¼Æ»®Ò»ÎÄ¡£

   
3801 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ