Makefile中通过sed命令生成文件系统的selinux的配置文件vendor_filesystem_config.txt
今天在编译android-O(8.0)的时候,我自己新增加了一个ext4格式的分区,在编译这个分区的时候,需要对应的生成文件系统的配置文件xxxx_filesystem_config.txt,发现了生成这个配置文件的的Makefile里面,调用了sed命令来处理一些字符串:
build/core/Makefile
define fs_config
(cd $(1); find . -type d | sed 's,$$,/,'; find . \! -type d) | cut -c 3- | sort | sed 's,^,$(2),' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC)
endef
$(call fs_config,$(zip_root)/VENDOR,vendor/) > $(zip_root)/META/vendor_filesystem_config.txt
刚开始看的有点晕,一句命令很长,我们拆分开来一个个分析:
cd $(1), 进入到指定的目录
find . -type d | sed 's,$$,/,'; 查找当前目录下所有的子目录,如果以$结尾的,使用/替换$
find . \! -type d 查找当前目录下所有的非目录文件
cut -c 3- 去掉字符串的前面两个字符
Sort 排序
sed 's,^,$(2) 字符串开头加上指定字符串
我们来看看,这一系列的命令到底做了哪些动作:
给出的调用是,用来生成vendor的系统配置文件:
具体流程如下:
cd $(1), 进入到源文件目录:
out/target/product/xxxx/obj/PACKAGING/target_files_intermediates/xxxx-target_files-20170714/VENDOR
find . -type d | sed 's,$$,/,' 查找目录文件:
.
./lib64
./lib64/mediadrm
./lib64/hw
./lib64/soundfx
./package_config
./etc
./etc/bluetooth
./etc/seccomp_policy
......
find . \! -type d 查找非目录文件:
./lib64/libwpa_client.so
./lib64/libsurfaceoverlay_jni.so
./lib64/mediadrm/libdrmclearkeyplugin.so
./lib64/libril.so
./lib64/libfbcnf.so
./lib64/libamavutils.so
......
cut -c 3- 取第三个字符开始的数据
lib64
lib64/mediadrm
lib64/hw
lib64/soundfx
package_config
etc
etc/bluetooth
etc/seccomp_policy
....
lib64/libwpa_client.so
lib64/libsurfaceoverlay_jni.so
lib64/mediadrm/libdrmclearkeyplugin.so
lib64/libril.so
lib64/libfbcnf.so
lib64/libamavutils.so
....
Sort 排序
etc
etc/bluetooth
etc/seccomp_policy
lib64
lib64/hw
lib64/libamavutils.so
lib64/libfbcnf.so
lib64/libril.so
lib64/libsurfaceoverlay_jni.so
lib64/libwpa_client.so
lib64/mediadrm
lib64/mediadrm/libdrmclearkeyplugin.so
lib64/soundfx
package_config
sed 's,^,$(2) 没一行前面加上 vendor/
vendor/
vendor/etc
vendor/etc/bluetooth
vendor/etc/seccomp_policy
vendor/lib64
vendor/lib64/hw
vendor/lib64/libamavutils.so
vendor/lib64/libfbcnf.so
vendor/lib64/libril.so
vendor/lib64/libsurfaceoverlay_jni.so
vendor/lib64/libwpa_client.so
vendor/lib64/mediadrm
vendor/lib64/mediadrm/libdrmclearkeyplugin.so
vendor/lib64/soundfx
vendor/package_config
至此,包含了对vendor下的所有文件以及目录的集合,然后执行:
out/host/linux-x86/obj/EXECUTABLES/fs_config_intermediates/fs_config -C -D out/target/product/xxxx/ -S target/product/xxxx/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin
会根据file_contexts.bin中配置的selinux权限,对上述集合中所以的目录以及非目录文件,赋予相应的selinux权限,然后生成vendor_systemfile_config.txt:
vendor 0 2000 755 selabel=u:object_r:vendor_file:s0 capabilities=0x0
vendor/app 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/AppInstaller 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/AppInstaller/AppInstaller.apk 0 0 644 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/BluetoothRemote 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/BluetoothRemote/BluetoothRemote.apk 0 0 644 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA/DLNA.apk 0 0 644 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA/lib 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA/lib/arm 0 2000 755 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA/lib/arm/libhisivideo19.so 0 0 644 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
vendor/app/DLNA/lib/arm/libhisivideo_3798m.so 0 0 644 selabel=u:object_r:vendor_app_file:s0 capabilities=0x0
至此,Makefile中通过sed命令,生成分区文件系统的selinux的配置文件。
Makefile中通过sed命令生成文件系统的selinux的配置文件vendor_filesystem_config.txt的更多相关文章
- Linux中使用sed命令或awk命令修改常规配置文件
一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...
- Makefile Shell 脚本;sed命令
1. 在Makefile中想使用shell脚本,需要添加"@"符号,例如: @if [ -d xxx ]; then \ //-d 判 ...
- JNI中使用cl命令生成DLL文件
问题描述: 在使用JNI调用DLL时,首先需要生成DLL文件 问题解决: (1)现在使用VS2008的cl.exe程序,生成DLL文件 (1.1)cl.exe环境搭建 注: cl. ...
- Linux中的sed命令
sed - stream editor for filtering and transforming text 流编辑器的过滤和转换文本 sed [-nerf] [动作] 参数: -i 修改源文件 危 ...
- Linux中使用sed命令替换字符串小结
sed替换的基本语法为: sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的 ...
- 在shell中使用sed命令替换/为\/
sed命令相关: https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html https://www.cnblogs.com/D ...
- WCF中可以使用SVCUtil.exe生成客户端代理类和配置文件
1.找到如下地址“C:\Windows\System32\cmd.exe” 命令行工具,右键以管理员身份运行(视系统是否为win7 而定) 2.输入如下命令: C:\>cd C ...
- 【转】linux中的sed命令
转自:http://www.cnblogs.com/shineshqw/articles/1978122.html 功能说明: 利用script来处理文本文件. 语 法:sed [-hnV][-e&l ...
- linux shell中使用sed命令
例1:批量的将变量的值代替指定文件中的指定内容. #!/bin/bash for i in {1..100} mgr_port=`expr $i + 5345` data_port=`expr $i ...
随机推荐
- vue 项目实战 (入门)
环境搭建 安装NodeJS →箭头https://nodejs.org/en/ NPM是随同NodeJS一起安装的包管理工具. 检查环境是否安装成功: 打开一个命令提示符,有成功输出版本号则为安装成功 ...
- 前端XSS相关整理
前端安全方面,主要需要关注 XSS(跨站脚本攻击 Cross-site scripting) 和 CSRF(跨站请求伪造 Cross-site request forgery) 当然了,也不是说要忽略 ...
- #if 与 #ifdef 之间的区别
先来看个例子: #define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call ...
- Web网站配置Gzip,压缩js css文件
启用apache的gzip 找到httpd.conf,打开文件找到对mod_deflate的注释 #LoadModule deflate_module modules/mod_deflate.so 去 ...
- 最全的.NET Core跨平台微服务学习资源没有之一
一.Asp.net Core基础 微软英文官网:https://docs.microsoft.com/en-us/aspnet/core/?view=aspnetcore-2.1 .NET Core: ...
- ASP.NET Core 中使用EF Core 将实体映射到数据库表的方法(SQL Server)
前段时间听过一个关于使用ASP.NET Core建立项目的视频.其中使用EF Core映射到数据库的部分是按部就班地学习.今天自己建立项目时,有些步骤已经有一些遗忘.所以写下这篇文章,顺便理清思路. ...
- [PHP]算法-最长公共子串的PHP实现
最长公共子串问题: 给定两个字符串,求出它们之间最长的相同子字符串的长度. 暴力解法思路: 1.以两个字符串的每个字符为开头,往后比较,这样就会需要两层循环 2.两层循环内部的比较方式,也是一层循环, ...
- 【Java每日一题】20170220
20170217问题解析请点击今日问题下方的“[Java每日一题]20170220”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...
- Netty实战七之EventLoop和线程模型
简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提 ...
- js 1.变量提升 2.条件语句 3.循环语句 4.加号+的使用
1.变量提升 变量提升是浏览器的一个功能,在运行js 代码执行前,浏览器会给js一个全局作用域叫 window,window 分两个模块,一个叫运营模块,内存模块找到当前作用域下的所有带var和fun ...