英文网站怎么建做h5的网站有哪些
2026/5/13 10:33:13 网站建设 项目流程
英文网站怎么建,做h5的网站有哪些,wordpress搭建的博客系统,建筑设计专业是干什么的如何正确编写Android开机shell脚本#xff1f;看这篇就行 在Android系统开发中#xff0c;让一段自定义逻辑在设备启动时自动运行#xff0c;是很多定制化需求的基础能力。比如自动挂载特定分区、初始化硬件模块、设置系统属性、启动后台服务等。但很多开发者第一次尝试时会…如何正确编写Android开机shell脚本看这篇就行在Android系统开发中让一段自定义逻辑在设备启动时自动运行是很多定制化需求的基础能力。比如自动挂载特定分区、初始化硬件模块、设置系统属性、启动后台服务等。但很多开发者第一次尝试时会发现脚本明明写好了也放进系统了却始终不执行——不是权限报错就是SELinux拦截或是init.rc语法出错甚至脚本路径写错导致根本找不到文件。这不是你不够细心而是Android从8.0Oreo开始对开机启动流程做了更严格的管控init进程不再无条件执行任意脚本SELinux策略默认拒绝未声明的域访问/system分区默认只读shell解释器路径与Linux发行版不同……这些细节稍有疏忽脚本就“静默失败”。本文不讲抽象理论也不堆砌源码片段而是以一个真实可运行的最小闭环为例手把手带你完成从脚本编写→权限配置→init集成→验证调试的全流程。所有步骤均基于Android 8.0主流平台高通/MTK通用已在实机反复验证。你不需要理解SELinux策略编译原理也能让脚本稳稳跑起来。1. 明确目标我们要实现什么在Android设备完成bootloader加载、kernel启动、init进程初始化后自动执行一段shell逻辑并能通过adb快速验证是否生效。成功标志设备重启后getprop test.prop能稳定返回111ps -A | grep init.test.sh可查到进程因使用oneshot仅执行一次无SELinux avc denied日志dmesg | grep avc或logcat -b events | grep avc注意本文不涉及root权限获取、不修改ro.build.type、不关闭SELinux不推荐也不安全所有操作均符合Android官方安全模型。2. 编写可执行的shell脚本2.1 脚本内容与关键细节新建文件init.test.sh内容如下#!/system/bin/sh # 注意必须使用 /system/bin/sh不是 /bin/sh也不是 /system/xbin/sh除非你确认存在 # Android的sh是toybox或ash的精简版不支持bash特有语法如数组、[[ ]]、let等 # 设置一个测试属性用于快速验证脚本是否执行 setprop test.prop 111 # 可选记录时间戳到临时文件仅调试用避免写入只读分区 # echo init.test.sh ran at $(date) /data/local/tmp/init_test.log # 可选启动一个简单后台进程如ping网关验证网络可用性 # nohup ping -c 3 192.168.1.1 /dev/null 21 2.2 为什么这些细节决定成败解释器路径必须准确Android系统中/bin/sh通常不存在/system/xbin/sh在部分旧版本存在但8.0统一使用/system/bin/sh指向toybox。写错将直接导致init: cannot execv错误。禁止使用bash语法init进程调用的是/system/bin/sh它不识别[[ ]]、$(( ))、source等bash特性。若需复杂逻辑应改用awk、sed或提前编译为二进制。属性设置是最安全的验证方式相比创建文件需处理目录权限、SELinux上下文setprop无需额外权限且getprop命令在任何adb shell中都可立即检查。注释行不能干扰执行#开头的行会被忽略但确保第一行#!/system/bin/sh严格顶格、无空格、无BOM否则内核无法识别shebang。2.3 本地验证先手动运行再交给init将脚本push到设备并手动执行是排除脚本自身问题的最快方法# 推送脚本需adb root adb root adb remount 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 test.prop # 应输出 111如果这一步失败请回头检查脚本语法、权限、路径——不要跳过此步直接进init集成。3. 配置SELinux策略让init有权运行它从Android 5.0起SELinux处于enforcing模式init进程只能在明确授权的SELinux域中执行程序。未经声明的脚本会被静默阻止。3.1 定义服务类型与执行文件类型在厂商SELinux策略目录如device/mediatek/sepolicy/basic/non_plat/或device/qcom/sepolicy/common/下新建文件test_service.te# 声明一个新服务域继承init_daemon的基本能力 type test_service, domain; type test_service_exec, exec_type, vendor_file_type, file_type; # 允许该域由init_daemon_domain管理标准做法 init_daemon_domain(test_service); # 允许test_service域执行test_service_exec类型的文件 allow test_service test_service_exec:file { read open getattr execute };说明init_daemon_domain()宏已预定义了init服务所需的基础权限如访问/dev、/proc、socket等我们只需补充“执行权”。避免使用permissive test_service仅调试用上线必须删除。3.2 关联文件路径与SELinux上下文在同目录下的file_contexts文件中添加一行注意路径匹配规则/system/bin/init\.test\.sh u:object_r:test_service_exec:s0重点使用正则转义\., 否则init.test.sh会被误匹配为initXtestXsh路径必须与脚本实际存放位置完全一致本文用/system/bin/若放/vendor/bin/则需改路径s0是MLS级别标准Android用mlsconstrain限制此处保持默认即可。3.3 策略编译与验证修改完策略后必须重新编译并刷入system.img。验证是否生效# 查看文件SELinux上下文 adb shell ls -Z /system/bin/init.test.sh # 正常输出应包含u:object_r:test_service_exec:s0 # 检查init是否加载了该服务重启后 adb shell ps -Z | grep test_service # 应看到类似u:r:test_service:s0 root 1234 ... /system/bin/init.test.sh若ls -Z显示u:object_r:shell_exec:s0说明file_contexts未生效或未刷入若ps -Z看不到进程说明init未启动或SELinux拒绝。4. 在init.rc中注册服务Android 8.0采用HIDL和Treble架构init.rc被拆分为多个片段。切勿直接修改system/core/rootdir/init.rc而应使用厂商提供的扩展点。4.1 标准集成位置按平台选择其一平台类型推荐路径说明MTK平台device/mediatek/sepolicy/basic/non_plat/init.mtXXXX.rcXXXX为芯片型号如mt6765高通平台device/qcom/sepolicy/common/init.qcom.rc或init.target.rc通用方案system/etc/init/目录下新建.rc文件Android 8.0支持需确保init能加载4.2 编写service定义在选定的.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 # 触发时机在main类服务启动时执行即系统基本服务就绪后 on property:sys.boot_completed1 start test_service关键参数解析class main归入main服务组确保在关键系统服务如surfaceflinger、zygote之后启动user/group root以root权限运行必要因需设置系统属性oneshot执行一次即退出避免常驻消耗资源seclabel显式指定SELinux标签与file_contexts中定义一致on property:sys.boot_completed1比单纯on early-init更可靠确保Zygote已启动、property service就绪。4.3 验证init.rc语法编译前用init自带工具检查语法# 在编译环境中执行非adb ./out/host/linux-x86/bin/ckati -f build/make/core/main.mk # 或直接查看编译日志中是否有init: parse error常见错误seclabel后多空格、on触发器缩进不一致、路径含中文或特殊字符。5. 编译、刷机与最终验证5.1 编译步骤简化版# 1. 编译SELinux策略生成plat_sepolicy.cil m mm -j32 vendor/sepolicy # 2. 编译init.rc相关模块触发system.img重建 m mm -j32 system/core/init # 3. 生成完整system.img m snod # 4. 刷入设备fastboot模式 fastboot flash system system.img fastboot reboot提示若使用make installclean m全量编译耗时较长建议仅编译变更模块。5.2 重启后三步验证法设备重启后立即执行# 第一步检查属性是否设置成功最直接 adb shell getprop test.prop # 期望输出 111 # 第二步检查init日志中是否有启动记录 adb logcat -b events | grep -i test_service # 期望看到init: starting service test_service... # 第三步排查SELinux拦截如有失败 adb shell dmesg | grep avc # 若出现avc denied复制完整行用audit2allow生成补丁5.3 常见问题速查表现象可能原因快速解决getprop无输出脚本未执行检查logcat -b events中service是否startdmesg有avc deniedSELinux策略缺失复制avc行audit2allow -p out/target/product/xxx/obj/ETC/sepolicy_neverallows_intermediates/sepolicy*ps查不到进程oneshot已退出改用disabledstart test_service手动触发init: cannot execv脚本路径错误或无x权限adb shell ls -l /system/bin/init.test.sh确认权限为-rwxr-xr-x脚本执行但属性未生效setprop被权限限制确认user root或改用write /proc/sys/kernel/msgmax 12345等root可写节点6. 进阶建议让脚本更健壮、更实用6.1 日志记录不依赖logcat在脚本中添加轻量日志便于离线分析# 将输出重定向到/data/local/tmp用户可读写 LOG_FILE/data/local/tmp/init_test.log echo [$(date)] init.test.sh started $LOG_FILE setprop test.prop 111 echo [$(date)] setprop done $LOG_FILE6.2 条件执行避免重复利用系统属性做开关防止多次启动# 检查是否已执行过 if [ $(getprop test.prop.executed) 1 ]; then exit 0 fi setprop test.prop.executed 1 # ... 主逻辑 ...6.3 启动守护进程非oneshot场景若需长期运行改为service test_daemon /system/bin/init.test.sh class main user root group root # 删除oneshot添加restart restart seclabel u:object_r:test_service_exec:s0并在脚本末尾加while true; do sleep 3600; done保持进程存活。7. 总结开机脚本落地的四个铁律写好一个Android开机shell脚本本质是与系统安全机制的协同而非对抗。牢记这四条经验可避开90%的坑路径即生命/system/bin/sh是唯一可靠的解释器/system/bin/是唯一无需额外SELinux上下文的可执行目录属性即凭证用setprop验证比写文件更安全、更快速它是init阶段最可信的通信通道SELinux非障碍是说明书每一条avc denied都在告诉你“这里需要什么权限”而不是“禁止你做”init.rc是契约不是清单on property:触发器比on early-init更精准class main确保依赖满足seclabel是强制要求而非可选。现在你已经掌握了从零构建一个稳定、合规、可验证的Android开机脚本的完整链路。下一步可以尝试将硬件初始化、网络配置、或自定义服务启动逻辑封装进这个框架中。--- **获取更多AI镜像** 想探索更多AI镜像和应用场景访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_sourcemirror_blog_end)提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

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

立即咨询