在将系统文件夹打包到 system.img 之前替换一些文件

Replacing some files before packaging system folder to system.img

由于标题是self-explanatory,我想在生成system.img之前替换system/bin/system/lib/中的一些文件。

更准确地说,我有一些预建的 .so 文件,应该将其复制到现有文件之上。例如 libart.so。请注意,用修改后的艺术源代码替换 art/(艺术源代码)不是一个选项。

为此,我应该调查哪个 mk 文件并将替换代码放入其中?

您可以遵循与此 中建议的结构相同的结构,但使用此宏:

PRODUCT_COPY_FILES += \
     device/common/my_bin.bin:cache/my_bin.bin \
     device/common/my_so.so:system/art/my_so.so

其工作原理如下:

  • 文件从左向(:)右复制。
  • 生成图像时,在本例中为 cachesystem,它将使用这些文件夹中包含的文件生成。
  • 由于我们已将文件复制到该目的地,因此当生成 system.img 时,将包含我们的文件。

此外,复制此文件的顺序也很重要。例如,如果您正在复制一个已经存在的文件,那么您希望替换它。 (作为您的 libart.so),您需要先调用该副本,然后再调用默认副本。

为此,我建议这样做:

  • source build/envsetup.sh
  • lunch <<device>>
  • mgrep libart.so -> 这会通过 mk 文件进行 grep,因此您可以看到默认复制完成的位置。
  • 在所需的 mk 文件中插入 $(info whatever) 调用以追踪添加 PRODUCT_COPY_FILES.
  • 的好位置

很难回答添加到哪里。我自己从来没有修改过 libart.so,但是我用这种方法复制了很多文件,而且效果很好。

我希望它也适用于你的情况。

还有一个选项可以将二进制 .so 库添加为产品包,使用 .mk 文件中的 PREBUILT_SHARED_LIBRARY 选项: or BUILD_PREBUILT

一个快速肮脏的方法:

  1. 将所需文件复制到 out(..)/system/lib 或 system.img 构建后的任何地方
  2. make snod

其他方法是使用 Android.mk。在设备树中创建一个新目录,例如 libart-prebuilt。将你的库放在这里,然后创建一个内容为

的 Android.mk 文件
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libart-prebuilt
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
LOCAL_MODULE_STEM := libart
LOCAL_MODULE_SUFFIX := $(TARGET_SHLIB_SUFFIX)
LOCAL_SRC_FILES := libart.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES

include $(BUILD_PREBUILT)

现在只需在 device.mk

中将 libart-prebuilt 添加到 PRODUCT_PACKAGES