Android 系统如何添加开机自启动 Shell 脚本

添加开机自启动 Shell 脚本

很多时候,我们想在系统启动的时候干一些“私活”,这个时候,我们就可以添加开机自启动的脚本来完成。下面我们介绍一个简单的示例:

device/Jelly/Rice14 目录下添加如下的文件与文件夹:

initscript
├── Android.bp
├── initscript.rc
└── initscript.sh

sepolicy    #部分文件为 seandroid 入门添加的内容
├── device.te      
├── file_contexts
├── hello_se.te
└── initscript.te

initscript.sh 是一个简单的 shell 脚本:

#!/vendor/bin/sh

echo "this is init script"
log -t initscript "this is initscript!" #打 log

需要注意的是 shebang 的内容是 #!/vendor/bin/sh

initscript.rc 的内容如下:

service initscript /vendor/bin/initscript
    class main
    user root
    group root system
    oneshot
  • class main 指明当前服务时系统的基本服务,保证了系统启动时,会启动这个服务
  • oneshot 表示服务只执行一次

Android.bp 的内容如下:

cc_prebuilt_binary {
    name: "initscript",
    srcs: ["initscript.sh"],
    init_rc: ["initscript.rc"], 
    strip: {
        none: true,
    },
    vendor: true
}

接着是配置 selinux:

initscript.te 的内容如下:

type initscript_dt, domain;
type initscript_dt_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(initscript_dt)
domain_auto_trans(shell, initscript_dt_exec, initscript_dt);

file_contexts 中添加如下内容:

/vendor/bin/initscript          u:object_r:initscript_dt_exec:s0

最后修改 device/Jelly/Rice14/Rice14.mk

PRODUCT_PACKAGES += \
    helloseandroid \
    initscript

BOARD_SEPOLICY_DIRS += \
    device/Jelly/Rice14/sepolicy

接着编译系统,启动模拟器:

source build/envsetup.sh
lunch Rice14-userdebug
make -j16
emulator

接着我们查看 log:

logcat | grep initscript

04-08 23:34:06.250  1600  1600 W initscript: type=1400 audit(0.0:6): avc: denied { execute_no_trans } for path="/vendor/bin/toybox_vendor" dev="dm-1" ino=205 scontext=u:r:initscript_dt:s0 tcontext=u:object_r:vendor_toolbox_exec:s0 tclass=file permissive=0

错误信息,提示我们缺少权限,按照之前介绍的方法使用 audit2allow 命令,发现并没有生成缺失的权限。那怎么办?看报错信息喽:

报错信息的意思是:当 initscript_dt 执行安全上下文为 u:object_r:vendor_toolbox_exec:s0/vendor/bin/toybox_vendor 时,缺少 execute_no_trans 权限。

什么意思呢?

我们先看下 /vendor/bin/toybox_vendor 文件:

#切换为 root
su 
#带 x 权限,是一个可执行文件
-rwxr-xr-x 1 root shell 503304 2023-04-08 23:04 /vendor/bin/toybox_vendor
#不带参数执行一下
/vendor/bin/toybox_vendor                                                                                            
acpi base64 basename bc blkid blockdev cal cat chattr chcon chgrp
chmod chown chroot chrt cksum clear cmp comm cp cpio cut date dd devmem
df diff dirname dmesg dos2unix du echo egrep env expand expr fallocate
false fgrep file find flock fmt free freeramdisk fsfreeze fsync getconf
getenforce getfattr grep groups gunzip gzip head help hostname hwclock
i2cdetect i2cdump i2cget i2cset iconv id ifconfig inotifyd insmod
install ionice iorenice iotop kill killall ln load_policy log logname
losetup ls lsattr lsmod lsof lspci lsusb makedevs md5sum microcom
mkdir mkfifo mknod mkswap mktemp modinfo modprobe more mount mountpoint
mv nbd-client nc netcat netstat nice nl nohup nproc nsenter od partprobe
paste patch pgrep pidof ping ping6 pivot_root pkill pmap printenv
printf prlimit ps pwd pwdx readlink realpath renice restorecon rev
rfkill rm rmdir rmmod runcon sed sendevent seq setenforce setfattr
setprop setsid sha1sum sha224sum sha256sum sha384sum sha512sum sleep
sort split start stat stop strings stty swapoff swapon sync sysctl
tac tail tar taskset tee time timeout top touch tr traceroute traceroute6
true truncate tty tunctl ulimit umount uname uniq unix2dos unlink
unshare uptime usleep uudecode uuencode uuidgen vconfig vmstat watch

从以上的操作可以看出 toybox_vendor 是一个命令集合,我们常用的 shell 命令均会通过 toybox_vendor 来执行。

再回到权限那里,我们的脚本调用了 echo log 两个命令,这两个命令会通过执行 toybox_vendor 来实现,当执行 toybox_vendor 时,我们就需要 toybox_vendor 的打开,读取,执行权限,以及配置 domain 转换(A 程序到 B 程序都需要配置域转换)。 domain 转换可以简单配置执行时不转换 execute_no_trans 即可,综上,我们在 initscript.te 中添加如下权限:

allow initscript_dt vendor_toolbox_exec:file { read open execute execute_no_trans };

接着再次编译系统,启动模拟器:

source build/envsetup.sh
lunch Rice14-userdebug
make -j16
emulator

进入 adb shell 查看信息:
在这里插入图片描述

