搜索
 找回密码
 立即注册

简单一步 , 微信登陆

Android系统镜像文件的打包|过程分析(2)

作者:liuwei | 时间:2016-9-28 13:13:29 | 阅读:3740| 只看该作者

注意,ALL_DEFAULT_INSTALLED_MODULES描述的文件除了在build/core/main.mk文件中定义的模块文件之外,还包含以下这些文件:

        1. 通过PRODUCT_COPY_FILES定义的要拷贝到目标设备上去的文件


[plain] view plain copy


  • 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_destinati** :=  
  • $(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_destinati**),$(_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_destinati** += $(_dest))))  

        2.  由ADDITIONAL_DEFAULT_PROPERTIES定义的属性所组成的default.prop文件

[plain] view plain copy


  • 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文件

[plain] view plain copy


  • 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文件

[plain] view plain copy


  • 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文件


[plain] view plain copy


  • 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更新的ZS文件

[plain] view plain copy


  • <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  

      

收藏
收藏0
分享
分享
点赞
点赞0
反对
反对0
回复

使用道具 举报

大神点评1

沙发#
liuwei 发表于:2016-9-28 14:10:19
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
手机版