overlay文件(overlay)

http://www.itjxue.com  2023-03-20 13:21  来源:未知  点击次数: 

Android中的overlay机制

Overlay作用:

保持原生源码资源不变的基础上,实现某些UI的客制化。

通过overlay覆盖现有系统或应用中的资源。如strings, config, drawable...

Overlay实现:

两种方式:

1.?静态overlay,SRO-Static resource overly

资源替换发生在编译时,?需要在Android源码环境中进行配置。最终生成一个apk。

使用条件:有源码环境。

好处:内存占用少。

实现:

四个mk的变量:

DEVICE_PACKAGE_OVERLAYS--

PRODUCT_PACKAGE_OVERLAYS--级别最高,也就是优化用PRODUCT_PACKAGE_OVERLAYS中的overlays(高於DEVICE_PACKAGE_OVERLAYS)

PRODUCT_ENFORCE_RRO_TARGETS

PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS

在Android O上面 Google增加了一个enforced RRO的方法,可以把之前的build time overlay强制转换成runtime resource overlay.如果overlay的是framework-res的资源包,那麼会自动生成一个file在/vendor/overlay/framework-res__auto_generated_rro.apk. 裏面会包含overlay的资源。也就是说,对於加了PRODUCT_ENFORCE_RRO_TARGETS的模块,便由SRO变成RRO模式,如果仍然想保持SRO模式,就需要使用到PRODUCT_ENFORCE_RRO_EXCLUDED_OVERLAYS变量。

overlay只是覆盖已有的资源文件,但对於新增的资源文件,需要这样写:

!-- add for status bar system icon define --

? ? add-resource type="string" name="status_bar_child_mode"/

? ? string translatable="false" name="status_bar_child_mode"child_mode/string

2.?动态overlay,即运行时overlay。RRO-Runtime resource overlay

资源替换发生在运行时,不必要源码。替换的资源会独立生成一个*.overlay.apk。

好处:不需要源码,可以为第三方app进行资源替换。

实现:overlay apk?的manifest中加入

overlay android:targetPackage="com.xxx.xxx" android:priority="1"/

overlay 是什么意思啊?

v.覆盖;?镀金;

n.覆盖物;?轮廓纸;

变形:

过去式:overlaid????过去分词:overlaid?????现在分词:overlaying?????第三人称单数:overlays

双语例句:

Silver?overlay?is bonded to the entire surface. 整个表面都镀了一层银。

An?overlay?of wood covers the brick wall. 砖墙上覆盖了一层木板.

There can be an emotional?overlay?to the frustration of solving real problems. 在真正的问题难以解决而感到沮丧的时候,可能会用其他情感来掩饰。

集群镜像中的overlay2使用剖析

sealer 是阿里巴巴开源的基于kuberentes的集群镜像开源技术,可以把整个集群整体打包。

sealer中集群镜像的存储和docker镜像很像,也采用了写时复制的技术来提升复用性。

本文聊一下overlay2。

COPY on Write在很多地方都会用到,比如git的存储,去修改一个文件并非真的修改,

而是把文件拷贝出来修改,读的时候读取上层的修改层,同样比如在ceph的后段存储

等系统中都存在应用。好处是可以非常方便的进行回滚,以及存储复用,比如给虚拟机

做快照,那我们并不需要把整个系统盘复制一份,而只需要用指针指一下快照的地方就好。

容器镜像同理,写时复制可以让多个应用共享一个基础镜像。

集群镜像把整个集群打包,用写时复制的方法可以帮助分布式应用共享k8s基础镜像。

以及可以很方便的把各种分布式应用镜像进行融合。

overlay文件系统分为lowerdir、upperdir、merged, 对外统一展示为merged,uperdir和lower的同名文件会被upperdir覆盖

workdir必须和upperdir是mount在同一个文件系统下, 而lower不是必须的

lowerdir可以是多个目录(前面覆盖后面),如果没有upperdir,那merged是read only.

overlay只支持两层,upper文件系统通常是可写的;lower文件系统则是只读,这就表示着,当我们对 overlay 文件系统做任何的变更,都只会修改 upper 文件系统中的文件

来个实际操作:

以上overlay2下面的几个目录就被合并了

对只在 lower 有的文件写时,则会做一个copy_up 的操作,先从 lower将文件拷贝一份到upper,同时为文件创建一个硬链接。此时可以看到 upper 目录下生成了两个新文件,写的操作只对从lower 复制到 upper 的文件生效,而 lower 还是原文件

