以Android L读取系统所有logcat并写入文件为例分析Android 以添加系统进程的方式申请selinux的权限执行shell脚本,以及avc:dined应该怎么申请权限

从工具选型到落地实践:吃透 SAP Fiori Launchpad 配置工具体系 摘要: SAP Fiori Launchpad配置远非简单添加应用和分配角色,涉及技术目录、业务目录、Spaces/Pages等多层管理。官方推荐新工具分工:技术目录用FLPAM维护应用定义,业务目录用FLPCM编排应用组合,Spaces/Pages优化用户体验布局,而传统Groups模式已被标记弃用。这种分层治理模式(定义层-编排层-展示层)能有效解决传输混乱、升级兼容性问题,尤其适合大规模项目实施。关键在于区分技术配置与业务呈现,避免将所有功能堆砌在单一旧工具中。(149字) 阅读详情

首先说说环境:

基于Android L的aosp修改(修改对于此文基本无影响)过的sorce code.

本来的思路是通过setenforcing permissive来开启宽容模式,可是宽容模式就是selinux的debug模式就相当于关掉了seliux毫无安全可言,而下面说到的,是以我的读取系统logcat并写入文件为例,来讲在selinux中申请我们所需的权限。

系统服务:

在init.rc里面声明service,这个service并不是android的service,而是进程,用我启动logcat的服务为例:

首先为了格式,找到声明service的地方。然后添加:

service start_logcat /system/bin/start_logcat.sh
       oneshot
      disabled
 
   on property:service.start_logcat=1
       start start_logcat
 

看看代码。

第一段:

第一行:service代表声明,start_logcat是service的名字 /system/bin/start_logcat.sh是指的这个service指向的(要执行的脚本的路径) 注意了,这个路径指的是安卓系统也就是build之后的路径,而我放在system/bin下是因为这里的start_logcat.sh被我赋予了可执行的权限(后面会说怎么赋予),我第一次做的时候创建了脚本用chmod 777给的权限,实际是毫无意义的。

第二行代码的oneshot指的是只执行一次。

第三行代码的disabled指的是开机不启动。

第二段:

第一行代码的on跟java代码的if同意 后面用property关键字声明了一个key为 service.start_logcat的property。整行的意思就是 声明一个key是service.start_logcat的property并且在其value是1的时候执行下一行代码。

第二行代码显然易见启动 start_logcat service。


也就是说 我们在安卓程序里 只要调用( 其中SystemProperties可能需要用到反射来调用set方法):

SystemProperties.set("service.start_logcat", "1");

系统监听到key为service.start_logcat的property的value变为1的时候就会去启动这个service去执行脚本.

还有一种启动方式 是不需要上面的第二段代码只声明一个service 然后在调用的时候通过这种方式:

SystemProperties.set("ctl.start", "start_logcat");
这种方式也会启动我们的系统服务去执行指向的脚本。


好,接下来说重点,重点是,我这个脚本执行(别忘记将脚本在.mk文件中cp到system/bin下)的内容是:

logcat -v time -f /sdcard/logcat -r 600000-n 1


也就是在sdcard下创建名为logcat的文件,大小为600M。一共2个文件交替着去记录logcat 超过600M就交替。

上篇文章说到了Android L之后selinux相关的权限限制,有兴趣的可以去看看。

接下来就说说遇到的问题。

首先,会报一个叫service:start_logcat  selinux needs a domian 是这个错,大致是这么写的。

然后下面会报avc:dined的错误(待会会详细说这个错误怎么解决)。

后面会着重讲解avc:dined的错误,先看第一个错。第一个错的意思呢就是我们的service在执行脚本的时候selinux约束必须有domain 

具体做法就是去device/xx/common/sepolicy 里面添加 一个.te文件(同级目录下有一个system_app.te,如果在这儿添加是不需要用system service的方式的,但是会开放对所有systemapp的权限,请谨慎处理),以logcat为例,创建start_logcat.te 并且在 file_contexts 下添加:

/system/bin/start_logcat.sh  u:object_r:start_logcat_exec:s0

这个就是上面说到的让 /system/bin/start_logcat.sh具备可以执行的权限。

