建设教育协会官方网站全网营销的四大优势
2026/2/18 16:17:40 网站建设 项目流程
建设教育协会官方网站,全网营销的四大优势,做网站的钱叫什么科目,零食网站建设策划书模板简单易懂#xff01;Android开机启动shell脚本新手入门教程 你是不是也遇到过这样的问题#xff1a;想让Android设备一开机就自动执行某个任务#xff0c;比如备份日志、初始化硬件、启动监控服务#xff0c;或者调试时快速设置系统属性#xff1f;但一看到“init.rc”“…简单易懂Android开机启动shell脚本新手入门教程你是不是也遇到过这样的问题想让Android设备一开机就自动执行某个任务比如备份日志、初始化硬件、启动监控服务或者调试时快速设置系统属性但一看到“init.rc”“SELinux”“te文件”这些词就头大别担心——这篇教程就是为你写的。它不讲晦涩的底层原理不堆砌术语不假设你已经熟悉AOSP编译或SELinux策略编写。我们只聚焦一件事用最直接的方式让你在真实设备上跑通一个开机就能执行的shell脚本。哪怕你是第一次接触Android系统定制只要会写几行shell、能用adb推文件、知道怎么重启手机就能跟着做完。全文没有“赋能”“生态”“深度集成”这类空话只有可验证的步骤、可复制的代码、可复现的结果。每一步都标注了“为什么这么做”哪里容易出错、怎么快速验证、报错了怎么看日志——全是工程师踩坑后总结的实操经验。准备好了吗我们从零开始。1. 先搞清楚你的目标到底是什么在动手前请确认你真正需要的是什么开机后自动运行一段命令比如setprop debug.test 1、logcat -f /data/log/boot.log不需要图形界面纯后台执行脚本只需执行一次oneshot或常驻daemon不涉及复杂服务管理你有root权限的测试机或可刷自定义system镜像的开发板❌ 不是想做App级自启那该用BroadcastReceiver❌ 不是想绕过厂商锁刷ROM本教程不涉及解锁Bootloader❌ 不是想在用户空间App启动时触发那是Framework层的事如果你的需求符合上面前三条那就继续往下看。我们不追求“完美适配所有芯片平台”而是先确保在主流Android 8.0设备如MTK/高通公版上稳定跑通再谈扩展。2. 最小可行方案三步走通开机脚本很多教程一上来就让你改init.rc、写te策略、编译整个系统——这完全没必要。对于验证逻辑、快速调试、内部测试来说我们可以用更轻量的方式实现目标。整个流程就三步写一个极简shell脚本并手动验证它能在设备上运行把脚本放进系统可执行路径并赋予正确权限在init.rc中添加一条service声明指定开机启动后面两步SELinux策略、te文件我们放在“进阶排错”里讲——因为很多测试场景下临时关闭SELinux或使用已有domain就能跳过它们。先让脚本能跑起来比纠结策略文件更有价值。2.1 写一个真正能用的shell脚本新建一个文件命名为init.test.sh内容如下#!/system/bin/sh # 开机脚本标准开头必须用/system/bin/sh不是/bin/sh # Android的sh路径和Linux不同写错直接静默失败 # 第一步记录脚本已运行方便验证是否真被调用 log -p i -t boot_script init.test.sh started at $(date) # 第二步设置一个系统属性最安全的测试动作无副作用 setprop sys.boot.test 1 # 第三步写入一行日志到/data需确保/data可写 echo Boot script executed on $(date) /data/boot_log.txt # 可选如果需要持续运行如监听事件取消下面注释 # while true; do # log -p i -t boot_script still alive... # sleep 30 # done关键注意点第一行#!/system/bin/sh必须严格匹配不能写成#!/bin/sh或漏掉/system所有命令路径要写全如/system/bin/log而非log避免PATH环境变量不可靠避免创建新文件到/system分区只读优先用/data或/dev等可写路径log命令是Android专用日志工具比echo更能被logcat捕获验证方法非常重要用adb把脚本推到手机并手动执行一次adb push init.test.sh /data/local/tmp/ adb shell chmod x /data/local/tmp/init.test.sh adb shell /data/local/tmp/init.test.sh adb logcat -t 10 -s boot_script如果看到init.test.sh started at...日志且/data/boot_log.txt文件生成成功说明脚本本身完全没问题。2.2 把脚本放进系统路径并设好权限Android开机时init进程只信任特定路径下的可执行文件。最稳妥的位置是/system/bin/需remount system为可写# 1. remount system分区为可写需要root adb root adb remount # 2. 推送脚本到/system/bin/ adb push init.test.sh /system/bin/init.test.sh # 3. 设置权限所有者可读可写可执行其他用户仅可执行 adb shell chmod 755 /system/bin/init.test.sh # 4. 验证权限是否正确 adb shell ls -l /system/bin/init.test.sh # 应输出-rwxr-xr-x root root ... /system/bin/init.test.sh小技巧如果你不想每次刷机都手动推可以把这一步写成一个adb一键脚本后续反复测试非常省时。2.3 在init.rc中添加service声明现在脚本已就位下一步是告诉Android的init进程“这个脚本开机时请帮我跑一次”。大多数设备不会让你直接修改/system/etc/init.rc它是编译生成的但几乎都支持加载额外的.rc文件。常见位置包括/system/etc/init/Android 8.0 推荐方式支持.rc文件自动加载/system/etc/init/hw/init.vendor.rc厂商自定义rc文件/vendor/etc/init/vendor分区部分设备支持我们采用最通用的方式在/system/etc/init/下新建一个test_boot.rc文件# /system/etc/init/test_boot.rc service test_boot /system/bin/init.test.sh class main user root group root oneshot seclabel u:object_r:shell_exec:s0各字段含义service test_boot服务名任意取但不能和已有服务重名/system/bin/init.test.sh脚本绝对路径class main属于main类会在zygote启动前运行user/group root以root身份运行必要否则无法设置系统属性oneshot执行完即退出适合初始化类脚本若需常驻改为disabled并在其他trigger中启用seclabel u:object_r:shell_exec:s0复用系统已有的shell_execSELinux域关键避免立即写te文件推送并验证rc文件adb push test_boot.rc /system/etc/init/test_boot.rc adb shell chmod 644 /system/etc/init/test_boot.rc adb reboot重启后等待约30秒执行adb logcat -b events -t 20 | grep -i test adb logcat -t 20 -s boot_script adb shell cat /data/boot_log.txt如果三处都看到预期输出恭喜你——开机启动脚本已成功运行。3. 常见问题与快速排错指南即使按上述步骤操作也可能遇到“脚本没执行”“报Permission denied”“logcat看不到日志”等问题。别急90%的问题都集中在以下四个环节我们逐个击破3.1 脚本根本没被init调用检查rc文件加载状态init进程启动时会打印加载了哪些rc文件。用以下命令确认你的test_boot.rc是否被识别adb logcat -b events | grep -i import\|parse # 正常应看到类似import /system/etc/init/test_boot.rc如果没看到说明rc文件路径错误或格式非法。检查文件是否在/system/etc/init/目录下不是子目录文件名必须以.rc结尾rc文件内容不能有Windows换行符\r\n用dos2unix转换每行末尾不能有多余空格3.2 脚本执行了但报错看init日志定位init进程的错误不会出现在普通logcat里要用-b events缓冲区adb logcat -b events | grep -i test_boot\|init.test # 查看是否有 service_start_failed、permission denied 等关键词典型错误及解法Failed to open /system/bin/init.test.sh→ 路径写错或文件不存在检查adb shell ls /system/bin/init.test.shCannot execv(/system/bin/init.test.sh)→ 权限不对chmod 755再试或shebang路径错误确认是/system/bin/shPermission denied→ SELinux拒绝见3.3节Invalid argument→ rc文件语法错误如多了一个空格、少了一个换行3.3 SELinux报错怎么办两种务实解法当你在logcat中看到类似avc: denied { execute } for path/system/bin/init.test.sh的日志说明SELinux策略阻止了执行。别急着写te文件——先试试这两个更快的方案方案A临时切换SELinux为permissive模式仅测试用adb shell setenforce 0 adb reboot重启后如果脚本正常运行证明确实是SELinux拦截。这是最快速的验证手段。方案B复用现有SELinux域推荐长期使用在rc文件中把seclabel行改成seclabel u:object_r:shell_exec:s0shell_exec是系统预置的、允许执行shell脚本的domain绝大多数设备都开放了对它的execute权限。只要你的脚本不访问敏感资源如/dev/block、/sys/fs/selinux这个配置足够安全且无需额外策略。注意不要用u:r:init:s0或u:r:kernel:s0等高权限domain存在安全风险。3.4 日志看不到换个缓冲区或加调试输出Android logcat默认只显示main、system、radio缓冲区。开机早期的日志在events或kernel缓冲区# 查看init相关事件 adb logcat -b events # 查看内核级日志含SELinux avc adb logcat -b kernel | grep -i avc # 强制脚本输出到多个地方增强可观测性 echo [$(date)] Script running /data/local/tmp/boot_debug.log log -p i -t boot_debug Script running4. 进阶技巧让脚本更可靠、更实用当基础流程跑通后你可以根据实际需求升级脚本能力。以下是几个高频、低风险、高价值的增强点4.1 判断是否首次启动避免重复执行有些操作如初始化数据库、生成密钥只需做一次。用getprop检查标记#!/system/bin/sh if [ $(getprop sys.boot.test.done) ! 1 ]; then log -p i -t boot_script First boot: doing init tasks... # 这里放你的初始化命令 setprop sys.boot.test.done 1 else log -p i -t boot_script Not first boot, skip init fi4.2 等待关键服务就绪后再执行init.rc中某些service依赖其他服务如surfaceflinger、media。用wait_for_prop确保时机service test_boot /system/bin/init.test.sh class main user root group root oneshot seclabel u:object_r:shell_exec:s0 # 等待zygote启动完成表示Framework已就绪 wait_for_prop sys.boot_completed 14.3 支持热更新脚本内容可远程替换把核心逻辑抽离到/data分区可读写主脚本只负责加载#!/system/bin/sh # 主脚本只做一件事执行/data下的真实逻辑 if [ -f /data/local/tmp/real_boot.sh ]; then /data/local/tmp/real_boot.sh fi这样你无需每次改脚本都重启adb push新版本到/data即可生效。5. 总结你已经掌握的核心能力回顾一下你现在完全可以独立完成以下事情编写一个符合Android规范的开机shell脚本并手动验证其功能将脚本部署到/system/bin/并设置正确权限通过/system/etc/init/xxx.rc方式注册开机service无需修改主init.rc快速定位并解决“脚本不执行”“Permission denied”“日志看不到”等典型问题在不写te文件的前提下利用shell_execdomain绕过SELinux限制为脚本增加首次启动判断、服务等待、热更新等实用特性这些能力足以支撑你完成绝大多数Android系统级自动化任务日志自动归档、硬件自检、调试开关预置、OTA前数据备份、工厂模式快捷入口等。记住系统定制不是玄学。它是一系列可验证、可调试、可回滚的操作。每一次成功的开机脚本都是你对Android启动流程理解更深一步的证明。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

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

立即咨询