启动时打的 log,以及启动相关的属性值均正常,证明我们添加的脚本执行成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/469305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口, 包含kvserver功能的一对一映射:Get/PutAppend,通过stub对象——raftKVRpcProctoc:…

HarmonyOS NEXT应用开发—图片压缩方案

介绍 图片压缩在应用开发中是一个非常常见的需求,特别是在处理用户上传图片时,需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…

Catmull-Rom P5 ThreeJs与前端

文章目录 问题Echarts 3D如何让曲线变得平滑?Echarts 2D图中平滑效果是如何实现的?如何在一个Echarts 3D图中画一个圆圈?如何在Echarts 3D图中画一个立方体? Catmull-Rom插值算法先来回答第二个问题回到第一个问题在Echarts 3D图中…

运维安全管理与审计系统(堡垒机)

一、什么是运维安全管理与审计系统 运维安全管理与审计系统(俗称 “堡垒机”):是采用新一代智能运维技术框架,基于认证、授权、访问、审计的管理流程设计理念,实现对企事业IT中心的网络设备、数据库、安全设备、主机系…

Zustand极简的状态管理工具

介绍 一个小型、快速且可扩展的 Bearbones 状态管理解决方案。 Zustand 有一个基于 hooks 的舒适 API。它不是样板文件或固执己见,但有足够的惯例来明确和类似通量。 zustand官网 zustand使用方法及调试工具的安装使用 安装包 npm install zustand2.创建store仓…

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作,打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多,有点鱼和熊掌不可兼得的意味,细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕,也就是一屏投多屏&…

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述: 对于这类问题的解决思路应该都差不多,本文以calico插件安装为例,发现有个Pod的镜像没有pull成功 第一步:查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

实体门店运营方案模板与策划技巧:轻松打造高效运营体系

在当今竞争激烈的商业环境中,实体门店的运营如同一场精密谋划的战役,需要精心策划和高效管理才能在市场中崭露头角。作为经营鲜奶吧5年时间的创业者,我深知成功的实体门店背后离不开一套完善的运营方案和策略。 在这篇文章中,我将…

基于java的宠物信息交流平台设计(含源文件)

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的“多鱼”旧物交易平台。当前的信息管理存在工作…

精酿啤酒:一口啤酒,一份享受

在繁华的都市生活中,我们总是匆匆忙忙,追求着各种目标和成就。然而,在这个过程中,我们往往忽略了生活的本质,那就是享受。而Fendi Club 啤酒,正是为那些追求品质生活的都市精英们量身打造的。 Fendi Club啤…

Java多线程自定义线程池——线程池的七大参数和四大拒绝策略

线程池 2.1 线程池思想 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统…

Claude3介绍

英文介绍链接:Introducing the next generation of Claude \ Anthropic Anthropic这家由OpenAI分裂出去的兄弟公司,悄无声息地、低调地将Claude3推出了 免费版claude 3 sonnet使用网站(国内镜像站):Claude 3 AI&…

106 基于消息队列来做 mysql 大数据表数据的遍历处理

前言 最近有这样的一个需求, 我们存在一张 很大的 mysql 数据表, 数据量大概是在 六百万左右 然后 需要获取所有的记录, 将数据传输到 es 中 然后 当时 我就写了一个脚本来读取 这张大表, 然后 分页获取数据, 然后 按页进行数据处理 转换到 es 但是存在的问题是, 前面 还…

【Micropython ESP32】pwm脉宽调制技术

文章目录 前言一、PWM脉宽调制技术介绍二、machine.PWM 类2.1 machine.PWM 类的构造对象2.2 PWM 对象初始化2.3 关闭PWM设备2.4 设置pwm的周期2.5 设置占空比 三、pwm示例代码总结 前言 在嵌入式系统和物联网应用中,控制电机、LED灯和其他设备的亮度或速度是常见的…

汽车电子零部件(8):T_Box

前言: 网联汽车(Connected Vehicles ,CV)是一个广泛的概念,四个主要的CV线程已发展起来:互联、自主、共享和电动。这些应用于包括CV在内的垂直领域:汽车、通信、互联网和共享手机服务。中国汽车工程师学会(SAEC)提倡将车载ADAS(高级驾驶员辅助系统)与通信技术相结合…

基于单片机的模糊PID炉温控制系统设计

摘 要 电热炉是在工业热处理的生产中广泛使用的一种设备,电热炉的温度控制系统存在时变性,非线性,滞后性等特征,难以用常规PID的控制器对系统达到很好的控制效果。当控温精度的要求高时,使用传统的控制理论方法难以达…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型。随着科技的不断发展,数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具,正在逐步改变医药企业的生产方式和管理模式…

信息论相关知识简单整理

信息论相关知识 互信息 互信息(Mutual Information)是信息论里一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。 设两个随机变量(X,Y)的联合…

嵌入式驱动学习第四周——platform总线

前言 platform是Linux内核抽象出来的软件代码,用于设备与驱动的连接,设备与驱动通过总线进行匹配;匹配成功后会执行驱动中的probe函数,在probe函数中可以获取到设备的信息; 嵌入式驱动学习专栏将详细记录博主学习驱动的…

3月份后半月比赛总结

VCTF web hackjs 就直接给了源码审计 const express require(express) const fs require(fs) var bodyParser require(body-parser); const app express() app.use(bodyParser.urlencoded({extended: true })); app.use(bodyParser.json());app.post(/plz, (req, res) …
最新文章