0

由于标题是不言自明的,我想在生成时替换system/bin/一些system/lib/文件system.img

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

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

4

3 回答 3

3

您可以遵循与其他问题中提出的结构相同的结构,但使用此宏:

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,因此您可以查看默认副本的完成位置。
  • 在所需文件中插入$(info whatever)调用mk以跟踪添加PRODUCT_COPY_FILES.

很难回答在哪里添加它。我从未修改过libart.so自己,但我以这种方式复制了许多文件,它就像一个魅力。

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

于 2017-06-13T08:07:46.537 回答
1

一个快速肮脏的方法:

  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)

现在只需添加libart-prebuiltPRODUCT_PACKAGES您的 device.mk

于 2017-06-13T13:01:00.653 回答
0

还有一个选项可以将二进制 .so 库添加为产品包,使用PREBUILT_SHARED_LIBRARY.mk 文件中的选项:Include prebuilt shared library in Android AOSPBUILD_PREBUILT https://stackoverflow.com/a/25682674/1028256

于 2017-06-13T11:19:04.890 回答