Andorid.bp 语法浅析
为什么要有Andorid.bp?
原因:andorid工程越来越大,makefile的编译时间越来越长,所以开发出了ninga。
Google开发出的kati 可以将makefile or Andorid.mk 直接翻译成 Ninja
Andorid.bp 是安卓引入代替Andorid.mk的,不同于Andorid.mk文件,Andorid.bp是
纯粹的配置文件,包括分支,循环流程控制。
Blueprint/Soong 就是被开发出来对Andorid.bp进行翻译的。
上述两个过程:
Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja

模块
定义一个模块从模块的类型开始。譬如cc_binary android_app、cc_library_static。
模块包含一些属性格式为property-name:property-value,其中name属性必须指定,其
属性值必须是全局唯一的。

动态库:可以被 install/copy 到应用程序包(apk)
静态库:可以被链接入动态库

name : 模块的名称
src : 模块的源码
include_dirs : 指定的头文件查找路径
shared_libs : 编译时依赖的动态库
static_libs : 编译时依赖的静态库
subdirs : 是一个文件级的顶层属性,指定后会查找次级目录下的Android.bp
platform_apis : 用 sdk 的 hide 的 api 來编译
certificate : 指定用的是什么签名,如上用的是 platform 签名。
jni_libs : 依赖使用的 JNI 库
libs : 工程中的 libs 库
static_libs : 静态库,其中 nearme_nfc 为下方定义的:java_import
optimize : 压缩配置,enabled 是否开启,obfuscate 是否开启混淆,proguard_flags_files
混淆规则配置文件
host_supported : Android.bp 文件要求每个模块拥有唯一的名称,但每个模块可以内置多种变化,
例如可以添加 host_supported: true

科普SDK
SDK 就是 Software Development Kit 的缩写,中文意思就是【软件开发工具包】。这是一个覆
盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫
做【SDK】。

转换mk
Soong 包含了一个工具,可以将Android.mk文件转换为Android.bp文件:
androidmk Android.mk > Android.bp
工具位于:android\out\soong\host\linux-x86\bin\androidmk 该工具可以转换变量,模块,注
释和一些条件,但任何自定义的 Makefile 规则,复杂条件或额外的 include 必须手动转换。

Andorid系统启动:.rc文件

.rc文件
init.rc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。
rc规则主要包含了四种类型的语句:
1.Action
2.Commands
3.Services
4.Options
Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。

在第一个语句块之前的commands和options会被忽略。
基本规则如下(基本上与bash语法一样):
注释是以#开头。
在init.rc文件中一条语句通常是占据一行.
单词之间是通过空格符来相隔的.如果需要在单词内使用空格,那么得使用转义字符"",
如果在一行的末尾有一个反斜杠\,那么是换行折叠符号,应该和下一行合并成一起来处理,与C
语言中的含义是一致的。

关键字
关键词:
1.toke:在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀
请、登录系统使用。
2.Section: 语句块,相当于C语言中大括号内的一个块。一个Section以Service或On开头。以
Service开头的Section叫做服务。而以On开头的叫做动作(Action)。
3.services:服务
Action:动作
commands:命令
options:选项
trigger:触发条件
class:类属,即能够为多个service指定一个同样的类属,方便操作同一时候启动或停止。

Action
动作表示了一组命令(commands)组成。动作包括一个触发器,决定了何时运行这个动作。
一个动作所包括的命令将被依次运行。
一个Action:
on ## 触发条件
##执行命令
##可以执行多个命令

trigger(触发器)
在"动作"(action)里面的,on后面跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事
件类型的字符串,它将对应的Action的执行。
触发器(trigger)有几种格式:
1、最简单的一种是一个单纯的字符串。比如“on boot”。这种简单的格式可以使用命令"trigger"来触发。
2、还有一种常见的格式是"on property<属性>=<值>“。如果属性值在运行时设成了指定的值,则"块”
(action)中的命令列表就会执行。

常见格式:
格式 含义:
on early-init 在初始化早期阶段触发
on init 在初始化阶段触发
on late-init 在初始化晚期触发
on boot/charger 当系统启动/充电时触发
on property 当属性值满足条件时触发

例如:

on property:vendor.sys.boot_mode=normalwrite ${persist.vendor.mmi.misc_dev_path} "normal"on bootchown bluetooth bluetooth /sys/module/bluetooth_power/parameters/powerchown bluetooth net_bt /sys/class/rfkill/rfkill0/typechown bluetooth net_bt /sys/class/rfkill/rfkill0/statechown bluetooth bluetooth /proc/bluetooth/sleep/proto

commands(命令)
command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令.
命令将在所属事件发生时被一个个地执行.

