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. 最佳实践建议
- 权限最小化:使用system用户而不是root
- 资源限制:为服务设置适当的CPU、内存限制
- 依赖管理:确保服务依赖的资源已就绪
- 错误处理:实现正确的重启策略
- 日志记录:服务应该输出日志到logcat
需要根据你的具体服务类型(原生二进制、Java服务、厂商服务等)调整配置。