ÔÚÇ°ÃæÒ»ÆªÎÄÕÂÖУ¬ÎÒÃÇ·ÖÎöÁË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±àÒëϵͳ¼òÒª½éÉܺÍѧϰ¼Æ»®Ò»ÎÄ¡£ |