Android R(11)为HIDL服务添加rc配置文件(四)

本文详细解读了Android的初始化语言AIL,涉及rc配置文件结构、服务与选项的编写规则,以及init.rc在系统启动中的作用。重点讲解了服务定义、选项设置和rc文件的组织方式,适合进阶开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  rc配置实际上也就是安卓初始化语言(android init language),其中的内容最终被init进程解析并执行。

1.AIL(Android Init Language)

  AIL的内容主要由五部分组成,其分别是动作(Actions)、命令(Commands)、服务(Services)、选项(Options)、导入(Imports),这AIL中的五个成分的中文翻译是非官方的哦,大家还是记英文版较好^_^。其编写风格大致如下

  1.上面提到的五个大类,在init进程中都是以行首开始分析的。
  2.一行中的参数则以空格作为间隔标志。
  3.注释以`#`开始。
  4.支持android属性的值解析功能,例如获取属性property.name的值的写法如下。

${property.name}
//可以支持动态根据属性值来导入对应的rc文件
import /init.recovery.${ro.hardware}.rc


  5.Actions和Services代表一个新段(section),即一个描述的整体,另外三个则是这两个段的组成部分。
  6.Services的名字必须唯一,如果同时存在则以init进程第一次解析到的为准。例如

//file 1.rc
service ser1 /syste/bin/foo1
//file 2.rc
service ser1 /syste/bin/foo2

如果1.rc先于2.rc被init进程解析的话,那么ser1被触发启动的时候,可执行程序/syste/bin/foo1将被执行而不是 /syste/bin/foo2。

2.供Init进程解析的 .rc 文件

  AIL的文件大都以.rc作为后缀。其中/init.rc则是系统启动时,init进程主要解析的rc文件。rc文件的遍布如下
  1./system/etc/init/ is for core system items such as
SurfaceFlinger, MediaService, and logd.
  2./vendor/etc/init/ is for SoC vendor items such as actions or
daemons needed for core SoC functionality.
  3./odm/etc/init/ is for device manufacturer items such as
actions or daemons needed for motion sensor or other peripheral
functionality.

3.Services

  服务是init启动并(可选)在退出时重新启动的程序。服务的格式如下

service <name> <pathname> [ <argument> ]*
       <option>
       <option>
       ...

4.Options

  选项是服务的修饰符。它们影响init运行服务的方式和时间。
至此和本章相关的rc知识已盘完,如果想深入了解AIL的,可以参考android团队的官方文档,其路径如下

flagstaff@flagstaff-pc:~/aosp_r.lns/system/core/init$ ls README.md 
README.md

5.flagstaff.hardware.custom_hardware@1.0-service.rc

5.1 碎片rc文件的编译

  Android R推荐将service的rc文件放置在其同级目录,这样能很好的解藕AIL。所以这里也是用这种做法。

//file:test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/default/Android.bp
cc_binary {
    name: "flagstaff.hardware.custom_hardware@1.0-service",
    ...
    init_rc: ["flagstaff.hardware.custom_hardware@1.0-service.rc"],
}

  编译成功后,碎片的rc文件也会被android编译系统放置到对应位置,此处对应的路径如下。

flagstaff@flagstaff-pc:~/aosp_r.lns$ ls out/target/product/generic_x86_64/vendor/etc/init/flagstaff.hardware.custom_hardware@1.0-service.rc 
out/target/product/generic_x86_64/vendor/etc/init/flagstaff.hardware.custom_hardware@1.0-service.rc

5.2 配置解析

  完整的配置如下

service flagstaff.custom_hardware-hal-1-0 /vendor/bin/hw/flagstaff.hardware.custom_hardware@1.0-service
    class hal
    user system
    group system

class hal:
  该服务属于类hal,在init启动hal类服务的时候,该服务也会被启动,hal类的启动点则在init.rc文件中

file:/system/etc/init/hw/init.rc  
class_start hal

user&&group:
  以system的用户和组的身份来运行该服务。
  另外如果有问题,欢迎留言或者email(836190520@qq.com)我,技术升级在于交流~~

