Android10 动态修改开机动画(三)命令说明

build/make/core/Makefile

复制代码
$(if $(filter $(2),new),\
    $(if $(BOARD_NEWIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "new_fs_type=$(BOARD_NEWIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
    $(if $(BOARD_NEWIMAGE_PARTITION_SIZE),$(hide) echo "new_size=$(BOARD_NEWIMAGE_PARTITION_SIZE)" >> $(1))
)

这段代码片段是 Makefile 中的条件语句,用来根据条件在特定情况下向输出文件中写入数据。让我们来逐步解释这段代码:

  1. (if (filter $(2),new),: 这里使用 filter 函数来检查第二个参数是否等于 "new",如果相等,则此条件成立。
  2. 接着是一对括号 (...),用来执行条件成立时的操作。里面包含两个嵌套的 (if ...) 表达式:
  • (if (BOARD_NEWIMAGE_FILE_SYSTEM_TYPE),(hide) echo new_fs_type=(BOARD_NEWIMAGE_FILE_SYSTEM_TYPE)" >> (1)): 这里首先检查变量 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 是否存在,如果存在则执行 echo 命令将 "new_fs_type=BOARD_NEWIMAGE_FILE_SYSTEM_TYPE的值" 追加写入到文件 (1) 中。
  • (if (BOARD_NEWIMAGE_PARTITION_SIZE),(hide) echo "new_size=(BOARD_NEWIMAGE_PARTITION_SIZE)" >> (1)): 同样地,这里检查变量 BOARD_NEWIMAGE_PARTITION_SIZE 是否存在,如果存在则执行 echo 命令将 "new_size=BOARD_NEWIMAGE_PARTITION_SIZE的值" 追加写入到文件 (1) 中。

综上所述,这段代码的作用是:当第二个参数等于 "new" 时,根据条件检查 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 和 BOARD_NEWIMAGE_PARTITION_SIZE 变量是否存在,如果存在则将相应的内容写入到指定的文件中。

复制代码
$(call generate-image-prop-dictionary,$(1),system vendor cache prodnv new userdata product product_services oem odm socko odmko,$(2))
  • $(call ...): 这是 Makefile 中调用函数的语法。
  • generate-image-prop-dictionary: 这是函数的名称,它的作用是生成一个镜像属性字典。
  • (1), (2): 这些是函数的参数。在 Makefile 中,函数调用可以通过 (1)、(2) 等来引用参数,这些参数在调用函数时会被具体的值替换。

具体到这个调用:

  • 第一个参数 $(1):通常用于指定生成属性字典的目标文件或目录路径。

  • 第二个参数 system vendor cache prodnv new userdata product product_services oem odm socko odmko:这些是传递给函数的额外参数,具体含义可能是指定哪些部分的属性需要被包含在生成的字典中。

  • 第三个参数 $(2):可能是另一个目标文件或目录路径,或者其他参数,具体功能由函数 generate-image-prop-dictionary 的实现定义

    ifdef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
    INTERNAL_NEWIMAGE_FILES :=
    (filter (TARGET_OUT_NEW)/%,$(ALL_DEFAULT_INSTALLED_MODULES))

    newimage_intermediates :=
    (call intermediates-dir-for,PACKAGING,new) BUILT_NEWIMAGE_TARGET := (PRODUCT_OUT)/new.img

    define build-newimage-target
    (call pretty,"Target new fs image : (INSTALLED_NEWIMAGE_TARGET)")
    @mkdir -p (TARGET_OUT_NEW) @mkdir -p (newimage_intermediates) && rm -rf (newimage_intermediates)/new_image_info.txt (call generate-userimage-prop-dictionary, (newimage_intermediates)/new_image_info.txt) (hide) PATH=(foreach p,(INTERNAL_USERIMAGES_BINARY_PATHS),(p):)PATH \ build/tools/releasetools/build_image.py \ (TARGET_OUT_NEW) (newimage_intermediates)/new_image_info.txt (INSTALLED_NEWIMAGE_TARGET) (TARGET_OUT) (hide) (call assert-max-image-size,(INSTALLED_NEWIMAGE_TARGET),$(BOARD_newIMAGE_PARTITION_SIZE))
    endef

    INSTALLED_NEWIMAGE_TARGET := $(BUILT_NEWIMAGE_TARGET)

    (INSTALLED_NEWIMAGE_TARGET): (INTERNAL_USERIMAGES_DEPS) (INTERNAL_NEWIMAGE_FILES) (build-newimage-target)

    .PHONY: newimage-nodeps nnod
    newimage-nodeps nnod : | (INTERNAL_USERIMAGES_DEPS) (build-newimage-target)

    else ifdef BOARD_PREBUILT_NEWIMAGE
    INSTALLED_NEWIMAGE_TARGET := (PRODUCT_OUT)/new.img (eval (call copy-one-file,(BOARD_PREBUILT_NEWIMAGE),$(INSTALLED_NEWIMAGE_TARGET)))
    endif

这段代码片段是一个 Makefile 中的条件语句,它根据条件选择性地定义了一个名为 INSTALLED_NEWIMAGE_TARGET 的目标文件,并且定义了一个构建该目标文件的规则。

让我们来逐步解释:

  1. ifdef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE: 这是一个条件语句,检查是否定义了 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 变量。如果定义了,则执行相应的操作。
  2. 接着是一个代码块,用来定义变量和规则:
    • INTERNAL_NEWIMAGE_FILES:定义了一组文件路径,通过筛选 (ALL_DEFAULT_INSTALLED_MODULES) 中以 (TARGET_OUT_NEW)/% 开头的路径。
    • newimage_intermediates:定义了一个中间目录路径,用来存放生成的中间文件。这个路径通过 $(call intermediates-dir-for,PACKAGING,new) 函数获取。
    • BUILT_NEWIMAGE_TARGET:定义了一个目标文件路径,指向 $(PRODUCT_OUT)/new.img。
    • build-newimage-target:定义了一个规则来构建目标新镜像文件。它包括创建目录、生成信息文件、调用 Python 脚本等步骤。
  1. 接下来是一个条件块 else ifdef BOARD_PREBUILT_NEWIMAGE,检查是否定义了 BOARD_PREBUILT_NEWIMAGE 变量。如果定义了,则直接将 INSTALLED_NEWIMAGE_TARGET 设置为预先构建的目标文件路径,并复制文件。

综上所述,这段代码的作用是:根据不同的条件,选择性地定义了 INSTALLED_NEWIMAGE_TARGET 变量,并定义了构建新镜像文件的规则。

build-newimage-target中:

复制代码
$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
      build/tools/releasetools/build_image.py \
      $(TARGET_OUT_NEW) $(newimage_intermediates)/new_image_info.txt $(INSTALLED_NEWIMAGE_TARGET) $(TARGET_OUT)

这个命令看起来像是在一个Makefile或者类似的脚本中,用于执行一个Python脚本build/tools/releasetools/build_image.py。下面是对这个命令的分解:

  1. $(hide) - 这通常是一个指示器,表示该命令的输出应该被隐藏,避免在终端中显示。
  2. PATH=(foreach p,(INTERNAL_USERIMAGES_BINARY_PATHS),(p):)$PATH - 这一行设置了环境变量

PATH。(foreach p,(INTERNAL_USERIMAGES_BINARY_PATHS),(p):)将会遍历变量(INTERNAL_USERIMAGES_BINARY_PATHS)中的每一个元素,并且为每个元素添加一个冒号(:),这意味着它将在原有的PATH值前面添加这些路径。

  1. build/tools/releasetools/build_image.py - 这是被调用的Python脚本的路径。
  2. $(TARGET_OUT_NEW) - 这是一个变量,代表目标输出的新路径。
  3. $(newimage_intermediates)/new_image_info.txt - 这是另一个中间输出文件的路径,可能包含了新映像的一些信息。
  4. $(INSTALLED_NEWIMAGE_TARGET) - 这指定了新映像的目标位置。
  5. $(TARGET_OUT) - 这是原始的目标输出路径。

综上所述,这个命令基本上是在更新或构建一个新的映像文件,通过修改PATH环境变量来确保必要的工具可以在执行时找到,然后利用修改后的PATH运行Python脚本来生成新的映像文件。

复制代码
$(hide) $(call assert-max-image-size,$(INSTALLED_ANIMIMAGE_TARGET),$(BOARD_newIMAGE_PARTITION_SIZE))

这行代码看起来是在使用一个名为assert-max-image-size的宏,它接受两个参数:第一个是目标图像文件(在这里是(INSTALLED_ANIMIMAGE_TARGET)),第二个是该图像允许的最大尺寸(在这里是(BOARD_newIMAGE_PARTITION_SIZE))。$(hide)部分可能意味着输出将被隐藏或抑制,所以你不会在控制台上看到这个调用的结果。

让我们分解一下:

  • $(call assert-max-image-size,...,...):调用名为assert-max-image-size的宏,传递两个参数。
  • $(INSTALLED_ANIMIMAGE_TARGET): 这是一个变量,它包含了要检查大小的动画图像文件的目标路径或名称。
  • $(BOARD_newIMAGE_PARTITION_SIZE): 这也是一个变量,它指定了新图像分区的大小限制。

结合这些信息,我们可以推断出,这行代码的作用是确保(INSTALLED_ANIMIMAGE_TARGET)文件的大小不超过(BOARD_newIMAGE_PARTITION_SIZE)所定义的限制。如果超过了这个限制,assert-max-image-size宏可能会产生一些动作,比如抛出错误、警告或者输出一条消息。

因此,整个表达式的意思是:"在不显示详细输出的情况下,调用assert-max-image-size宏来检查动画图像文件的最大尺寸是否超出限制"。

复制代码
BUILDING_NEW_IMAGE :=
ifeq ($(PRODUCT_BUILD_NEW_IMAGE),)
  ifdef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
    BUILDING_NEW_IMAGE := true
  endif
else ifeq ($(PRODUCT_BUILD_NEW_IMAGE),true)
  BUILDING_NEW_IMAGE := true
  ifndef BOARD_NEWIMAGE_FILE_SYSTEM_TYPE
    $(error PRODUCT_BUILD_NEW_IMAGE set to true, but BOARD_NEWIMAGE_FILE_SYSTEM_TYPE not defined)
  endif
endif
.KATI_READONLY := BUILDING_NEW_IMAGE

定义了一个变量 BUILDING_NEW_IMAGE,用于确定是否正在构建新的镜像。它首先检查是否定义了 PRODUCT_BUILD_NEW_IMAGE,如果没有定义,则检查是否定义了 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE,如果定义了,则将 BUILDING_NEW_IMAGE 设置为 true。如果 PRODUCT_BUILD_NEW_IMAGE 被设置为 true,但是 BOARD_NEWIMAGE_FILE_SYSTEM_TYPE 没有定义,那么会产生一个错误。最后,.KATI_READONLY 用于将 BUILDING_NEW_IMAGE 标记为只读

相关推荐
CYRUS STUDIO2 小时前
FART 主动调用组件设计和源码分析
android·逆向·源码分析·fart·脱壳
zimoyin6 小时前
kotlin Android AccessibilityService 无障碍入门
android·开发语言·kotlin
韩仔搭建18 小时前
第二章:安卓端启动流程详解与疑难杂症调试手册
android·ui·娱乐
A-花开堪折18 小时前
Android7 Input(七)App与input系统服务建立连接
android
冰糖葫芦三剑客18 小时前
Android 自定义悬浮拖动吸附按钮
android
吃汉堡吃到饱18 小时前
【Android】从Choreographer到UI渲染(二)
android·ui
微信公众号:AI创造财富18 小时前
显示的图标跟UI界面对应不上。
android·ui
aningxiaoxixi18 小时前
安卓 Audio Stream 类型
android
奔跑吧 android19 小时前
【android bluetooth 协议分析 01】【HCI 层介绍 3】【NUMBER_OF_COMPLETED_PACKETS 事件介绍】
android·bluetooth·hci·bt·gd·aosp13
_龙小鱼_21 小时前
Kotlin扩展简化Android动画开发
android·开发语言·kotlin