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

相关推荐
释厄6232 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
wno7043 小时前
MYSQL 常用合并函数
android·数据库·mysql
事圆则缓3 小时前
HTTP 请求是怎么走的:从 Android 页面到服务端响应
android·网络协议·http
美狐美颜SDK开放平台5 小时前
直播APP平台搭建需要哪些技术?视频美颜SDK只是其中一环
android·ios·音视频·直播美颜sdk·视频美颜sdk
AIsoft_86896 小时前
传统记录方式为什么越来越难满足需求?
android·iphone
小π军6 小时前
安卓、iOS、鸿蒙三端的理解
android·ios·harmonyos
BD_Marathon7 小时前
ChatPromptTemplate的高级特性
android·java·javascript
夜晚回家7 小时前
Python 变量入门详解 | 用 BMI 案例串起赋值、乘方与取整
android·python
程序猿追7 小时前
立方体转到九十度:用 kotlin-math 核对鸿蒙上的两种旋转
android·开发语言·kotlin
半调子的社畜7 小时前
记账 App 我装了删、删了装,最后自己写了一个:本地语音识别 + R8 踩坑复盘
android·ai编程