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服务、厂商服务等)调整配置。

相关推荐
天空之城--2 小时前
Android Koin 完全指南:从原理到实践
android
zhangphil3 小时前
Android main thread主线程Choreographer doFrame发生FullSuspendCheck
android
TimeFine6 小时前
智能眼镜开发:获取真实的音频路由
android
pengyu7 小时前
【Kotlin 协程修仙录 · 渡劫境 · 中阶】 | 造化神兵:自定义 CoroutineDispatcher 与调度器的终极定制
android·kotlin
pengyu7 小时前
【Kotlin 协程修仙录 · 渡劫境 · 初阶】 | 飞升雷劫:CPS 变换与挂起函数字节码终极透视
android·kotlin
TimeFine7 小时前
智能眼镜开发:眼镜Touch后收音与触发播放系统音乐的矛盾处理
android
TimeFine8 小时前
智能眼镜开发:眼镜侧收集音频
android
又见情义8 小时前
Android 系统设置从平板版迁移至TV版实践
android
杉氧11 小时前
打破边界(一):实战编写 Android/iOS 原生模块 (Native Modules)
android·react native·前端框架