删除 lower 和 upper 都有的文件时,upper 的会被删除,在 upper 目录下创建一个 ‘without’ 文件,而 lower 的不会被删除

有了上述理论基础,我们先看一段 docker里面的源码

mountTarget就是目标目录, mountData是: fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", string(lowers), path.Join(id, "diff"), path.Join(id, "work"))

可以看到SDK的使用和命令行很像

我们可以做一个封装:

主要是syscall.Mount这个系统调用,参数基本和命令行一一对应

sealer中overlay2源码地址

kubernetes一键安装

sealer集群整体打包!

docker联合文件系统

(Union filesystem)联合文件系统允许我们把多个文件系统逻辑上合并成一个文件系统,组成Union filesystem的文件系统不必相同(它们可以是ext2/3/4,vfat,ntfs,jffs...)。overlay是联合文件系统的一种(aufs...),overlay文件系统构建于其他文件系统之上,overlay其实更像是个挂载系统(mount system),功能是把不同的文件系统挂载到统一的路径。

overlay是个分层的文件系统,底层文件系统通常叫 lower ,顶层文件系统系统通常叫 upper ,两者通常合并挂载到 merged 目录,最终用户看到的就是 merged 中的文件。

lower 文件系统是readonly,对 merged 中所有的修改都只对 upper 操作,记住这点很重要。下面我们在linux上创建一个overlay文件系统,用以说明overlay文件系统挂载,文件读写,文件新增和删除。

创建 lower upper merged work 目录,把 lower和upper 挂载到 merged , work 是空目录,必须和 merged 的文件系统类型一样。

挂载: sudo mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work merged/ ,挂载后 merged 目录结构如下:

可以看到 lower 和 upper 中的文件合并到了 merged 中,当 lower 和 upper 有相同路径的文件时, merged 中只显示 upper 中的。也就是说 upper 会遮住 lower 中同名的文件(同路径下)。

overlay提供了对只读文件系统的读写功能,适合用在需要维持一个只读镜像,又需要提供读写功能的系统中,比如openwrt和docker,下面我们介绍docker中overlay的应用。

docker的基础镜像其实就是个readonly的根文件系统,从基础镜像构建的镜像其实都只是把修改部分和基础镜像合并重新打包,我们从ubuntu镜像构建一个具有golang环境的镜像,用来说明overlay在docker中的应用。

Dockerfile 如下:

构建镜像

启动容器

查看容器

查看GraphDriver

从上面可以看到docker采用的是overlay2文件系统,LowerDir有多层。

/var/lib/docker/overlay2/1d65e86e54373a5b01afe28d0878a953fa2e9eb7cd14552a17d4a8628b476978/diff

/var/lib/docker/overlay2/b56e1dd54abdf8300b2f9726e3e92d3b32b78c8bf5b5cd807e27be78c671af40/diff

/var/lib/docker/overlay2/44c045232b8f3510d28965fbebcaad458263855785cc38e1a784a6731df7433d/diff

为什么会有这么多层,其实很好理解,查看Dockerfile中写了哪些规则:

现在我们核对下最地城镜像是否是ubuntu的镜像文件:

ubuntu是基础镜像,没有LowerDir, UpperDir就是我新建ubuntu:golang镜像LowerDir的最底层文件系统

batocera(巴托塞拉系统)在运行时修改系统

在运行时修改系统

默认情况下,batocera.linux就像固件。这是一个名为/ boot / batocera的文件。您不能直接修改它。但是,如果需要,有一些技巧可以解决。

# for /boot

mount -o remount,rw /boot

# for other modifications

# do any modification

# if you reboot, the modifications are lost,

# except if you saved them via

batocera-save-overlay

该脚本在/boot/boot/overlay文件中创建一个文件,该文件存储您所做的所有修改。

警告 :此覆盖文件会在下次升级时自动删除。

如果要删除所有自定义项,只需删除此overlay文件。

注意:对于当前的Odroid xu4版本无法完成此操作。

不需要修改系统的情况

您通常不需要编辑/etc/fstab,而是使用 store_games_on_a_nas 。

您不应该修改/usr/share/emulationstation/es_systems.cfg

而是将此文件复制到/userdata/system/configs/emulationstation/es_systems.cfg并从那里进行自定义。

在启动时,EmulationStation首选后者(如果存在)。

(责任编辑:IT教学网)

更多

推荐java认证文章