接下来看看.te文件,同样以logcat为例:

  #Additional rules for shell
  type start_logcat, domain;
  type start_logcat_exec, exec_type, file_type;
   
  init_daemon_domain(start_logcat)
  
  # allow shell to run dmesg
  allow start_logcat kernel:system syslog_read;
  allow start_logcat toolbox_exec:file { read getattr open execute execute_no_trans };
  allow start_logcat logcat_exec:file { read getattr open execute execute_no_trans };
  allow start_logcat serial_device:chr_file rw_file_perms;
  allow start_logcat shell_exec:file read;
  allow start_logcat self:capability dac_override;
  allow start_logcat system_data_file:dir { write add_name };
  allow start_logcat system_data_file:file { create open append };
  allow start_logcat logd:unix_stream_socket {connectto};
  allow start_logcat vfat:dir { search write add_name create };
  allow start_logcat logdr_socket:sock_file {create write};
  allow start_logcat vfat:file create_file_perms;
  allow start_logcat system_file:file execute_no_trans;

将一个类型设置为另一个类型的属性可以通过type语句实现,type start_logcat, domain; 表示将类型 domain设置为start_logcat的属性。这样就可以表明start_logcat描述的类型是用来描述进程的安全上下文的。
对于type start_logcat_exec, exec_type, file_type; 同理。

在# allow shell to run dmesg 这行注释下面的代码都是为start_logcat这个服务在selinux申请的权限。当然logcat可能不需要这么多权限, 我是考别的文件 然后在基础上添加需要的。

接下来问题来了,我们怎么知道都需要哪些权限。

有趣的是,我并不知道我需要什么权限,wtf。

能想到的唯一答案就是通过avc:dined的报错来分析我需要什么样的权限。

那么首先就要会看avc:dined的错误。

还是以logcat为例:

avc: denied { connectto } for pid=1712 comm="logcat" path="/dev/socket/logdr" scontext=u:r:start_logcat:s0 tcontext=u:r:logd:s0 tclass=unix_stream_socket permissive=0

这个呢 就是selinux在enforcing模式下的安全策略的限制报出的错。

接下来看看这个log我们应该怎么看:


denied {}     代表缺少什么          connectto

scontext      代表谁缺少             start_logcat

tcontext      代表对哪个文件       logd

tclass           代表文件类型           unix_stream_socket


现在再来看看上面的报错。 也就是说 我们的start_logcat的服务 对unix_stream_socket类型的logd文件缺少connectto的权限。

那么我们自然知道.te的规则文件怎么写了,在start_logcat.te中添加 :

allow start_logcat logd:unix_stream_socket {connectto};

允许start_logcat对unix_stream_socket类型的logd文件有connectto的操作。

酱紫(继续build,然后如果报错,按上所述添加需要的权限),我们就完成了安卓向selinux申请所需权限并执行所需脚本从0到有的整个过程。


ps:如果有更好的可以知道做什么需要什么权限的办法 ,欢迎告知,学习为主。

顺便附上查看kernellog的命令:

adb shell cat /proc/kmsg

这个是以我自己的logcat为例来讲述的整个selinux申请所需权限的过程,如果有不对,欢迎指出,共同进步。





【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建 本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。 阅读详情

相关推荐

华为昇腾NPU环境搭建:torch-npu安装避坑指南(附常见错误解决方案)

本文详细解析了在华为昇腾NPU环境中安装torch-npu适配包的全流程与核心要点。从基础环境准备、严格的版本匹配策略,到针对‘RuntimeError: NPU error’、‘ImportError: libxxx.so’等高频错误的深度解析与解决方案,提供了一份实用的避坑指南,旨在帮助开发者高效搭建稳定的PyTorch开发环境。

weixin_29094979的博客 412

【Android】Android 7中logcat读logdr的处理

logcat通过读/dev/socket/logdr这个socket节点来从logd进程中获取信息, 这个处理在Android 6的logcat代码中很清楚的就可以看到。 但是Android 7里读logdr写的很晦涩,这里我们来看看Android 7里logcat读logdr的处理。 在Android 6中, 可以很清晰的看到使用android_logger_list_read来读l

aaajj的专栏 1962

