Android init服务.rc文件,支持开机自启动和手动控制

1. 基础服务模板

rc 复制代码
# my_service.rc - Android init服务配置文件

# 服务定义
service my_service /system/bin/my_service
    class main  # 属于main类,随系统启动
    user system  # 以system用户运行
    group system  # 使用system组
    capabilities NET_BIND_SERVICE  # 可选:需要的Linux能力
    disabled  # 默认不自动启动,需要时手动启动
    
    # 重启策略
    oneshot  # 如果服务退出,不自动重启
    # 或者使用以下策略:
    # restart_period 10  # 每10秒检查并重启
    # onrestart restart other_service  # 重启时触发其他服务
    
    # 安全上下文(可选,Android 8.0+)
    # seclabel u:r:my_service:s0
    
    # 环境变量
    env MY_VAR "value"
    
    # 文件权限
    writepid /dev/cpuset/system-background/tasks

# 触发条件
on property:sys.boot_completed=1
    # 系统启动完成后自动启动
    start my_service

on property:debug.my_service.enable=1
    # 通过属性控制启动
    start my_service

on property:debug.my_service.enable=0
    # 通过属性控制停止
    stop my_service

2. 完整功能示例

rc 复制代码
# my_daemon.rc - 完整的守护进程示例

# 服务定义
service my_daemon /vendor/bin/my_daemon
    class main
    user root
    group root system
    capabilities NET_ADMIN NET_RAW SYS_NICE
    disabled
    oneshot
    socket my_daemon stream 660 system system
    # 创建socket供进程间通信
    
    # I/O优先级
    ioprio be 2
    
    # 关键服务标记(不会被杀死)
    # critical
    
    # 设置进程oom调整值
    oom_score_adjust -100
    
    # 允许服务在升级后重启
    # updatable

# 系统启动时启动
on boot && property:ro.debuggable=1
    # 仅在debug版本自动启动
    start my_daemon

# 充电模式启动
on charger
    stop my_daemon

# 属性触发控制
on property:ctl.start=my_daemon
    start my_daemon

on property:ctl.stop=my_daemon
    stop my_daemon

# 自定义属性控制
on property:persist.my_daemon.enable=1
    start my_daemon

on property:persist.my_daemon.enable=0
    stop my_daemon

3. 使用方式

编译安装:

makefile 复制代码
# Android.mk 或 Android.bp 配置

# Android.mk 示例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_service.rc
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/init
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

# Android.bp 示例
prebuilt_etc {
    name: "my_service.rc",
    src: "my_service.rc",
    sub_dir: "init",
    vendor: true,
}

手动控制命令:

bash 复制代码
# 启动服务
adb shell start my_service
# 或
adb shell setprop ctl.start my_service

# 停止服务
adb shell stop my_service
# 或
adb shell setprop ctl.stop my_service

# 检查服务状态
adb shell getprop | grep my_service
adb shell ps -A | grep my_service

# 通过属性控制
adb shell setprop persist.my_service.enable 1
adb shell setprop persist.my_service.enable 0

# 查看日志
adb logcat | grep my_service

4. 高级功能示例

rc 复制代码
# 多实例服务
service my_worker@1 /system/bin/my_worker
    class main
    user system
    group system
    disabled
    instance my_worker@%d  # 支持多个实例

service my_worker@2 /system/bin/my_worker
    class main
    user system
    group system
    disabled
    instance my_worker@%d

# 重启控制
on property:my_service.crash.count>3
    # 崩溃3次后停止尝试
    stop my_service

# 条件启动
on zygote-start && property:ro.my_feature.enable=true
    start my_service

5. 最佳实践建议

  1. 权限最小化:使用system用户而不是root
  2. 资源限制:为服务设置适当的CPU、内存限制
  3. 依赖管理:确保服务依赖的资源已就绪
  4. 错误处理:实现正确的重启策略
  5. 日志记录:服务应该输出日志到logcat

需要根据你的具体服务类型(原生二进制、Java服务、厂商服务等)调整配置。

相关推荐
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
AFinalStone1 小时前
Android12 U盘插拔链路源码全解析(五):Framework层(下) StorageManagerService
android·frameworks
林九生3 小时前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at4 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi004 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind14 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安4 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan4 小时前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir5 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li5 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android