在将系统文件夹打包到 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
其工作原理如下:
- 文件从左向(:)右复制。
- 生成图像时,在本例中为
cache
或 system
,它将使用这些文件夹中包含的文件生成。
- 由于我们已将文件复制到该目的地,因此当生成
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
一个快速肮脏的方法:
- 将所需文件复制到 out(..)/system/lib 或 system.img 构建后的任何地方
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
由于标题是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
其工作原理如下:
- 文件从左向(:)右复制。
- 生成图像时,在本例中为
cache
或system
,它将使用这些文件夹中包含的文件生成。 - 由于我们已将文件复制到该目的地,因此当生成
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
选项:BUILD_PREBUILT
一个快速肮脏的方法:
- 将所需文件复制到 out(..)/system/lib 或 system.img 构建后的任何地方
make snod
其他方法是使用 Android.mk。在设备树中创建一个新目录,例如 libart-prebuilt
。将你的库放在这里,然后创建一个内容为
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