<think>好的,我现在需要回答用户关于Android 11中wpa_supplicant启动是否使用.rc文件的问题。首先,我得回忆一下Android系统的启动和服务管理机制。 我记得在Android中,init进程负责解析init.rc文件来启动服务。传统的服务管理确实是通过.rc文件配置的,比如wpa_supplicant这样的守护进程。不过,用户提到的是Android 11,可能需要考虑是否有变化。 然后,想到Android 8.0引入了Treble项目,其中一部分是将一些服务迁移到使用HIDLHAL接口定义语言)。这可能影响服务的启动方式。另外,Android 10和11继续推进了Treble,可能引入了更多变化。 接下来,关于wpa_supplicant,它属于Wi-Fi相关的HAL层。在较新的Android版本中,可能使用了hwservicemanager来管理硬件相关的服务,而启动方式可能从init.rc转移到了VINTF(Vendor Interface)配置中,通过manifest.xml文件声明服务,然后由init进程动态生成对应的rc配置。 此外,Android引入了动态rc文件生成,例如通过vendor服务的manifest文件,系统在启动时生成相应的rc配置,而不是直接使用静态的.rc文件。因此,虽然表面上可能看不到传统的.rc条目,但底层依然通过类似机制启动服务。 需要验证这一点,可能需要查阅Android 11的源代码,特别是wpa_supplicant相关的启动配置。例如,查看system目录下的init.rc,或者hardware和vendor相关的部分是否有对wpa_supplicant的配置。或者是否在vintf目录下的manifest.xml中声明了服务,触发动态生成rc配置。 另外,可能wpa_supplicant被包装成一个HIDL服务,通过hwservicemanager启动,这样它的启动方式就变成了由hidl服务管理器控制,而不是直接写在rc文件里。这种情况下,.rc文件可能仍然存在,但配置方式不同,比如使用不同的class或者触发条件。 总结来说,虽然用户可能没有在传统的.rc文件中看到wpa_supplicant的启动配置,但实际上Android可能在更高版本中通过VINTF和动态生成的rc文件来管理其启动,或者将其作为HIDL服务的一部分。需要确认具体的配置位置和方式,可能涉及vendor分区的manifest文件或动态生成的rc配置。</think>在Android 11中,`wpa_supplicant`的启动机制确实与传统`.rc`文件的使用有所不同,以下是关键点解析: --- ### 1. **传统`.rc`文件的作用** 在早期Android版本中,系统服务(如`wpa_supplicant`)通过`init.rc`或`/system/etc/init/`目录下的`.rc`文件定义启动规则。例如: ```rc service wpa_supplicant /system/bin/wpa_supplicant class main socket wpa_wlan0 dgram 660 wifi wifi disabled oneshot ``` --- ### 2. **Android 11的变化** 从Android 8.0(Treble项目)开始,系统服务的启动逐步转向**HIDL(Hardware Interface Definition Language)**和**VINTF(Vendor Interface Object)**架构。在Android 11中: - **动态生成配置**:部分服务(包括`wpa_supplicant`)的启动配置不再直接写在静态`.rc`文件中,而是通过`hwservicemanager`和VINTF的`manifest.xml`文件动态生成。 - **VINTF声明**:硬件厂商需在`manifest.xml`中声明服务,例如: ```xml <hal format="hidl"> <name>android.hardware.wifi.supplicant</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISupplicant</name> <instance>default</instance> </interface> </hal> ``` 系统会根据这些声明自动生成对应的`.rc`配置。 --- ### 3. **实际启动流程** - **触发条件**:当Wi-Fi HAL服务被请求时,`init`进程会检查VINTF配置并动态加载`wpa_supplicant`。 - **配置文件位置**:生成的动态配置通常位于`/vendor/etc/init/`或`/system/etc/init/`,但文件名可能包含哈希值(如`android.hardware.wifi.supplicant@1.0-service.rc`)。 --- ### 4. **验证方法** - **检查进程**:运行`adb shell ps -A | grep wpa`可看到`wpa_supplicant`进程。 - **查看动态配置**:通过`adb shell ls /vendor/etc/init/`查找与`wpa_supplicant`相关的动态生成文件。 --- ### 5. **总结** - **并非完全弃用`.rc`**:底层仍依赖`init`进程,但配置来源从静态文件变为动态生成。 - **架构演进**:这种变化是Android Treble项目的一部分,旨在解耦框架与硬件实现,提升系统升级灵活性。 如需进一步分析具体设备的实现,建议查阅对应厂商的VINTF `manifest.xml`文件或动态生成的`.rc`配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值