命令 描述
exec [ ]* 运行指定路径下的程序,并传递參数
ifup 使指定的网络接口"上线",相当激活指定的网络接口
import 导入一个额外的init配置文件
hostname 设置主机名
chdir 改变工作文件夹
chmod 改变指定文件的读取权限
chown 改变指定文件的拥有都和组名的属性
chroot 改变进行的根文件夹
`class_start `` 启动指定类属的全部服务,假设服务已经启动,则不再反复启动
class_stop 停止指定类属的所有服务
domainname 设置域名
insmod 安装模块到指定路径
mkdir [mode] [owner] [group] 用指定參数创建一个文件夹,在默认情况下,创建的文件夹读取
权限为755 username为root,组名为root.
mount

[ ]* 类似于linux的mount指令
setkey TBD(To Be Determined), 待定
setprop 设置属性及相应的值
setrlimit 设置资源的rlimit(资源限制),不懂就百度一下rlimit
start 假设指定的服务未启动,则启动它
stop 假设指定的服务当前正在执行,则停止它
symlink 创建一个符号链接
sysclktz <mins_west_of_gmt> 设置系统基准时间
trigger 触发一个事件,Used to queue an action from another action.
write [ ]* 往指定的文件写字符串

services(服务)
服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序

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

解释一下各个参数:
参数 含义
name 表示此服务的名称
pathname 此服务所在路径因为是可执行文件,所以一定有存储路径。
argument 启动服务所带的参数
option 对此服务的约束选项

option (选项)
options是Service的修订项。它们决定一个服务何时以及如何运行。
选项 描述
critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。
disabled 服务不会自动运行,必须显式地通过服务器来启动。
setenv 设置环境变量。
socket [ [ ] ] 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket。
user 在执行此服务之前先切换用户名。当前默认为root。
group [ ]* 类似于user,切换组名。
oneshot 当此服务退出时不会自动重启。
class 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default.。
onrestart 当服务重启时执行一条指令。

使用例子:

service bootanim /system/bin/bootanimationclass core  //给服务指定一个类属,这样方便操作多个服务同时启动或停止user graphics //在执行此服务之前先切换用户名group graphics audiodisabled  //服务不会自动运行oneshot  //当此服务退出时不会自动重启

rc文件解析
源码路径 system/core/init/init.cpp 中:
parser.ParseConfig(“/init.rc”);

开始解析rc文件.

ParseConfig函数在文件core/init/init_parser.cpp140行:
bool Parser::ParseConfig(const std::string& path) {if (is_dir(path.c_str())) {return ParseConfigDir(path);}return ParseConfigFile(path);
}

ParseConfigFile函数:

bool Parser::ParseConfigFile(const std::string& path) {LOG(INFO) << "Parsing file " << path << "...";Timer t;std::string data;if (!read_file(path, &data)) {return false;}data.push_back('\n'); // TODO: fix parse_config.ParseData(path, data);for (const auto& sp : section_parsers_) {sp.second->EndFile(path);}LOG(VERBOSE) << "(Parsing " << path << " took " << t << ".)";return true;
}

Andorid.bp文件和Anorid.rc文件入门相关推荐

  1. Android Init Language(RC文件)介绍

    Android Init Language介绍 基本概念 什么是rc文件? Android Init进程用rc做了什么? 相关内容 Android RC文件应用 Android rc文件语法解析 Li ...

  2. 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  3. vs2010 将.mc编译为.rc文件

    vs2010 将.mc编译为.rc文件 That file will be generated by the message compiler. Now add a custom build step ...

  4. android5.1 init对rc文件解析执行顺序

    android5.1 init对rc文件解析执行顺序 备注,下面on对应的section下面内容的数字,代表内核启动log所在的行数 比如我们的init.rc文件部分内容如下: import /ini ...

  5. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  6. Android init.rc文件解析过程详解(二)

    Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...

  7. Android init.rc文件解析过程详解(一)

        Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...

  8. 文件上传利器SWFUpload入门简易教程

    凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...

  9. linux mail.rc 端口,配置mail.rc 文件并使用mail发送邮件的详细配置

    我个人被mail这个命令困扰了很久,尝试了很多方法最终确定了问题所在,在此和大家分享一下 一般大家在网上搜索到的教程给出的配置方法如下: 这是我网易邮箱 set from=liuwenbin150@1 ...

最新文章

  1. java语言环境变量_JAVA语言环境变量的设置教程
  2. pythonif语句的多分支使用_Python多分支if语句的使用
  3. 高校教师职称制度将迎重大改革,教师怎么看?
  4. Arcgis Javascript那些事儿(八)--图层获取与图层顺序
  5. selenium+python自动化106 - 滑动 iframe 上的滚动条
  6. QT界面主题风格设置
  7. SpringCloud微服务后台管理系统
  8. 信息流广告投放分析实战案例!
  9. ubuntu多显示器单触摸屏校准
  10. Google SketchUp For Dummies
  11. 【无标题】Windows10安全中心永久关闭教程
  12. 积极心态,助力人生成功
  13. MySQL索引、视图创建与管理操作实验
  14. A-Priori算法及其优化(FP树)
  15. Fitting ellipse
  16. 【电子电路】上拉电阻与下拉电阻的作用
  17. 卡巴斯基网络安全解决方案-服务器虚拟化安全2.0安装方法,营销材料(内部)_卡巴斯基网络安全解决方案-虚拟化安全(KSV2.0)_V1.0.docx...
  18. SQL三值逻辑和NULL
  19. 漫威迷福利:新加坡杜莎夫人蜡像馆漫威4D体验馆
  20. ubuntu 18.04 局域网无法访问内部DNS的解决办法

热门文章

  1. Poco logger 日志使用小析
  2. _IO,_IOR,_IOW和_IORW的含义
  3. R16 5G NR Two-Step RACH
  4. java使用CRC32计算校验和
  5. Vue 开发环境搭建(Mac 版)
  6. 交叉编译工具链的安装
  7. 单点登录CAS-03:cas配置02-开启/status
  8. qqwry 解析(python3) 并且dump 到 mysql
  9. Galera:多主同步MySQL集群原理解析
  10. Android 题目动态存储+倒计时功能实现