Android.bp常用语法和预定义属性

2023-09-19 08:17:02

介绍

Android.bp是Android构建系统中用于定义模块和构建规则的配置文件,它使用一种简单的声明式语法。以下是Android.bp的一些常见语法规则和约定:

  • 注释:
    单行注释使用//符号。
    多行注释使用//包围。
    和go语言相同

    // 这是单行注释
    /* 这是
       多行注释 */
    
  • 模块定义:
    每个模块都以module_type字段开始,指定模块的类型,例如cc_library、java_library等。
    模块定义由大括号{}包围,包含模块的属性和规则。

    cc_library {
    	name: "my_lib",
    	srcs: ["file1.cpp", "file2.cpp"],
    	shared_libs: ["lib1", "lib2"],
    }
    
  • 属性和值:
    属性以名称和冒号:组成,后跟相应的值。
    值可以是字符串、整数、布尔值、列表等,具体取决于属性的类型。
    字符串值通常使用双引号括起来,但也可以不括起来,只要字符串中不包含空格等特殊字符。

    name: "my_module",
    
    
  • version: 1,

    enabled: true,
    srcs: [“file1.cpp”, “file2.cpp”],

  • 列表属性:
    列表属性使用方括号[]来定义,元素之间用逗号分隔。
    列表属性可以包含字符串、整数、布尔值等。

    srcs: ["file1.cpp", "file2.cpp", "file3.cpp"],
    
  • 变量和函数:
    Android.bp支持一些内置变量和函数,用于获取构建系统的信息或执行特定操作。

    target: {
    	android: {
        	srcs: ["android_src.cpp"],
    	},
    	host: {
        	srcs: ["host_src.cpp"],
     	},
    },
    

这些是Android.bp的一些基本语法规则和约定。Android构建系统使用这些规则来构建Android操作系统,开发者可以根据项目需求自定义Android.bp文件来定义模块和构建规则。有关更详细的语法规则和属性,请参阅Android构建系统的官方文档。

以下是一些常见的预定义属性(以下没有定义模块属性):
  1. name:定义模块的名称,通常是唯一标识符。

    name: "my_module",
    
  2. srcs:指定模块的源文件,可以是一个文件列表。

    srcs: ["file1.cpp", "file2.cpp"],
    
  3. deps:指定模块的依赖关系,即依赖于其他模块的模块列表。

    deps: ["dependency_module1", "dependency_module2"],
    
  4. visibility:指定模块的可见性,确定哪些模块可以访问它。

    visibility: ["//my/module:visible_module"],
    
  5. cflags、cppflags、ldflags:用于指定C/C++编译和链接的标志。

    cflags: ["-Wall", "-O2"],
    cppflags: ["-DDEBUG"],
    ldflags: ["-L/path/to/lib", "-lmylib"],
    
  6. shared_libs、static_libs:指定模块的动态链接库和静态链接库的依赖关系。

    shared_libs: ["lib1", "lib2"],  //编译依赖的动态库lib1和lib2
    static_libs: ["lib3", "lib4"],  //编译依赖的静态库lib3和lib4
    
  7. host_supported、device_supported:指定模块是否支持主机构建和目标设备构建。

    host_supported: true,
    device_supported: true,
    
  8. installable:指定模块是否可以被安装到系统镜像中。

    installable: true,
    
  9. product_specific: 指定编译出来放在/product/目录下(默认是放在/system目录下)

    product_specific: true
    
  10. vendor: 指定编译出来放在/vendor/目录下(默认是放在/system目录下)

    vendor: true,  
    

案例:

//hello.cpp源码
#include <cstdio>
#include <android/log.h>

#define LOG_TAG "ezconn"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG ,__VA_ARGS__)

int main() {
    printf("hello ezconn\n");
    LOGD("hello ezconn");
    return 0;
}

cc_binary {              //模块类型为可执行文件
    name: "Hello1",       //模块名Hello1
    srcs: ["hello.cpp"], //源文件列表
    vendor: true,        //编译出来放在/vendor/bin目录下(默认是放在/system目录下)
    shared_libs: [       //编译依赖的动态库
    	 "liblog",
   ],
}

案例2

//hello.cpp源码
#include <cstdio>
int main()
{
    printf("Hello Android\n");
    return 0;
}

cc_binary {
    name: "Hello2",       //模块名Hello2
    srcs: ["hello.cpp"],
    product_specific: true,  //编译出来放在/product/bin目录下(默认是放在/system目录下)
    cflags: ["-Werror"], //添加编译选项
}

