当前位置: 首页 > web >正文

Android架构之自定义native进程

在Android五层架构中,native层基本上全是c++的世界,这些c++进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c++子进程,也是这众多的c++进程,构建了整个android世界的native层。

这里介绍一下如何自定义一个native进程,或者c++进程,或者init服务。在阅读本篇之前,可以先看看Android Native 之 Init进程分析_android init进程-CSDN博客

一、System分区native进程

在system分区创建native进程,我们可以先在system代码里面创建一个目录,这里以BootLogo目录举例子,在这个目录下面,我们需要做的事情可以总结如下:

  • 编写Android.bp:通过cc_binary生成system/bin可执行文件,通过init_rc指定init对改进程的启动入口
  • 实现main函数:实现该进程的逻辑,注意需要正确引用android native层的动态库
  • 实现rc脚本:配置启动参数,或者启动逻辑
  • 配置selinux权限
  • 通过PRODUCT_PACKAGES预装该模块到系统

1、Android.bp配置

2、init.rc配置

init.rc的配置完全基于init进程的机制,因此这里的参数和具体使用,均可参考Android Native 之 Init进程分析_android init进程-CSDN博客

3、实现main函数

如下代码,实现main函数,main函数里面可以接受来自rc的参数,这里简单实现

4、编译预装模块

在system代码下面的mk编译脚本中,通过PRODUCT_PACKAGES来预装集成该模块

5、Selinux权限配置

在system代码下面的mk编译脚本中,通过SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS指定selinux配置:

SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS += xxx/sepolicy/private

在如上指定路径创建file_contexts文件配置/system/bin/xxx可执行文件的scontext:

/system/bin/bootlogo u:object_r:bootlogo_exec:s0

在如上指定路径创建xxx.te文件配置该进程的安全策略:

type bootlogo, domain;
typeattribute bootlogo coredomain;  #注意:system分区的文件继承system_file_type,因此需要加入coredomain
type bootlogo_exec, system_file_type, exec_type, file_type;
init_daemon_domain(bootlogo)

selinux相关配置详情参考:Android安全策略SELinux_android selinux-CSDN博客

二、Vendor分区natvie进程

在vendor创建native进程,大体流程和system的基本一致,但是需要考虑的几个点如下:

  • Android.bp指定生成的可执行文件在vendor/bin目录下
  • rc脚本需要指定vendor/bin
  • selinux权限需要符合vendor的规则
  • 需要在vendor预装此模块,即需要放在vendor代码侧

1、Android.bp配置

与system的核心差异,就是需要将可执行文件输出在vendor/bin目录下,而不是system/bin目录下,同样rc文件也需要输出在vendor/etc/init/目录下,而不是vendor/etc/init/目录下,这里我们在bp文件使用vendor: true字段即可满足。

2、init.rc配置

这里基本上和第一章内容一致,值得注意的是,这里需要指定vendor/bin目录下的可执行文件

3、实现main函数

同上。

4、编译预装模块

同上。

在vendor侧代码下面的mk编译脚本中,也是通过PRODUCT_PACKAGES来预装集成该模块

5、Selinux权限配置

在system代码下面的mk编译脚本中,通过BOARD_SEPOLICY_DIRS指定selinux配置:

BOARD_SEPOLICY_DIRS += xxx/sepolicy/vendor    #此宏针对vendor这边的selinux策略

在如上指定路径创建file_contexts文件配置/vendor/bin/xxx可执行文件的scontext:

/vendor/bin/bootlogo u:object_r:bootlogo_exec:s0

在如上指定路径创建xxx.te文件配置该进程的安全策略:

type bootlogo, domain;
type bootlogo_exec, exec_type, file_type, vendor_file_type;

#注意这里继承的vendor_file_type,所以在进行域转换不会违反neverallow规则
init_daemon_domain(bootlogo)

 selinux相关配置详情参考:Android安全策略SELinux_android selinux-CSDN博客

http://www.xdnf.cn/news/6064.html

相关文章:

  • 需求实现与测试验证脱节,如何确保产品质量
  • 【大模型面试每日一题】Day 17:解释MoE(Mixture of Experts)架构如何实现模型稀疏性,并分析其训练难点
  • Cadence软件浮点许可优化管理方案助力企业降本增效
  • 通过SSRF击穿内网!kali-ssrf靶场实战!
  • Maven插件学习(七)—— Toolchains设置项目单独构建JDK(或其他工具)
  • CAN(控制器局域网络)协议详解
  • 反射(Reflection)详解
  • leetcode0295. 数据流的中位数-hard
  • python数据分析常用的10个核心库
  • gradle--问答
  • Vxworks 系统详解
  • Realtek 8126驱动分析第四篇——multi queue相关
  • vLLM Serve 命令参数详解
  • 小白成长之路-文件和目录内容检索处理(一)
  • 2025年项目管理软件哪个更流行?如何解决用例复用率低的难题?
  • write failed: Connection reset by peer
  • 抖音怎么快速涨粉(抖音推流算法研究)
  • python语言与地理处理note 2025/05/11
  • ArrayList的扩容机制
  • 基于脑功能连接组和结构连接组的可解释特定模态及交互图卷积网络|文献速递-深度学习医疗AI最新文献
  • 普通IT的股票交易成长史--20250513复盘
  • 收集卡牌 第23次CCF-CSP计算机软件能力认证
  • 大模型中的KV Cache
  • 开发者版 ONLYOFFICE 协作空间:3.1版本 API 更新
  • RabbitMQ学习(自用)
  • (顺序表、单链表、双链表)==>一篇解决!(Java版)
  • 【即插即用涨点模块】【上采样】CARAFE内容感知特征重组:语义信息与高效计算两不误【附源码】
  • MyBatis与MyBatis-Plus深度分析
  • SimpleAdmin云服务器发布
  • Qt —— 在Windows10下通过在线安装方式安装Qt6.9.0(附:“server replied: Forbidden“网络出错解决办法)