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 标记为只读

相关推荐
参宿四南河三1 小时前
Android Compose SideEffect(副作用)实例加倍详解
android·app
火柴就是我2 小时前
mmkv的 mmap 的理解
android
没有了遇见2 小时前
Android之直播宽高比和相机宽高比不支持后动态获取所支持的宽高比
android
shenshizhong3 小时前
揭开 kotlin 中协程的神秘面纱
android·kotlin
vivo高启强3 小时前
如何简单 hack agp 执行过程中的某个类
android
沐怡旸3 小时前
【底层机制】 Android ION内存分配器深度解析
android·面试
你听得到114 小时前
肝了半个月,我用 Flutter 写了个功能强大的图片编辑器,告别image_cropper
android·前端·flutter
KevinWang_4 小时前
Android 原生 app 和 WebView 如何交互?
android
用户69371750013844 小时前
Android Studio中Gradle、AGP、Java 版本关系:不再被构建折磨!
android·android studio
杨筱毅5 小时前
【底层机制】Android低内存管理机制深度解析
android·底层机制