Unity中URP下的菲涅尔效果实现(个性化修改)

在上篇文章中,我们实现了 URP 下的菲涅尔基础效果,我们在这篇文章中,对其进行自定义化修改。

楠溪泽岸的博客 2063

Android学习之路------代码中获取Logcat打印日志并存放于文件中

代码中获取Logcat打印日志并存放于文件中

JasonBlog 1万+

2021年全国职业院校技能大赛高职组网络系统管理赛项

S1 Ruijie(config)#switch virtual domain 1 Ruijie(config-vs-domain)#switch 1 Ruijie(config-vs-domain)#switch 1 priority 150 Ruijie(config-vs-domain)#switch 1 description S1 Ruijie(config-vs-domain)#exit Ruijie(config)#vsl-port Ruijie(config-vsl-port)#po

bfq05234214的博客 1134

Spirent TestCenter 3.90吞吐测试全流程详解(附RFC 2544配置避坑指南)

本文详细解析了使用Spirent TestCenter 3.90进行网络吞吐测试的全流程,并提供了符合RFC 2544标准的配置指南与避坑要点。内容涵盖测试环境搭建、核心概念澄清、STC软件配置步骤、结果深度解读以及自动化脚本入门,旨在帮助网络测试工程师精准评估设备性能,规避常见配置陷阱。

weixin_42602368的博客 370

init execute_no_trans avc报错

目前要在开机启动一个服务,但是通过log分析bin启动异常,分析如下: 1. 要新建对应的te文件,比如containerd.te type containerd, coredomain, domain; type containerd_exec, system_file_type, exec_type, file_type; init_daemon_domain(containerd) 2. 在需要权限的地方添加权限,比如在init.te中添加对应权限 allow init containerd

SHK242673的专栏 3640

termux 安装 rockylinux

往找最新的文件目录,选择ARM版本的image。或者直接查看目录或者国内阿里云镜像,按照cpu架构(安卓9手机一般是aarch64arm最新架构),获取镜像地址,以及checksum里的SHA256信息更新到以下rocky9.sh脚本,如果不需要直接使用即可。

欢迎来到别往的博客 984

Android logd日志简介及典型案例分析

在程序开发过程中,日志打印属于最普遍的操作,是代码调试和验证过程必不可少的手段。在Android开发过程中,我们经常通过Log\Slog等方式写入日志,然后通过对应的logcat命令读取相应的日志信息。具体日志如何写入或者读出,系统代码如何调用,可能也没有深入研究过。本文就通过具体的流程、框架设计、源码分析等讨论下Android日志的读写过程,以及介绍往往遇到日志丢失的场景及典型案例分析。1、日志...

内核工匠 5093

DB文件在编程中的作用及示例代码

通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。

CodeSpark的博客 1822

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 532

Android执行命令行命令(adb获取系统Logcat)

Android执行命令行命令 一、通过ProcessBuilder 1 String[] args = {"pm", "install", "-r", filePath}; 2 ProcessBuilder processBuilder = new ProcessBuilder(args); 3 process = processBuilder.start(); 创建一个进程 ..

5ingwings(SiHao)的博客 8185

一分钟了解 Claude Code

在 AI 编程工具百花齐放的 2026 年,凭借其终端原生、全项目理解、自主执行的核心能力,开辟了全新赛道。它不是要替代你的 IDE 或编辑器,而是成为你最强大的终端扩展,让你在熟悉的环境中,用自然语言驱动开发,专注创意,而非琐事。

h a 6 6 6 c k 为 你解决复杂难题! 2217

Java-经典算法-logcat获取数据

Java-经典算法-logcat获取数据

深度安全实验室 979

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android11 logcat源码解析

android11 logcat源码解析

我的博客 672

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

AVC 报错问题示例以及解决方案

问题:在一直移远4G三网投模块时,发送短信时信号消失。通过log 发现avc,然后通过同事沟通和指导,学到了如何快速修改验证此问题的方法。在此,记录一下我的学习和经验的积累过程;同时,也分享出来以供遇到类似问题的童鞋可以学习和解决自己的问题,

Demon_xiaochunjie的博客 6524

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

安卓给文件赋777读写权限

private static boolean upgradeRootPermission(String path){ Process process =null; DataOutputStream os = null; try { String cmd = "chmod 777 " + path; process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(p

短腿姑娘的博客 3399

SELinux权限问题解决参考

6666

we1less的博客 4313

selinux常见neverallow项解决方法与常用命令

1. dac_override egbin: type=1400 audit(0.0:879): avc: denied { dac_override } for capability=1 s:egbin:s0 tclass=capability permissive=1 ​ 需要给egbin dac_override权限,但是该权限是Android P的neverallow规则中的,不能被添加。dac_override权限意思是容许进程旁路的所有DAC权限:uid,gid,ACL 等等,即有这个权限可

k663514387的博客 3万+

Android initrc中执行shell脚本

由于initrc中支持的命令有限(不能支持system/bin下所有命令),而且不适合写比较复杂的逻辑(如传参、函数块 ),通常把这些功能放在shell脚本里来执行,但是shell脚本又需要放在initrc中来调用执行。因为随着Android版本更新,selinux的限制越来越多,在initrc中执行shell脚本肯能会遇到很多问题,即使设置selinux 为Permissive 也可能会遇到selinux问题。下面提供两个参考示例供参考 service test_shell /syste...

u013463707的专栏 3203

[Android]开机自启动脚本和selinux权限配置

概述 在前段时间的工作中,需要开发一个开机自动启动的脚本,现把开发过程记录一下 主要框架 编写一个可以开机自动启动的脚本,方法就是通过rc文件,在boot_complete=1时,去启动这个服务,那么,可以先基于以上思路,创建实现脚本所需要的文件。 通常来说,我这个脚本是要放在vendor分区的,因此将脚本放到vendor目录下,参考其他的脚本,创建3个空的文件如下: multi_tpinsmod/ //脚本文件夹 ├── Android.bp //bp文件,用于放置编译参数 ├── multi_t

骑驴赶集市的博客 9466

SELinux零知识学习十四、SELinux策略语言之客体类别和许可(8)

SELinux零知识学习十四、SELinux策略语言之客体类别和许可(8)

phmatthaus的专栏 1179

SELinux应用--移动App到sdcard

Move apps to SDCard feature总结 Android手机把把第三方app移动到sdcard,要考略到app可以再sdcard中安装卸载运行的问题,所以在Android系统中移动到sdcard的app都会挂载一个特殊的目录下:/mnt/asec(/mnt/sdcard/.android_secure的影像);要对这个目录进行写的操作需要通过SEAndroid。 但由于移动app

某只羊的专栏 1187

Selinux阻止Chrome的问题

方法是很早前从别处摘抄整理得到的,现在已经不记得转载地址,望原作者见谅。 查看日志/var/log/audit/audit.log,发现其中有一条如下所示 type=AVC msg=audit(1341590269.564:31): avc:  denied  { execute } for  pid=2568 comm="chrome" name="nacl_helper_boots

xinyu_tan的专栏 824

如何将权限777赋予手机文件夹中的某个文件

文件权限: 444 r--r--r-- 600 rw------- 644 rw-r--r-- 666 rw-rw-rw- 700 rwx------ 744 rwxr--r-- 755 rwxr-xr-x 777 rwxrwxrwx 从左至右,1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9数字代表其他用户的权限。 而具体的权限是由数字来表示的,读取的权限等于4,用r表...

Viewz的博客 3688

linux系统文件权限管理之 ‘ACL‘

一 ACL 权限简介 Linux 下用户对文件的操作权限有 r-读, w-写, x-可执行三种,而对linux 下的文件而言,用户身份分为:所有者, 所属组, 其它人, 且文件的所有者,所属组都只能是一个,所以在对文件分配用户的使用权限时,只能对这三种身份进行分配rwx 权限.Linux 主要作为服务器系统使用,用户众多.所以在实际使用场景中,这三种身份并不能很好地实现资源权限分配问题,所以就有了...

灬紫荆灬 610
上一篇: Android抓取系统logcat以及selinux对其影响
下一篇: camera清晰度问题
androideveloper
博客等级 码龄12年 21粉丝 42原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值