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

相关推荐
Libraeking5 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位5 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1237 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs7 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob7 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔8 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9968 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly10 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首10 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-194313 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed