相关推荐:

随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多。Google 在 7.0 引入了 ninja 是 Google 的一名程序员推出的注重速度的构建工具,一般在 Unix/Linux 上的程序通过 make/makefile 来构建编译,而 Ninja 通过将编译任务并行组织,大大提高了构建速度。

7.0 的时候 android 项目还是有大部分是由 makefile 来组织的,因此 Google 引入了 kati 将 makefile 翻译成 ninja 文件。8.0 开始,android 引入了 Android.bp 来替代 之前的 Android.mk 文件,不同于Android.mk,Android.bp只是纯粹的配置文件,不包括分支、循环等流程控制。在 android 项目上如何进行选择编译、解析配置、转换成 ninja 等,Soong 就被创造出来,将 Android.bp 转换为ninja文件进行管理。

简而言之,kati 把 bp 直接翻译成 ninja,blueprint / soong 则把 bp 翻译成 ninja。

Android.bp --> Blueprint --> Soong --> Ninja

Makefile or Android.mk --> kati --> Ninja

复制代码

1. 模块

cc_library_shared {//编译成动态库,类似于Android.mk中的BUILD_SHARED_LIBRARY

name: "libbluetooth_jni",//编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE

srcs: [ //源文件,类似于Android.mk中的LOCAL_SRC_FILES

"com_android_bluetooth_btservice_AdapterService.cpp"

],

include_dirs: [//用户指定的头文件查找路径,类似于Android.mk中的LOCAL_C_INCLUDES

"libnativehelper/include/nativehelper",

"system/bt/types",

],

shared_libs: [//编译所依赖的动态库,类似于Android.mk中的LOCAL_SHARED_LIBRARIES

"libandroid_runtime",

"libchrome",

],

static_libs: [//编译所依赖的静态库,类似于Android.mk中的LOCAL_STATIC_LIBRARIES

"libbluetooth-types",

],

cflags: [///编译flag,类似于Android.mk中的LOCAL_CFLAGS

"-Wall",

"-Wextra",

"-Wno-unused-parameter",

],

}

subdirs = ["subdir1", "subdir2"]

复制代码

定义一个模块从模块的类型开始,模块有不同的类型,上面例子中的 cc_library_shared 声明编译成动态库,当然类型还有很多种,譬如 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。

2. 示例

我们来看一下,android 中一个实际的 bp 文件:

android_app {

name: "NFC",

srcs: [

"src/**/*.java",

"nci/**/*.java",

":statslog-Nfc-java-gen",

],

platform_apis: true,

certificate: "platform",

jni_libs: ["libsn100nfc_nci_jni"],

libs: ["com.nxp.nfc.nq"],

static_libs: [

"androidx.appcompat_appcompat",

"nearme_nfc",

],

optimize: {

enabled: true,

obfuscate: true,

proguard_flags_files: ["proguard.flags"],

},

}

java_import {

name: "nearme_nfc",

host_supported: true,

jars: [

"libs/env.jar",

],

}

复制代码

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。

3. 转换 mk

Soong 包含了一个工具,可以将 Android.mk 文件转换为 Android.bp 文件:

androidmk Android.mk > Android.bp

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

码字不易,方便的话素质三连,或者关注我的公众号 技术酱,专注 Android 技术,不定时推送新鲜文章,如果你有好的文章想和大家分享,欢迎关注投稿!

android bp文件_Android 基础 | Android.bp 语法浅析相关推荐

  1. android pak文件_Android资源文件说明

    一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...

  2. android bp文件_Android编译系统中的Android.bp【转】

    本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...

  3. android bp文件_Android.bp 简介

    Android.bp 简介 大部分内容来自官方文档,本文目的为用于备份查询. Android 编译系统 从 Android 7.0 开始,Ninja 成为默认的编译框架.Ninja 是一个致力于速度的 ...

  4. android bp文件_Android.bp学习笔记

    1.Android.bp简介 Android 7.0之后希望用Android.bp替换Android.mk,bp简单的配置更方便Ninja 文件的产生,而Blueprint和Soong 就此产生.An ...

  5. android bp文件_理解Android.bp

    介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...

  6. [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍

    由于项目需要进行Android开发,因此一边开发,一边查阅资料,一边总结了Android布局文件中android:id="@*"属性的使用方法汇总以及介绍.id资源的引用 andr ...

  7. xamarin Android 开发 文件“obj\Debug\android\bin\packaged_resources”不存在

    严重性 代码 说明 项目 文件 行 禁止显示状态 错误 文件"obj\Debug\android\bin\packaged_resources"不存在. AndroidTest 各 ...

  8. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

  9. android手机文件储存地址,Android手机缓存的位置

    在Android手机里面,缓存的位置分为两类,一类是Internal Storage,即内部存储,另外一类是External Storage,即外部存储. 比较老的手机,有一个手机内部存储,还有一个S ...

最新文章

  1. smbus使用 树莓派_树莓派学习笔记——I2C使用 PCF8574 Python SMBUS
  2. linux之vsftpd虚拟用户搭建
  3. java 操作 ES 的方式 整理总结
  4. 拼接大屏数据展示_可视化大屏的UI设计是根据哪几个方面来进行?
  5. 水文特点是什么意思_水文监测仪器设备简介
  6. oracle number对应java什么类型_JVM系列之数据类型
  7. 第2章[2.8] Ext JS的控制器类型及使用
  8. window7 已经分好区的硬盘如何再次分区?
  9. 分别通过【buildpath】和【lib】倒入JAR包有什么不同
  10. php date转换为时间戳,php中date转换时间戳的方法
  11. matlab把数据乘,【excel怎么相乘】如何把EXCLE数据导入到MATLAB中
  12. 2014年牡丹江现场赛打铁记
  13. linux 内核 mtd读取,linux内核 mtd分区
  14. 74HC595级联介绍篇(一)
  15. 神牛TT685C闪光灯ETTL模式不同步解决方案
  16. MATLB|基于粒子群算法的能源管理系统EMS(考虑光伏、储能 、柴油机系统)
  17. 做外贸找国外采购商的七个新方法
  18. 计算机网络思科平台第五章测验答案
  19. Multisim 设计任务
  20. java面试一些问题汇总

热门文章

  1. 2021年起重机司机(限桥式起重机)考试题及起重机司机(限桥式起重机)考试报名
  2. 开机自启动Screen并在后台运行程序
  3. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学
  4. axure 彻底删除lib_【AutoCAD 卸载工具,完全彻底删除清理干净AutoCAD各种残留注册表和文件】...
  5. 30岁之前一定要知道的7个金融概念-千氪
  6. 2019最新百度、头条、小米、360、网易、等公司 Android 社招面试题目
  7. c#调用bartender模板打印标签
  8. SpringBoot集成SwaggerUI及其使用
  9. 籍贯怎样填写_籍贯怎么填写才正确(籍贯正确填写方式)
  10. 函数参数*arg和参数**arg区别