安卓源代码叠加层是如何工作的?

16
在Android源代码的device/sample文件夹中,有一个名为overlays的文件夹。在例如青柠模组中也可以看到相同的覆盖文件夹。
这个覆盖文件夹是什么?它如何工作?它有什么用?我在哪里可以阅读更多相关信息?
提前感谢。
2个回答

11

覆盖是自定义资源文件的一种方式,不适用于源文件。

替换按字符串粒度工作。这意味着对于覆盖文件中不存在的字符串,将使用原始字符串。

根据文档

Android构建系统使用资源覆盖来定制产品的构建。资源覆盖指定要应用于默认资源之上的资源文件。要使用资源覆盖,请修改项目构建文件以将PRODUCT_PACKAGE_OVERLAYS设置为相对于顶级目录的路径。该路径成为影子根,在构建系统搜索资源时与当前根一起搜索。

最常用的自定义设置包含在文件frameworks/base/core/res/res/values/config.xml中。

要在此文件上设置资源覆盖,请使用以下其中之一将覆盖目录添加到项目构建文件中:

PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay

然后,将一个覆盖文件添加到目录中,例如:

vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml

在覆盖config.xml文件中发现的任何字符串或字符串数组将替换原始文件中找到的那些。


1
一个非常精确和技术严格的答案。我可以建议您添加一个简短而简单的实际示例吗?这样,经验不足的开发人员将更容易从中学习。 - Dean

9
例如,假设您想为您的设备修改Android源代码中的某些文件(例如,您想向启动器资源添加附加字符串)。不建议修改Android的实际源代码。
相反,您可以创建覆盖层,模拟Android的实际文件系统路径布局,并在其中放置更改后的文件。对于启动器中的字符串,您可以创建与路径对应的目录:packages/apps/Launcher2/res/values 并将修改后的 strings.xml 放入其中。
因此,当您构建您的设备时,该文件将被替换。

2
据我所了解,它只适用于资源,而不适用于Java源文件。因此,在我看来,可用性相当有限。@Yury:您是否有使用Java源或任何参考的示例可以阅读更多? - Bjarke Freund-Hansen
这个有实际的文档吗? - njzk2
尝试检查设备和供应商文件夹。在设备文件夹中有一个名为sample的子目录。这是一个示例,其中包含一些信息。 - Yury
我们可以覆盖整个布局吗? - AnAndroid
你还应该在设备的相应构建文件中添加PRODUCT_PACKAGE_OVERLAYS变量(这应该由lunch命令提供的参数确定),例如:PRODUCT_PACKAGE_OVERLAYS := vendor/foo/overlay。 - Dean
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接