Android mk/bp构建工具介绍

   零. 前言

由于Bluedroid的介绍文档有限,以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等),加上需要掌握的语言包括Java/C/C++等,加上网络上其实没有一个完整的介绍Bluedroid系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluedroid做一个系统性的介绍,尽可能的涵盖所有内容。

-------------------------------------------------------------------------------------------------------------------------

蓝牙视频教程(跟韦东山老师合作), 其中专题21就是专门针对Bluedroid做的系统介绍

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796

--------------------------------------------------------------------------------------------------------------------------

一. Android mk

1. 介绍

Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范。

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)  
................  
LOCAL_xxx       := xxx  
LOCAL_MODULE    := hello-jni  
LOCAL_SRC_FILES := hello-jni.c  
LOCAL_xxx       := xxx  
................  
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH变量指定了该.mk的路径,$(call my-dir)调用NDK内部的函数获得当前.mk文件的路径

include $(CLEAR_VARS)清空了除了LOCAL_PATH之外的所有LOCAL_xxx变量的值

省略号中间就是对于模块参数的设置,主要包括:模块名字、模块源文件、模块类型、编译好的模块存放位置、以及编译的平台等

include $(BUILD_xxx_xxx)执行NDK的默认脚本,它会收集include $(CLEAR_VARS)脚本后所有定义的LOCAL_xxx变量,然后根据它们来生成模块。

2. Android.mk语法详解

LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := hello-jni

LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀

LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) 指定最后生成的模块的目标地址

TARGET_ROOT_OUT:根文件系统,路径为out/target/product/generic/root

TARGET_OUT:system文件系统,路径为out/target/product/generic/system

TARGET_OUT_DATA:data文件系统,路径为out/target/product/generic/data

除了上面的这些,NDK还提供了很多其他的TARGET_XXX_XXX变量,用于将生成的模块拷贝到输出目录的不同路径

默认是TARGET_OUT

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION

include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。
它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY :编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE :编译为Native C可执行程序

BUILD_PREBUILT :该模块已经预先编译

NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。

三. Android.mk实战

1.编译静态库

首先我们把vendor下创建一个Study的目录,然后再Study创建一个test1的目录,tree如下:

我们的目标是把test.c编译成一个静态库

test.c代码如下:

#include <stdio.h>int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}

Android.mk代码如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := test.c
LOCAL_MODULE := test1
include $(BUILD_STATIC_LIBRARY)

编译方法:

方法1:在android 跟目录下敲指令:make test1

方法2:在vendor/Study/test1目录下敲指令mm

注意:两个方法都需要先source build/envsetup.sh -> lunch选择41

test.a生成在out/target/product/rk3399_roc_pc_plus/obj_arm/STATIC_LIBRARIES/test1_intermediates/test1.a

NOTED:我们发现生成的并不是libtest1.a,而是test1.a,这个要注意下

2.编译动态库

首先我们把vendor下创建一个Study的目录,然后再Study创建一个test2的目录,tree如下:

我们的目标是把test.c编译成一个静态库

test.c代码如下:

#include <stdio.h>int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}

Android.mk代码如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := test.c
LOCAL_MODULE := test2
include $(BUILD_SHARED_LIBRARY)

编译方法:

方法1:在android 跟目录下敲指令:make test2

方法2:在vendor/Study/test2目录下敲指令mm

注意:两个方法都需要先source build/envsetup.sh -> lunch选择41

test.so生成在out/target/product/rk3399_roc_pc_plus/obj_arm/SHARED_LIBRARIES/test2_intermediates/test2.so

NOTED:我们发现生成的并不是libtest2.so,而是test2.so,这个要注意下

二. Android bp

1. Android.bp概念

Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的。在Android7.0 以前,Android 都是使用 make 来组织各模块的编译,对应的编译配置文件就是 Android.mk。

