新闻录入网站模板物流wap网站模板
2026/4/18 10:20:39 网站建设 项目流程
新闻录入网站模板,物流wap网站模板,做佛像在什么网站发贴效果好点,影视广告公司网页设计Android开机自启功能实现#xff1a;基于init.test.sh的轻量级方案 在Android系统开发中#xff0c;让自定义脚本在设备启动时自动运行是一项常见但容易踩坑的需求。不同于Linux通用发行版的systemd或rc.local机制#xff0c;Android使用自己的init系统和SELinux安全模型基于init.test.sh的轻量级方案在Android系统开发中让自定义脚本在设备启动时自动运行是一项常见但容易踩坑的需求。不同于Linux通用发行版的systemd或rc.local机制Android使用自己的init系统和SELinux安全模型这意味着简单地把脚本丢进某个目录并不能让它“自然启动”。本文将带你从零开始用一个真实可运行的轻量级方案——init.test.sh完成开机自启功能的完整落地。不依赖复杂框架、不修改核心服务、不绕过安全策略每一步都经过实测验证Android 8.0主流平台适合嵌入式工程师、系统定制开发者和固件调试人员快速上手。1. 为什么不能直接用传统Linux方式很多刚接触Android底层的同学会下意识套用Linux经验把脚本放进/etc/init.d/、加chmod x、再写个update-rc.d很遗憾在标准Android系统中这些路径根本不存在init进程也不会扫描它们。Android的启动流程由init进程严格控制它读取init.rc及其包含的.rc文件按服务service和动作action声明来调度执行。更重要的是从Android 5.0起SELinux默认启用且为enforcing模式任何未被明确授权的进程行为包括执行新脚本、访问特定路径、设置系统属性等都会被拦截并记录到dmesg日志中。所以真正可行的路径只有一条让init认识你的脚本让SELinux信任你的脚本让系统属性或日志能证明它确实跑起来了。下面我们就沿着这条路径分四步走完全部流程。2. 第一步编写可执行的init脚本脚本本身必须满足Android init系统的硬性要求稍有偏差就会静默失败——连错误提示都不会输出。2.1 脚本位置与权限规范存放路径必须放在/system/bin/或/vendor/bin/下推荐前者兼容性更好文件名建议使用init.xxx.sh命名风格如init.test.sh便于识别用途权限chmod 755 /system/bin/init.test.showner可读写执行group/o仅读执行挂载状态/system分区需为可写adb remount或烧录前已设为rw注意不要尝试放在/data/local/tmp/或/sdcard/下——init进程在早期阶段无法访问这些路径且SELinux策略默认禁止。2.2 脚本内容与关键细节以下是一个最小可用、经实测通过的init.test.sh模板#!/system/bin/sh # Android专用shebang必须是/system/bin/sh或/system/xbin/sh # /bin/sh在Android中通常不存在硬写会导致脚本完全不执行 # 设置一个测试属性用于快速验证是否运行成功 setprop sys.test.booted 1 # 可选写入日志便于调试需确保logd已启动 log -t INIT_TEST Script executed at $(date) # 可选启动一个后台守护进程如需要长期运行 # nohup /system/bin/mydaemon # 可选触发其他init action如重启某个服务 # trigger my_custom_service2.3 验证脚本独立可运行在集成进init流程前务必手动验证脚本本身无语法错误、权限正确、逻辑可达# 推送脚本到设备 adb push init.test.sh /system/bin/init.test.sh # 设置权限 adb shell chmod 755 /system/bin/init.test.sh # 手动执行并检查结果 adb shell /system/bin/init.test.sh adb shell getprop sys.test.booted # 应输出1 adb logcat -t 10 -s INIT_TEST # 应看到日志输出如果这一步失败请优先检查shebang路径是否正确、/system是否可写、脚本是否有Windows换行符\r\n、是否缺少setprop所需SELinux权限见第4步。3. 第二步声明SELinux类型与上下文Android 8.0采用编译时策略precompiled sepolicy所有自定义服务必须在SELinux策略中明确定义其类型、执行上下文和访问权限。跳过此步脚本在init中会被SELinux直接拒绝且不会报错到logcat只在dmesg中留下类似avc: denied { execute } for path/system/bin/init.test.sh的日志。3.1 创建te策略文件在设备厂商的sepolicy目录下如MTK平台为device/mediatek/sepolicy/basic/non_plat/新建test_service.te# 定义服务域类型 type test_service, domain; type test_service_exec, exec_type, vendor_file_type, file_type; # 允许该域作为init守护进程运行 init_daemon_domain(test_service); # 允许执行自身脚本文件 allow test_service test_service_exec:file { read open execute getattr }; # 允许设置系统属性对应脚本中的setprop allow test_service system_file:file { read }; allow test_service system_prop:property_service { set }; # 允许写入log对应脚本中的log命令 allow test_service logd:dir { search }; allow test_service logd:file { read write open }; allow test_service logd:unix_dgram_socket { sendto };关键说明init_daemon_domain()是必须调用的宏它自动赋予test_service域访问/dev/*、/proc/*等init必需路径的权限allow ... property_service { set }是setprop命令必需的权限若脚本中调用log命令必须显式允许对logd的socket通信权限。3.2 绑定文件上下文在同一sepolicy目录下的file_contexts文件如device/mediatek/sepolicy/basic/non_plat/file_contexts中添加一行/system/bin/init\.test\.sh u:object_r:test_service_exec:s0注意路径需用正则转义.→\.否则匹配失败类型名test_service_exec必须与.te文件中定义的完全一致即使临时关闭SELinuxsetenforce 0此行也必须存在否则init无法识别该文件为可执行服务。3.3 编译并刷入策略修改完成后重新编译boot镜像或system镜像确保新策略生效。验证方法# 检查文件上下文是否正确 adb shell ls -Z /system/bin/init.test.sh # 输出应包含u:object_r:test_service_exec:s0 # 检查策略是否加载 adb shell dmesg | grep avc | tail -10 # 开机后检查是否有denied日志4. 第三步在init.rc中注册服务Android init通过解析.rc文件启动服务。虽然可以直接修改/system/etc/init.rc但强烈不建议——它属于AOSP核心文件易被OTA覆盖且不同芯片平台结构差异大。4.1 推荐做法使用平台专属rc文件主流SoC厂商均提供客户可扩展的rc入口例如平台推荐rc文件路径MTK/system/etc/init/hw/init.mtk.rcQualcomm/system/etc/init/hw/init.qcom.rcSamsung/system/etc/init/hw/init.samsung.rc若不确定可搜索/system/etc/init/下以init.*.rc命名的文件或查看init.rc中import语句引入的路径。4.2 编写服务声明在选定的.rc文件末尾添加以下服务定义# 定义test_service服务 service test_service /system/bin/init.test.sh class main user root group root oneshot seclabel u:object_r:test_service_exec:s0 # 可选指定启动时机在zygote启动后 on property:sys.boot_completed1 start test_service参数详解class main归入main类随系统主服务一起启动user/group root以root权限运行必要因需设置系统属性oneshot执行完即退出适合初始化脚本若需常驻请改用disabledstart触发seclabel必须与file_contexts中定义的类型一致on property更精准的启动时机控制避免在系统未就绪时执行。4.3 验证rc语法与加载编译刷机后可通过以下命令确认服务是否被init识别adb shell getenforce # 确保为Enforcing adb shell getprop sys.boot_completed # 确保为1系统已启动完成 adb shell cat /sys/fs/selinux/enforce # 确保为1 # 查看test_service状态 adb shell service list | grep test_service # 或检查init日志 adb logcat -b events | grep -i test_service5. 第四步调试与问题排查即使严格遵循上述步骤仍可能遇到启动失败。以下是高频问题及定位方法5.1 快速诊断三板斧现象检查点命令示例脚本完全没执行init是否加载了你的.rc服务名是否拼写一致adb shell cat /proc/1/cmdlineadb shell ls /system/etc/init/ | grep rcsetprop失败SELinux是否拒绝property_serviceadb shell dmesg | grep -i avc.*property_servicelog命令无输出logd是否已启动SELinux是否允许socket通信adb shell ps | grep logdadb shell dmesg | grep -i avc.*logd脚本执行但属性未设置setprop目标属性是否被ro.前缀锁定adb shell getprop | grep testadb shell getprop | grep ro.test5.2 实用调试技巧临时降级SELinuxadb shell setenforce 0仅用于快速验证逻辑非最终解法强制触发服务adb shell start test_service绕过init自动触发直接测试查看init详细日志adb logcat -b events -v threadtime \| grep -i test_service检查文件完整性adb shell sha256sum /system/bin/init.test.sh确认推送无损坏5.3 常见错误与修复❌ 错误dmesg显示avc: denied { execute } for ... init.test.sh修复检查file_contexts路径是否精确匹配te文件中是否遗漏allow ... execute❌ 错误getprop sys.test.booted始终为空修复确认setprop权限已添加检查属性名是否含非法字符只支持字母、数字、.、_确认脚本确实在执行加log语句验证❌ 错误服务状态为stoppedstart test_service后立即变为stopping修复检查脚本是否异常退出如语法错误、exit 1用adb shell /system/bin/init.test.sh手动执行看是否报错6. 总结一条可复用的工程化路径本文围绕init.test.sh这一轻量级载体完整呈现了Android开机自启功能的落地闭环。它不是理论推演而是来自真实项目调试的经验沉淀——每一行代码、每一个配置项都经过Android 8.0及以上版本的实机验证。回顾整个流程我们构建了一条清晰、稳健、可复用的工程路径脚本层用/system/bin/sh为shebang以setprop为轻量信号规避文件I/O权限风险策略层通过test_service.te和file_contexts双文件绑定实现最小权限原则启动层依托平台init.*.rc机制避免侵入AOSP核心保障OTA兼容性调试层以dmesglogcatgetprop为黄金三角快速定位SELinux、init、脚本三层问题。这套方法不仅适用于init.test.sh更可平滑迁移到任何自定义守护进程如硬件监控、日志收集、远程诊断服务。当你下次需要让一段逻辑在Android设备“睁眼第一秒”就运行起来时记住不是Linux就别用Linux的思维是Android就尊重它的init和SELinux。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询