编译能自动保存 logcat 和kernel log 的android镜像

开发过程中,希望系统能自动保存log cat和kernel的log,现在介绍一下方法。

关键字:服务 自启动

概念:

1. 开机自启动脚本: 手机的 /root/init.YourPlatformName.rc,这里面可以启用相关服务和应用;

2. logcat 是一个自带的应用,只要带上相关参数就OK了;

3. kernel log, 为方便使用,这个稍微麻烦一点,需要写一个应用,也很简单。

 

1. 修改/root/init.YourPlatformName.rc:

    根据android/device/YOURPLAT/YOURPLAT/YOURPLAT.mk文件,找到/root/init.YourPlatformName.rc 的原始文件,一般在PRODUCT_COPY_FILES 字段下;有些文件拷贝比较多次,找到源头修改才可以;在合适位置添加如下语句,一般在文件末尾。

# ADD for log
# create logging directory
 mkdir /data/logger 0771 system system //建立存放log的路径
service logcat-pppd /system/bin/logcat -f /data/logger/logcat-pppd.log -r 10000 -n 1 -v time -s pppd:D //使用logcat 
 disabled
 oneshot
on property:persist.service.events.enable=1
 start logcat-pppd
on property:persist.service.events.enable=0
 stop logcat-pppd
service logcat-main /system/bin/logcat -r 10000 -n 4 -v time -f /data/logger/logcat-main.log //使用logcat 
 disabled
 oneshot
on property:persist.service.main.enable=1
 start logcat-main
on property:persist.service.main.enable=0
 stop logcat-main
chmod 0777 /system/bin/kernel_log
service log-kernel /system/bin/kernel_log //使用自己写的kernel_log 应用,这个稍后添加;
 disabled
 oneshot
on property:persist.service.kernel.enable=1
 start log-kernel
on property:persist.service.kernel.enable=0
 stop log-kernel
# ADD for log

2.  logcat指令参数不解释,自己google。

3. 关于生成 kernel_log应用,在android/external 下搞一个子目录,写一个.c 和一个Android.mk,记得需要设置拷贝到out的 system/bin目录,才能编译进系统;

 

