第3讲 cameraserver.rc详解(上)

https://deepinout.com/android-camera-native-framework/cameraserver-process-rc-in-details-part1.html

1 Android init 语言简介

1.1 rc文件官方文档

/system/core/init/README.md
在线中文版:
https://deepinout.com/android-system-analysis/android-bootloader/android-init-language.html

1.2 rc文件语法

以行为单位,空格分隔标记,通过反斜杠转义(或双引号)插入空格
注释以#开头

1.3 修改rc文件后要重启系统

因为rc文件的解析是在开机启动时解析的

dmesg |grep -i cameraserver
[   17.427530] init: Parsing file /system/etc/init/cameraserver.rc...
[   17.434089] init: /system/etc/init/cameraserver.rc: 3: Unable to find UID for 'xxxcameraserverxxx': getpwnam failed: No such file or directory
[   35.306169] init: starting service 'xxxxcameraserver'...

2 cameraserver.rc详解

service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    task_profiles CameraServiceCapacity MaxPerformance
    rlimit rtprio 10 10

2.1 service

Service是一种服务,在开机时启动,退出时自动重启(可选)

  • 语法
service <name> <pathname> [<argument>]*
<option>
<option>
  • example
service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    task_profiles CameraServiceCapacity MaxPerformance
    rlimit rtprio 10 10
  • 手动打开或者关闭服务
# 1. 查找服务进程
ps -A |grep camera                                                                                                                                                                   
cameraserver   361     1   48664  13884 binder_wait_for_work 0 S android.hardware.camera.provider@2.4-service
system         362     1 10962704 12724 binder_wait_for_work 0 S android.hardware.camera.provider@2.7-service-google
cameraserver   462     1 11290576 22788 binder_wait_for_work 0 S cameraserver
# 2. 重启服务
stop cameraserver
start cameraserver
# 3. 关闭服务
pidof cameraserver
462
killall 462 
  • 修改cameraserver.rc文件的服务名
# 1. 取出rc文件
adb pull /system/etc/init/cameraserver.rc
# 2 修改rc文件服务名
# 3 放回rc文件
adb push cameraserver.rc /system/etc/init/cameraserver.rc

2.2 class 选项

为该服务指定class名字,用于描述在启动的哪个阶段启动该class相关的服务

  • 语法
class <name> [ <name>* ]
  • Class name举例
    early_hal、hal、core、main、late_start、charger
    Class name相同的服务会被一起启动/停止

  • 启动顺序分析

emulator_x86_64:/ # dmesg |grep -i camera                                                                                                                                                                  
[    3.996972] init: Parsing file /system/etc/init/cameraserver.rc...
[    4.053300] init: Parsing file /vendor/etc/init/android.hardware.camera.provider@2.4-service.rc...
[    4.054521] init: Parsing file /vendor/etc/init/android.hardware.camera.provider@2.7-service-google.rc...
[    7.539133] init: starting service 'vendor.camera-provider-2-4'...
[    7.542408] init: starting service 'vendor.camera-provider-2-7-google'...
[    8.034167] init: starting service 'cameraserver'...
emulator_x86_64:/ # ps -A |grep camera
cameraserver   348     1   48664  16420 binder_wait_for_work 0 S android.hardware.camera.provider@2.4-service
system         349     1 10900216 14788 binder_wait_for_work 0 S android.hardware.camera.provider@2.7-service-google
cameraserver   464     1 11018192 26244 binder_wait_for_work 0 S cameraserver

Cameraserver的class是main,
vendor.camera-provider-2-7-google的class是hal,
因此第一次启动时, cameraserver的pid比vendor.camera-provider-2-7-google要大

2.3 user选项

在执行此服务之前,将用户名更改为‘username’,有了UID后,方便对同一个用户名的进程进行权限控制,比如SELINUX权限设置

  • 语法
user <username>
  • username的定义
    (/system/core/libcutils/include/cutils/android_filesystem_config.h)
    定义时,已经决定了uid的字符串名字
/*
 * This file is consumed by build/tools/fs_config and is used
 * for generating various files. Anything #define AID_
 * becomes the mapping for getpwnam/getpwuid, etc. The 
 * field is lowercased.
 * For example:
 * #define AID_FOO_BAR 6666 becomes a friendly name of "foo_bar"*/

#define AID_CAMERASERVER 1047 //1047 为id AID_CAMERASERVER最终转化为 "cameraserver"

查看某个进程的uid

cat /proc/403/status |grep -i uid
Uid:    1047    1047    1047    1047

2.4 group选项

在执行此服务之前,将用户组更改为‘groupname’,有了GID后,方便对同一个用户名的进程进行权限控制,比如SELINUX权限设置

  • 语法
group <groupname> [ <groupname>* ]
#  当设置了多个group时,GID取第一个group的,其他groups是补充
# 
  • gid定义参考

(/system/core/libcutils/include/cutils/android_filesystem_config.h)

#define AID_AUDIO 1005 //1005 为id AID_CAMERASERVER最终转化为 "cameraserver"
  • 查看某个进程的uid
cat /proc/403/status |grep -i gid
Uid:    1047    1047    1047    1047
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值