安卓系统开机运行shell脚本

这篇具有很好参考价值的文章主要介绍了安卓系统开机运行shell脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在安卓系统上很多业务需求是通过shell脚本实现的,开机自启动一般做法是创建安卓service服务,然后通过该服务调用执行shell脚本。详细步骤:

1、编辑shell脚本

如下shell脚本功能为:循环查询系统下是否有厂商ID为0x1A86的USB转串口设备匹配到了CDC-ACM驱动上,若是则解绑USB设备和CDC-ACM驱动的绑定,并重新绑定到厂商的CH343SER串口驱动上。

#! /bin/sh

usbpath=""
usbnode=""
usbdevpath='/sys/bus/usb/devices/'
usbdriverpath='/sys/bus/usb/drivers/'

while [ true ]
do
	for file in /sys/bus/usb/drivers/cdc_acm/*
	do
		if [ -d "$file" ]
		then 
			usbpath=${file##*/}
			usbpath=${usbpath%:*}
			idVendor=$usbdevpath$usbpath'/idVendor'

			if [ ! -f "$idVendor" ]
			then
				continue
			fi

			if [[ $(cat $idVendor) == "1a86" ]]
			then
				usbnode=${file##*/}
				echo $usbnode > /sys/bus/usb/drivers/cdc_acm/unbind
				echo $usbnode > /sys/bus/usb/drivers/usb_ch343/bind
			fi
		fi
	done
	sleep 1
done

2、修改device.mk文件

在该文件中增加,实现将脚本文件编译时拷贝到系统。shell脚本文件的系统路径:/vendor/bin/ch343check.sh

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/ch343check.sh:$(TARGET_COPY_OUT_VENDOR)/bin/ch343check.sh \

3、修改init.xxx.rc文件

在系统启动rc文件中新增service服务,如下所示:

#Add shell scripts for ch343 service
service ch343check /vendor/bin/sh /vendor/bin/ch343check.sh
    class main
    user root
    group root

service声明格式:service [服务名称] [执行的shell命令]

注:部分平台上必须使用"sh + shell"脚本名称的方式声明,否则可能不工作。"class main" 声明方式可实现开机自动执行,并不需要在 on property:sys.boot_completed=1 后面添加 "start ch343check"

4、查看并设置selinux权限

查看运行此服务所需要的selinux权限,可通过“start 服务名”,查看logcat确定权限。

adb shell "dmesg | grep avc" > avc_log.txt

如下所示:

[ 232.117640 ] type=1400 audit(1682072440.187:512):avc: denied { write } for comm="sh" name="unbind" dev="sysfs" ino=38155 scontext=u:r:vendor_qti_init_shell:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

其中 permissive=0 说明缺乏某项权限。

根据如上权限问题,修改qcom下selinux的sepolicy目录下的,file_contents和init_shell.te文件

file_contents文件新增:
/(vendor|system/vendor)/bin/ch343check\.sh u:object_r:vendor_qti_init_shell_exec:s0

根据te文件规则 allow scontext tcontext : tclass permission 在te文件后面增加对应的权限。

init_shell.te文件新增:
allow vendor_qti_init_shell sysfs:file { write }; 

注:可以选择创建新的te文件(系统常规会遍历文件夹下的所有te文件),也可以在原有的te文件中新增内容。

编译到系统后,查看文件或进程是否有此新增权限,可使用 “ls -Z filepath”“ps -ef -Z” 命令。

/vendor/bin/ch343check.sh u:object_r:vendor_qti_init_shell_exec:s0
# ps -ef -Z | grep ch343
u:r:vendor_qti_init_shell:s0   root  1250 1 0 14:02:55 ? 00:00:00 sh /vendor/bin/ch343check.sh

5、解决neverallow冲突

当修改te文件后进行系统编译时,可能会遇到安卓系统编译问题。原因是新增的allow规则与全局的neverallow有冲突,举例:

[2023-04-22T11:40:58.529Z] neverallow check failed at out/soong/.intermediates/system/sepolicy/recovery_sepolicy.cil/android_common/recovery_sepolicy.cil:11224 from system/sepolicy/public/domain.te:507
[2023-04-22T11:40:58.529Z]   (neverallow domain vendor_file_type (file (write create setattr relabelfrom append unlink link rename)))
[2023-04-22T11:40:58.529Z]     <root>
[2023-04-22T11:40:58.529Z]     allow at out/soong/.intermediates/system/sepolicy/recovery_sepolicy.cil/android_common/recovery_sepolicy.cil:40813
[2023-04-22T11:40:58.529Z]       (allow shell vendor_file (file (read write getattr execute open execute_no_trans)))
[2023-04-22T11:40:58.529Z]
[2023-04-22T11:40:58.529Z] Failed to generate binary
[2023-04-22T11:40:58.529Z] Failed to build policydb

此问题,直接修改报错文件 domain.te,然后在出错行号的 neverallow 定义中使用 "-xxx" 来排除对此权限的not allow。

修改前:
neverallow { domain } vendor_file_type (file (write create setattr relabelfrom append unlink link rename))

修改后:
neverallow { domain -shell } vendor_file_type (file (write create setattr relabelfrom append unlink link rename))

除此之外,domain.te 会与系统的其他 apixx/domain.te 文件进行比对,此内容必须完全匹配。建议直接复制替换即可。

至此,安卓系统通过服务实现开机自动运行shell脚本完成。文章来源地址https://www.toymoban.com/news/detail-476630.html

到了这里,关于安卓系统开机运行shell脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux开机自动执行脚本、运行程序

    测试环境centos7 用途:linux开机自动执行脚本,启动java程序。 步骤: 1、在/etc/rc.d/init.d文件夹中创一个开机能够执行的脚本autoStart.sh 2、在autoStart.sh脚本中添加想要执行的 代码 或者 调用自定义的脚本 other.sh 这里面就是存放的你自己需要执行的代码了,下面只做示例使用,我的

    2024年02月04日
    浏览(47)
  • Android APP开机启动,安卓APP开发自启动,安卓启动后APP自动启动 Android让程序开机自动运行APP

    第一步设置获取广播后的业务 第二查权限给APP 理论以上两步做完就可以了。APP也能收到广播信息了, 但是APP没有在桌面启动。 经过再研究,发现要在手机再设置自动开启等业务,以下是小米、魅族的系统设置的一些内容,其它平台自己研究。 这里已经显示收到广播信息  

    2024年02月06日
    浏览(52)
  • shell脚本查询脚本否在运行

    可以使用 ps 命令来查询脚本是否正在运行。例如,要查询名为 script.sh 的脚本是否正在运行,可以使用以下命令: 如果脚本正在运行,则 grep 命令会输出包含脚本名称的行;如果脚本没有运行,则不会有输出。 注意:如果有多个脚本正在运行,且脚本名称中包含了 script.sh

    2024年02月06日
    浏览(42)
  • ubuntu20.04通过gnome-session-properties实现开机自启动shell脚本

    准备好需要开机自启动的脚本,如果暂时没有,可以按照下面的步骤新建一个test脚本。 同时按住Ctrl+Alt+T,系统会新建一个终端,在终端中输入 回车后,在打开的文本编辑器中输入 点击保存后关掉文本编辑器,会回到终端页面上,此时调用该脚本,结果如下: 图片: 在打开的

    2024年02月14日
    浏览(47)
  • android 运行shell 脚本文件或shell命令

    android 运行shell 脚本文件或shell命令 一.运行shell脚本文件 1.test.sh文件内容 #!/bin/bash echo \\\"I am a script\\\" ps 2.将shell文件拷贝到Android设备目录 3.执行脚本文件 Runtime.getRuntime().exec(\\\"sh /sdcard/lilei/test.sh\\\"); 注: 应用需要有存储访问权限,如果shell文件中有文件访问请用绝对路径,否则访问

    2024年03月12日
    浏览(60)
  • SHELL的脚本编辑与运行

    目录 1.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如:test1、test2、test3、、test10 a.编辑脚本 b.运行脚本 c.进行检验 2.编写脚本for2.sh,使用for循环,通过pig命令测试网段的主机连通性,网段前3段由用户输入,如:输入19

    2023年04月26日
    浏览(33)
  • Ubuntu20.04--开机自动运行脚本(命令)--方法/实例

    原文网址:Ubuntu20.04--开机自动运行脚本(命令)--方法/实例_IT利刃出鞘的博客-CSDN博客 本文介绍Ubuntu20.04如何开机自动运行命令。(也适用于Ubuntu22.04版本) 然后修改/etc/systemd/system/rc-local.service,在文件最下方添加如下两行: 创建 /etc/rc.local ,里边写自己想要运行的命令。例:

    2024年02月09日
    浏览(55)
  • Amazon Linux上使用ec2-user来设置开机自启动的shell脚本

    要在Amazon Linux上使用ec2-user来设置开机自启动的shell脚本,可以按照以下步骤操作:   1. 确保您拥有要设置自启动的shell脚本。假设脚本的路径是`/home/ec2-user/myscript.sh`。   2. 使用以下命令打开`/etc/rc.d/rc.local`文件:    ```shell    sudo nano /etc/rc.d/rc.local    ```   3. 在文件末尾添

    2024年02月15日
    浏览(57)
  • RK android 9.0 添加sh脚本开机自动运行

    diff --git a/device.mk b/device.mk old mode 100644 new mode 100755 index 4c698b7..c635798 --- a/device.mk +++ b/device.mk @@ -126,6 +126,8 @@ PRODUCT_COPY_FILES +=      $(call add-to-product-copy-files-if-exists,device/rockchip/common/init.$(TARGET_BOARD_HARDWARE).bootmode.nvme.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(TARGET_BOARD_HARDWARE).bootm

    2024年02月08日
    浏览(81)
  • 【Shell编程练习】编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态

    输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量,小于给定值时报警 猜大小 输入三个数并进行升序排序 要测试一个主机是否处于开机状态可以使用ping命令。 ping命令 用来测试主机之间网络的连通性。执行ping指令会使用ICMP传输协议,发出要求回应

    2024年01月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包