温馨提示:这篇文章已超过443天没有更新,请注意相关的内容是否还可用!
摘要:在 Android 系统上添加开机自启动 Shell 脚本,可以通过编辑启动脚本或使用任务调度程序实现。具体步骤包括获取 Root 权限,创建 Shell 脚本,将脚本放置在特定目录下,如 "/system/etc/init.d/" 或 "/data/local/init.d/",并设置脚本执行权限。开机时,系统会自动加载并执行这些脚本。此方法可能因不同版本的 Android 系统而有所差异,需要谨慎操作。
在许多情况下,我们希望在系统启动时执行一些特定的任务,为此,我们可以添加开机自启动的脚本,下面是一个简单的示例:
在device/Jelly/Rice14目录下,添加如下文件和文件夹:
initscript
├── Android.bp
├── initscript.rc
└── initscript.sh
sepolicy
├── 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!" #记录日志
需要注意的是,该脚本的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启动后,查看日志:logcat | grep initscript报错信息提示我们缺少权限,根据错误信息,我们发现在执行/vendor/bin/toybox_vendor
时缺少execute_no_trans
权限,toybox_vendor是一个命令集合,常用的shell命令都会通过它执行,我们需要在initscript.te中添加相应的权限:allow initscript_dt vendor_toolbox_exec:file { read open execute execute_no_trans };接着再次编译系统并启动模拟器,进入adb shell查看信息,确认添加的脚本已成功执行。
还没有评论,来说两句吧...