在 Android7.0 开始,Google 引入了 ninja 和 kati 来编译,为啥引入 ninja?因为随着 Android 越来越庞大,module 越来越多,编译时间也越来越久,而使用 ninja 在编译的并发处理上较 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系统使用 Blueprint 和 Soong 工具来解析 Android.bp 转换生成 ninja文件。为了兼容老的 mk 配置文件,Android 当初也开发了 Kati 工具来转换 mk 文件生成ninja,目前 Android Q 里边,还是支持 Android.mk 方式的。相信在将来的版本中,会彻底让 mk 文件废弃,同时 Kati 也就淘汰了,只保留 bp 配置方式,所以我们要提前学习bp。

这里涉及到Ninja, kati, Soong, bp概念,接下来分别简单介绍一下。

Ninja

ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。

Android.bp

Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。

Soong

Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。

Blueprint

Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。

Kati

kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。

重要的事情说三遍,Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。

重要的事情说三遍,Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。

重要的事情说三遍,Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。

2. Android mk转换成Android bp

1.安装androidmk 工具

我们以rk3399来举例说明

source build/envsetup.sh

lunch rk3399_roc_pc_plus-userdebug

make androidmk

生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk

2.转换

androidmk Android.mk > Android.bp

3.Android bp语法

1.编译静态库

首先我们把vendor下创建一个Study的目录,然后再Study创建一个test1的目录,tree如下:

我们的目标是把test.c编译成一个静态库

test.c代码如下:

#include <stdio.h>int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}

Android.bp代码如下:

cc_library_static {name: "test3",srcs: ["test.c"],
}

编译方法:

方法1:在android 跟目录下敲指令:make test3

方法2:在vendor/Study/test3目录下敲指令mm

注意:两个方法都需要先source build/envsetup.sh -> lunch选择41

test.a生成在out/target/product/rk3399_roc_pc_plus/obj_arm/STATIC_LIBRARIES/test3_intermediates/test3.a

NOTED:我们发现生成的并不是libtest3.a,而是test3.a,这个要注意下

其中cc_library_static就是编译成c/c++ 静态库,可以有以下类型

name就是模组的名称

srcs就是源文件

2.编译动态库

首先我们把vendor下创建一个Study的目录,然后再Study创建一个test2的目录,tree如下:

我们的目标是把test.c编译成一个静态库

test.c代码如下:

#include <stdio.h>int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}

Android.bp代码如下:

cc_library_shared {name: "test4",srcs: ["test.c"],
}

编译方法:

方法1:在android 跟目录下敲指令:make test4

方法2:在vendor/Study/test4目录下敲指令mm

注意:两个方法都需要先source build/envsetup.sh -> lunch选择41

test.so生成在out/target/product/rk3399_roc_pc_plus/obj_arm/SHARED_LIBRARIES/test4_intermediates/test4.so

NOTED:我们发现生成的并不是libtest4.so,而是test4.so,这个要注意下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477671.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker安装使用Elasticsearch,解决启动后无法访问9200问题

1.docker安装、启动es docker pull elasticsearch:8.13.0docker images启动容器 docker run -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" --name es01 8ebd258614f1-d 后台运行-p 9200:9200 -p 9300:9300 开放与主机映射端口-e ES_JAVA_OPTS…

揭秘云计算 | 5、关于云计算效率的讨论

一、 公有云效率更高&#xff1f; 解&#xff1a;公有云具有更高的效率。首先我们需要知道效率到底指的是什么。这是个亟须澄清的概念。在这里效率是指云数据中心&#xff08;我们将在后文中介绍其定义&#xff09;中的IT设备资源利用率&#xff0c;其中最具有代表性的指标就是…

【终端美化】Ubuntu 下 Zsh 与 Oh-My-Zsh 美化与插件配置指南

目录 1. 检查是否已安装 zsh2. 安装 zsh3. 设置 zsh 为默认 Shell4. 安装 oh-my-zsh4.1 使用 curl 安装4.2 使用 wget 安装&#xff08;如果 curl 不可用&#xff09;4.3 迁移 Bash 自定义配置到 Zsh打开Files并显示隐藏文件复制需要的配置内容粘贴到 Zsh 配置文件保存并关闭文…

Spring Boot与MyBatis-Plus的高效集成

