创建一个构建 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 期间未创建版本信息符号链接