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

相关推荐
消失的旧时光-19432 小时前
从前端路由到 Android ARouter:观察者模式在不同平台的同一种落地
android·前端·观察者模式·flutter
nono牛2 小时前
安卓rc-属性触发Hello World服务设计
android
2501_915918412 小时前
iOS 图片资源保护方法,分析图片在二次打包和资源篡改中的实际风险
android·ios·小程序·https·uni-app·iphone·webview
2501_937193142 小时前
中兴机顶盒纯净固件|多机型适配+刷机解析
android·源码·源代码管理·机顶盒
TAEHENGV3 小时前
提醒列表模块 Cordova 与 OpenHarmony 混合开发实战
android·java·harmonyos
渡我白衣3 小时前
计算机组成原理(10):逻辑门电路
android·人工智能·windows·嵌入式硬件·硬件工程·计组·数电
Zender Han3 小时前
Flutter EasyRefresh 最新版本:自定义 Header / Footer 详解与实践
android·flutter·ios
鹏程十八少3 小时前
Android ANR项目实战:Reason: Broadcast { act=android.intent.action.TIME_TICK}
android·前端·人工智能
TheNextByte13 小时前
如何将Android中的照片传输到Windows 11/10
android·windows