创建一个构建 Android 映像的符号链接

Posted

技术标签:

【中文标题】创建一个构建 Android 映像的符号链接【英文标题】:Create a symlink building an Android image 【发布时间】:2021-06-08 20:45:42 【问题描述】:

我正在编写新设备和产品的定义来构建自定义 android 映像,我需要在构建映像时创建符号链接,但不清楚在 Android 中执行此操作的正确方法是什么mk 文件。

例如,假设我需要创建一个名为 wget 的链接,该链接指向 /system/bin中的可执行文件 busybox > 目录。

像下面这样调用 shell 命令可能会起作用,但不鼓励这样做,因为它会在解析 mk 文件时多次执行(因此也适用于主机系统) :

$(shell ln -frs $(TARGET_OUT_EXECUTABLES)/busybox $(TARGET_OUT_EXECUTABLES)/wget)

我尝试的另一种方法是填充这样的目录树:

$ tree device/my_vendor/my_device/links
links
└── system
    └── bin
        └── wget -> busybox

然后使用此代码:

PRODUCT_COPY_FILES += \
        $(call find-copy-subdir-files,*,device/my_vendor/my_device/links,$(TARGET_COPY_OUT_ROOT))

但镜像中根本没有创建文件,日志中也没有任何内容。

那么,添加符号链接、创建 Android 图像的正确方法是什么?

额外问题:如何创建一个将驻留在根目录中的链接?例如,像 /link 这样指向 /vendor/directory 的东西?

谢谢!

【问题讨论】:

【参考方案1】:

使用 LOCAL_POST_INSTALL_CMD(适用于所有类型的模块)或 LOCAL_POST_LINK_CMD(仅适用于可执行文件)

    LOCAL_POST_INSTALL_CMD example LOCAL_POST_LINK_CMD example

【讨论】:

这很有趣!我会试试看它是否有效 我按照 build/make/core 中的示例尝试了LOCAL_POST_INSTALL_CMD += ; ln -sf /destination-of-symlink $(TARGET_ROOT_OUT)/name-of-symlink,但它似乎不起作用,并且日志中没有任何内容(干净的构建)。这很奇怪。 执行命令时能否确定destination-of-symlink是否存在。 是的,对于我的测试,我正在使用 /vendor $(TARGET_ROOT_OUT)/link-to-vendor 所以我确定它存在。我将 LOCAL_POST_INSTALL_CMD 添加到我的产品 mk 文件中;它应该在其他地方吗?谢谢! 你的产品 mk 文件是什么意思。它应该在 Android.mk 中,而不是 device.mk【参考方案2】:

执行此操作的标准方法是在引导期间通过init.rc 文件在“运行时”中。

根据init/README.md,它的语法是:

symlink <target> <path> 在 path 处创建一个符号链接,其值为 target

“构建时间”中可能还有其他方法可以做到这一点,但我还没有遇到过,我已经看到很多 AOSP 的部分使用init.rc 方式。

【讨论】:

谢谢;我一直在寻找一种在构建时执行此操作的方法,但您可能是对的,并且在启动时执行此操作可能是唯一(理智)的方法。

以上是关于创建一个构建 Android 映像的符号链接的主要内容,如果未能解决你的问题,请参考以下文章

Linux From Scratch(LFS11.0)进入 Chroot 构建临时工具 - 创建必要的文件和符号链接

LFS 系列从零开始 DIY Linux 系统:构建 LFS 系统 - 创建必需的文件和符号链接

Libtool 在 make install 期间未创建版本信息符号链接

Android 无法解析符号 OnRequestPermissionsResultCallback

符号链接和硬链接有啥区别?

Android6.0 init.rc中创建符号链接失败问题