<think>嗯,用户问的是在Android中dmesg被SELinux限制的问题。首先,我需要回忆一下dmesg的作用以及SELinux在Android中的权限控制。 dmesg通常用来查看内核的日志信息,这些信息对于调试硬件或驱动问题非常有用。但在Android中,由于安全策略的限制,普通用户可能无法直接访问这些日志。SELinux是Android用来加强安全性的一个机制,它会限制进程的访问权限,包括对内核日志的读取。 接下来,用户为什么会遇到这个问题呢?可能他们在尝试运行dmesg时遇到了权限被拒绝的错误,比如提示“dmesg: klogctl: Operation not permitted”。这时候,他们想知道为什么会被限制,以及如何解决。 我需要考虑不同Android版本的情况。比如在Android 8及以上,Google默认禁止非root用户执行dmesg,这是为了减少信息泄露的风险。而SELinux的策略文件可能进一步限制了访问权限,即使有root权限也可能被拦截。 解决方案可能有几种。第一种是临时关闭SELinux来测试,但这只是调试用,不适用于正式环境。第二种是修改SELinux策略,添加允许规则,这需要设备有root权限,并且能够重新编译策略文件。第三种是使用其他替代方法,比如通过logcat或者已有的调试工具来获取部分日志信息。 还要考虑用户的实际场景。如果用户是开发者,可能需要详细指导如何修改SELinux策略,包括找到相关的te文件,添加权限规则,然后重新编译刷入系统。如果用户只是普通用户,可能需要建议他们使用其他方法或者联系设备制造商获取支持。 另外,需要注意权限问题。修改SELinux策略需要一定的技术背景,并且可能使设备面临安全风险。必须提醒用户在修改前备份数据,并了解潜在的风险。 最后,验证解决方案是否有效,比如在修改策略后再次运行dmesg,检查是否有输出,或者查看SELinux的审计日志是否有新的拒绝记录。如果问题依旧,可能需要进一步调整策略规则。</think>--- ### **Android 中 `dmesg` 被 SELinux 限制的原理与解决方案** 在 Android 系统中,`dmesg` 命令用于读取内核环形缓冲区(kernel ring buffer)中的日志信息。但由于安全策略(尤其是 SELinux)的限制,普通用户或未授权的进程可能无法直接访问这些日志。以下是问题详解及应对方法: --- #### **1. 限制原因分析** ##### **SELinux 策略限制** Android 从 5.0(Lollipop)开始全面启用 SELinux(Security-Enhanced Linux),默认采用 `Enforcing` 模式。SELinux 策略通过标签(Label)规则(Policy)控制进程对资源的访问,包括对内核日志的读取权限。 - **关键策略规则**: SELinux 策略文件中通常包含类似以下规则,限制非特权进程访问内核日志: ```text # 禁止非授权域(domain)访问内核日志设备 neverallow { domain -kernel } kmem_device:chr_file rw_file_perms; ``` - **设备节点权限**: 内核日志对应的设备节点为 `/dev/kmsg` 或 `/proc/kmsg`,其默认权限可能仅允许 `root` 或特定组(如 `system`)访问: ```bash ls -l /dev/kmsg # 输出示例:crw-rw---- 1 root system 1, 11 2023-10-01 10:00 /dev/kmsg ``` ##### **Android 版本差异** - **Android 8.0+**:Google 进一步收紧权限,默认禁止非 `root` 用户执行 `dmesg`,即使通过 `adb shell` 登录也会受限。 - **自定义 ROM 或厂商设备**:部分厂商可能额外加固策略,限制调试接口。 --- #### **2. 现象验证** 尝试在终端执行 `dmesg` 时可能遇到以下错误: ```bash $ dmesg dmesg: klogctl: Operation not permitted ``` **检查 SELinux 模式**: ```bash getenforce # 输出应为 Enforcing 或 Permissive ``` **查看 SELinux 拒绝记录**: ```bash dmesg | grep avc # 或通过审计日志 /data/misc/audit/audit.log ``` 输出示例: ```text avc: denied { read } for pid=1234 comm="dmesg" path="/dev/kmsg" dev="tmpfs" ino=4567 scontext=u:r:shell:s0 tcontext=u:object_r:kmsg_device:s0 tclass=chr_file ``` 此日志表明 `shell` 域(scontext)尝试读取 `kmsg_device` 标签的 `chr_file`(tclass)被拒绝。 --- #### **3. 解决方案** ##### **方案 1:临时关闭 SELinux(调试用)** 通过 `setenforce` 命令将 SELinux 切换为 `Permissive` 模式(临时生效,重启后恢复): ```bash su -c 'setenforce 0' # 需要 root 权限 dmesg # 再次尝试执行 ``` > **注意**:此方法仅用于测试,实际生产环境中需通过修改策略解决问题。 --- ##### **方案 2:修改 SELinux 策略(永久生效)** 需 root 权限并能够修改系统分区(如自定义 ROM 或调试版系统)。 **步骤 1:定位策略文件** SELinux 策略文件通常位于: - 设备策略文件:`/vendor/etc/selinux/vendor_sepolicy.cil` - 系统策略文件:`/system/etc/selinux/plat_sepolicy.cil` - 自定义策略文件:`/vendor/etc/selinux/vendor_sepolicy.cil` **步骤 2:添加允许规则** 针对 `dmesg` 的调用者域(如 `shell`)添加规则: ```text # 允许 shell 域读取 kmsg_device allow shell kmsg_device:chr_file { read open }; ``` 或放宽到所有非敏感域: ```text # 允许所有域读取 kmsg_device(安全性降低!) allow { domain -kernel } kmsg_device:chr_file { read open }; ``` **步骤 3:编译并加载策略** - 将修改后的策略文件编译为二进制格式: ```bash secilc -o /vendor/etc/selinux/precompiled/sepolicy.vendor vendor_sepolicy.cil ``` - 重启设备或重新加载策略: ```bash su -c 'load_policy /vendor/etc/selinux/precompiled/sepolicy.vendor' ``` --- ##### **方案 3:通过替代方式获取日志** 若无法修改 SELinux 策略,可通过以下方法间接获取内核日志: 1. **使用 `logcat` 过滤内核消息**: ```bash adb logcat -b kernel # 需内核启用 CONFIG_PRINTK LOG_BUF_SHIFT 配置 ``` 2. **通过调试接口或厂商工具**: 部分设备提供厂商专属的调试命令,例如: ```bash adb shell dumpsys debug # 部分设备支持 ``` 3. **利用 `sysfs` 或 `procfs` 接口**: ```bash cat /proc/last_kmsg # 获取上次启动的日志(需内核支持) ``` --- #### **4. 深度适配建议(针对开发者)** - **定制 SELinux 策略**:在 AOSP 源码中修改策略文件(如 `system/sepolicy/private/shell.te`),添加: ```text allow shell kmsg_device:chr_file { read open }; ``` 重新编译系统镜像并刷机。 - **调整设备权限**:在 `init.rc` 或 `ueventd.rc` 中修改 `/dev/kmsg` 的权限: ```text /dev/kmsg 0666 root root ``` - **使用 CAP_SYSLOG 能力**:为进程赋予 `CAP_SYSLOG` 能力(需修改代码或配置文件): ```c // C 代码中调用 prctl(PR_SET_KEEPCAPS, 1); cap_t caps = cap_get_proc(); cap_set_flag(caps, CAP_EFFECTIVE, CAP_SYSLOG, 1); cap_set_proc(caps); ``` --- #### **5. 安全风险提示** 放宽 SELinux 策略可能暴露以下风险: 1. 内核信息泄露(如内存地址、硬件细节)。 2. 潜在提权漏洞利用(通过分析内核日志推断内存布局)。 3. 违反 CTS(Compatibility Test Suite)认证要求。 建议仅在调试环境中临时调整策略,生产环境需遵循最小权限原则。 --- ### **总结** `dmesg` 在 Android 中被 SELinux 限制的根源在于策略规则禁止非特权域访问 `/dev/kmsg`。通过调整 SELinux 模式、修改策略文件或使用替代方法,可绕过限制获取日志,但需权衡安全性与调试需求。对于长期解决方案,建议在 AOSP 源码层面对策略进行精细化控制。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值