Spring Boot与MyBatis-Plus的高效集成 引言 在现代 Java 开发中&#xff0c;MyBatis-Plus 作为 MyBatis 的增强工具&#xff0c;以其简化 CRUD 操作和无需编写 XML 映射文件的特点&#xff0c;受到了开发者的青睐。本篇文章将带你一步步整合 Spring Boot 与 MyBatis-Plus&…

html+js实现图片的放大缩小等比缩放翻转,自动播放切换,顺逆时针旋转

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片预览</title><sty…

【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)

本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步&#xff0c;获取页面内容\*- 第二步&#xff1a;解析并获取单个项目链接 \*- 第三步&#xff1a;获取子页面内容 \*- 第四步&#xff1a;解析…

SpringBoot多文件上传

多文件上传是在单文件上传的基础上修改而来&#xff0c;不了解单文件上传可以参考上一篇。以下在将修改部分展示如下&#xff1a; 一、修改upload.html文件&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title&g…

[RabbitMQ] 重试机制+TTL+死信队列

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Prometheus结合K8s(二)使用

上一篇介绍了如何搭建 Prometheus结合K8s&#xff08;一&#xff09;搭建-CSDN博客&#xff0c;这章介绍使用 页面访问 kubectl get svc -n prom 看promeheus和granfana的端口访问页面 Prometheus 点击status—target&#xff0c;可以看到metrics的数据来源&#xff0c;即各…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-05

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-05 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-05目录1. LLM App Squatting and Cloning2. Improving Grapheme-to-Phoneme Conversion through In-Context Knowledge3. A Comp…

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法&#xff0c;以及通过理论课学习与实验参考书的帮助&#xff0c;熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作&#xff1b;作为后续实验的基础&#xff0c;根据实验要求重…

LDR6020驱动的Type-C接口显示器解决方案

一、引言 随着科技的飞速发展&#xff0c;Type-C接口凭借其高速数据传输、强大的电力传输能力以及便捷的正反可插设计&#xff0c;正逐渐成为现代电子设备的主流接口标准。在显示器领域&#xff0c;Type-C接口的引入不仅简化了线缆连接&#xff0c;还为用户带来了更丰富的功能…

Spring |(四)IoC/DI配置管理第三方bean

文章目录 &#x1f4da;数据源对象管理&#x1f407;环境准备&#x1f407;实现Druid管理&#x1f407;实现C3P0管理 &#x1f4da;加载properties文件&#x1f407;第三方bean属性优化&#x1f407;读取单个属性 学习来源&#xff1a;黑马程序员SSM框架教程_SpringSpringMVCMa…

三十一、构建完善微服务——API 网关

一、API 网关基础 系统拆分为微服务后&#xff0c;内部的微服务之间是互联互通的&#xff0c;相互之间的访问都是点对点的。如果外部系统想调用系统的某个功能&#xff0c;也采取点对点的方式&#xff0c;则外部系统会非常“头大”。因为在外部系统看来&#xff0c;它不需要也没…

(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在大学生在线计算机类专业考研学习网站管理的要求下&#xff0c;开发一…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

Linux各种并发服务器优缺点

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点&#xff0c;具体函数的实现并不介绍。 1. 无并发C/S模型 创建服务器流程分析&#xff1a; socket()创建服务器的监听套接字bind()将服务器给服务器的监听套接字绑定IP地址和Port端口号listen()设置…

基于AXI PCIE IP的FPGA PCIE卡示意图

创作不易&#xff0c;转载请注明出处&#xff1a;https://blog.csdn.net/csdn_gddf102384398/article/details/143926217 上图中&#xff0c;在FPGA PCIE卡示意图内&#xff0c;有2个AXI Master设备&#xff0c;即&#xff1a;PCIE到AXI4-Full-Master桥、AXI CDMA IP&#xff1…

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮助企业实现供应商关系管理和采购线上化、移动化、智能…

el-table-column自动生成序号在序号前插入图标

实现效果&#xff1a; 代码如下&#xff1a; 在el-table里加入这个就可以了&#xff0c;需要拿到值可以用scope.$index ​​​​​​​<el-table-column type"index" label"序号" show-overflow-tooltip"true" min-width"40">…