这些是Android.bp文件中一些常见的预制属性。每个属性用于不同的目的,开发者可以根据模块的类型和需求来使用它们。此外,Android构建系统还支持许多其他属性,这些属性可以根据具体的构建任务和模块类型进行自定义。有关更多属性和其详细说明,请参阅Android构建系统的官方文档。

哈德良长城,诺森伯兰郡国家公园

更多推荐

BANI时代下,项目如何实现价值交付?

随着时代的变化,继VUCA时代后、新的语言出现:BANI一词逐渐流行起来。BANI,取自四个英文单词Brittle(脆弱的)、Anxious(焦虑的)、Nonlionear(非线性的)、Incomprehensible(费解的)首字母的大写。Brittleness(脆弱性):在BANI时代,系统和组织可能会突然、且无预

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册

晨控CK-FR102系列与汇川AC800系列MODBUSTCP通讯手册晨控CK-FR102AN系列是一款基于射频识别技术的高频双通道读写器,读写器工作频率为13.56MHZ,支持对I-CODE2、I-CODESLI等符合ISO15693国际标准协议格式标签的读取。高频双通道读写器支持标准工业通讯协议ModbusTCP,

Arduino程序设计(十一)8×8 共阳极LED点阵显示(74HC595)

8×8共阳极LED点阵显示前言一、74HC595点阵模块1、74HC595介绍2、74HC595工作原理3、1088BS介绍4、74HC595点阵模块二、点阵显示实验1、点阵显示初探2、点阵显示进阶3、点阵显示高阶3.1点阵显示汉字(方法1)3.2点阵显示汉字(方法2)补充前言本文主要介绍8×8共阳极LED点阵显示实验

Python模拟登录豆瓣:轻松探索海量文化资源!

豆瓣是一个集电影、音乐、图书、活动等众多文化内容于一身的知名网站。在本文中,将介绍如何使用Python模拟登录豆瓣,以便获取更多的个性化推荐和参与社区活动。跟随下面的步骤,让我们一起来探索豆瓣的海量文化资源吧!一、安装必要的库在开始之前,需要确保已安装以下库:requests:发送HTTP请求,并处理登录和数据获取。B

libevent学习——event_base

event_base使用libevent函数之前需要分配一个或者多个event_base结构体。每个event_base结构体持有一个事件集合,可以检测以确定哪个事件是激活的。如果设置event_base使用锁,则可以安全地在多个线程中访问它。然而,其事件循环只能运行在一个线程中。如果需要用多个线程检测IO,则需要为每

【k8s】kube-proxy 工作模式

文章目录Userspace模式:iptables模式:负载均衡(LoadBalancing)LB轮询(RoundRobin):SessionAffinity:最少连接(LeastConnection):IP哈希(IPHash):SessionAffinity和IP哈希的异同自定义负载均衡器:IPVS模式:IPVS架构I

vue入门-->前后端分离&vue简介,vue入门,vue生命周期

前后端分离&vue简介vue入门vue生命周期1.前后端分离&vue简介什么是前后端分离?前后端分离,是开发模式上的前后端分离。当然还有项目架构方面的前后端分离,也就是在考虑请求并发,服务器性能,处理请求的效率等因素,从而进行前后端分离,对于初学者的理解来说不是那么友好,因此我们只讨论开发模式上的分离。先下定义:前后端

多位数按键操作(闪烁)数码管显示

/*-----------------------------------------------内容:按键加减数字,多个数码管显示------------------------------------------------*/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能

Postman 的使用教程(详细)

Postman使用教程1.是什么Postman是一个接口测试工具软件,可以帮助开发人员管理测试接口。官网:https://www.getpostman.com/2.安装建议通过官网下载安装,不要去那些乱七八糟的下载平台,或者留言获取官网下载地址:https://www.getpostman.com/downloads/

flutter项目中常用第三方模块

flutter项目中常用第三方模块持续更新中序言关于第三方模块安装flutter_native_splash使用方式模块配置flutter_localizations模块配置使用方式get_storage模块配置使用方式get模块配置使用方式持续更新中序言本章介绍项目中常用第三方模块,方便快速构建项目关于第三方模块安装

JS获取经纬度, 并根据经纬度得到城市信息

在JavaScript中,获取经纬度通常需要使用定位服务,比如HTML5的GeolocationAPI。然而拿到坐标后,将经纬度转换为城市信息,则需要使用逆地理编码服务接口,比如百度或者高德的API,但是他们收费都很高,我们可以使用一些便宜的接口,效果一样的。以下是一个简单的示例:一、获取经纬度首先,你需要使用Geol

热文推荐