Android14之Android Rust模块编译语法(一百八十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Android14之Android Rust模块编译语法

2.Android Rust介绍

  • Android Rust是一个开源项目,旨在将Rust编程语言集成到Android应用开发中。Rust是一种系统编程语言,注重安全、性能和并发性,而Android是一个广泛使用的移动操作系统,主要由Java和Kotlin编程语言支持。Android Rust项目的目标是为Android开发者提供一种新的编程选择,以提高应用的安全性和性能。
  • Rust编程语言具有许多优点,例如零成本抽象、内存安全、所有权模型和异步编程。这些特性使得Rust成为Android应用开发的理想选择,因为它们可以帮助开发者编写更安全、更高效的代码。零成本抽象意味着Rust提供了高级抽象,而不需要牺牲性能。内存安全是指Rust编译器会检查内存使用,以防止内存泄漏和越界访问等问题。所有权模型可以帮助开发者更好地管理内存和资源,而异步编程可以提高应用的响应性和性能。
  • Android Rust项目提供了一套工具和库,以支持在Android平台上使用Rust编程语言。这些工具和库包括Rust编译器、Android NDK(Native Development Kit)集成、CMake构建系统和Rust交叉编译工具链。这些工具和库可以帮助开发者轻松地将Rust代码集成到Android应用中。
  • 为了使用Android Rust进行开发,首先需要安装Rust和Android SDK。然后,可以使用Rust编译器交叉编译Android平台上的Rust代码。接下来,可以使用Android NDK将Rust代码与C/C++代码集成,以便在Android应用中使用原生代码。最后,可以使用CMake构建系统来配置和构建Android应用。
  • Android Rust项目还提供了一些示例和教程,以帮助开发者开始使用Rust进行Android应用开发。这些示例涵盖了各种不同的场景,例如渲染图像、处理音频和网络通信等。通过这些示例和教程,开发者可以更好地了解如何使用Rust编程语言在Android平台上实现不同的功能。
  • 总之,Android Rust是一个令人兴奋的新项目,它将Rust编程语言引入Android应用开发领域。通过使用Rust,Android开发者可以编写更安全、更高效的代码,并充分利用Rust的各种特性。随着Android Rust项目的不断发展,我们期待看到更多使用Rust编写的Android应用出现。

Android Rust模块编译语法实例

3.Rust 二进制文件的模块定义示例

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

4.基本模块类型

在这里插入图片描述

5.重要的通用属性

name

name 是模块的名称。与其他 Soong 模块一样,此名称必须在大多数 Android.bp 模块类型中具有唯一性。
默认情况下,name 被用作输出文件名。如果输出文件名必须与模块名称不同,使用 stem 属性定义输出文件名。

stem

stem(可选)直接控制输出文件名(不包括文件扩展名和其他后缀)。
例如,stem 值为 libfoo 的 rust_library_rlib 库会生成一个 libfoo.rlib 文件。如果没有为 stem 属性提供值,输出文件名将默认采用模块名称。

无法将模块名称设置为所需的输出文件名时,请使用 stem 函数。
举例而言,假设因为已经存在一个 liblog cc_library,log crate 的 rust_library 被命名为 liblog_rust。
在这种情况下,使用 stem 属性可以确保输出文件被命名为 liblog.* 而不是 liblog_rust.*。

srcs

srcs 包含代表模块入口点的单个源代码文件(通常是 main.rs 或 lib.rs)。
rustc 负责解析和发现编译所需的所有其他源代码文件,生成的 deps 文件中将列举这些文件。

crate_name

crate_name 通过 rustc --crate_name 标志设置 crate 名称元数据。
对于会生成库的模块,此属性必须与源代码中预期使用的 crate 名称相匹配。
例如,如果源代码中以 extern crate foo_bar 的形式引用模块 libfoo_bar,那么此属性就必须为 crate_name: "foo_bar"。

此属性对所有 rust_* 模块都是通用的,但是对于会生成 Rust 库的模块(例如 rust_library、rust_ffi、rust_bindgen、rust_protobuf 和 rust_proc_macro)是必需的。这些模块强制执行有关 rustc 与输出文件名之间关系的 crate_name 要求。

lints

默认情况下,系统会针对除源代码生成器外的所有模块类型运行 rustc linter。目前定义了一些 lint 集,并用其验证模块源代码。此类 lint 集可能的值如下所示:

default(默认的 lint 集,具体视模块位置而定)
android(应用于所有 Android 平台代码的最严格的 lint 集)
vendor(应用于供应商代码的宽松 lint 集)
none(用于忽略所有 lint 警告和错误)

clippy_lints

默认情况下,系统还会针对除源代码生成器外的所有模块类型运行 clippy linter。目前定义了几个 lint 集,用于验证模块源代码。下面列出了一些可能的值:

default(默认的 lint 集,具体视模块位置而定)
android(应用于所有 Android 平台代码的最严格的 lint 集)
vendor(应用于供应商代码的宽松 lint 集)
none(用于忽略所有 lint 警告和错误)

edition

edition 定义用于编译此代码的 Rust 版本。此属性与 C 和 C++ 标准的版本类似。有效的值为 2015 和 2018(默认值)。

flags

flags 包含一个字符串列表,列出了要在编译期间传递给 rustc 的标志。

ld_flags

ld-flags 包含一个字符串列表,列出了要在编译源代码时传递给链接器的标志。
这些标志通过 -C linker-args rustc 标志传递。clang 用作链接器前端,为实际链接调用 lld。

features

features 是在编译期间必须启用的功能的字符串列表。此属性通过 --cfg 'feature="foo"' 传递给 rustc。
由于大多数功能可以累加使用,因此在许多情况下,此属性包括所有相关模块所需的全套功能。
过,如果功能互斥,请在任何提供了冲突功能的构建文件中定义其他模块。

cfgs

cfgs 包含一个字符串列表,列出了要在编译期间启用的 cfg 标志。此属性通过 --cfg foo 和 --cfg "fizz=buzz" 传递给 rustc。

构建系统会在特定情况下自动设置某些 cfg 标志,如下所列:

作为 dylib 构建的模块将设置 android_dylib cfg。
将使用 VNDK 的模块将设置 android_vndk cfg。这类似于 C++ 中的 __ANDROID_VNDK__ 定义。

strip

strip 用于控制是否剥离以及如何剥离输出文件中的内容(如果适用)。
如果未设置此属性,设备模块将默认剥离除 mini debuginfo 外的所有内容。
默认情况下,主机模块不会剥离任何符号。有效值包括用于停用剥离的 none,以及用于剥离所有内容(包括 mini debuginfo)的 all

host_supported

对于设备模块,host_supported 参数用于指示该模块是否也应该提供主机变体。

``

6.定义库依赖项

在这里插入图片描述

关联到 Rust 库时,除非有特定原因,否则最佳做法是使用 rustlibs 属性而不是使用 rlibs 或 dylibs。这样,构建系统就可以根据根模块所需选择正确的关联,而且依赖项树同时包含库的 rlib 和 dylib 版本(这种情况会导致编译失败)的可能性也会降低。

7.不支持和支持有限的构建功能

Soong 的 Rust 对 vendor 和 vendor_ramdisk 映像与快照提供有限支持,但支持 staticlibs、cdylibs、rlibs 和 binaries。
对于供应商映像构建目标,已设置了 android_vndk cfg 属性。如果系统目标和供应商目标之间存在差异,您可以在代码中使用此属性。
rust_proc_macros 不会作为供应商快照的一部分捕获;如果依赖于这些宏,请确保对其进行适当的版本控制。

不支持产品映像、VNDK 和恢复映像。

8.增量构建

  • 开发者可以通过将 SOONG_RUSTC_INCREMENTAL 环境变量设置为 true 来启用 Rust 源代码的增量编译。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日CV 计算机视觉论文速览 第298期】Fri, 26 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 26 Jan 2024 Totally 71 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities Authors Yiyuan Zhang, Xiaohan …

springboot登录校验

一、登录功能 二、登录校验 2.1 会话技术 2.2 JWT令牌 JWT令牌解析: 如何校验JWT令牌?Filter和Interceptor两种方式。 2.3 过滤器Filter 2.3.1 快速入门 修改上述代码: 2.3.2 详解 2.3.3 登录校验-Filter 2.4 Interceptor拦截器 2.4.1 …

Ps:创建联系表

Ps菜单:文件/自动/联系表 II Automate/Contact sheet II Photoshop 的“联系表 II” Contact Sheet II命令为快速生成图像集合的预览和打印目录提供了一种高效的方法。 此命令可以通过自动化过程读取指定的图像文件,然后根据用户定义的参数(如…

【C++关联式容器】unordered_set

目录 unordered_set 1. 关联式容器额外的类型别名 2. 哈希桶 3. 无序容器对关键字类型的要求 4. Member functions 4.1 constructor、destructor、operator 4.1.1 constructor 4.1.2 destructor 4.1.3 operator 4.2 Capacity ​4.2.1 empty 4.2.2 size 4.2.3 max…

人工智能时代

一、人工智能发展历史:从概念到现实 人工智能(Artificial Intelligence,简称AI)是计算机科学领域中一门旨在构建能够执行人类智能任务的系统的分支。其发展历程充满曲折,从概念的提出到如今的广泛应用,是技术、理论和实践相互交织的产物。 1. 起源(20世纪中期) 人工智…

代码随想录算法训练营Day27|回溯算法·组合总和、组合总和II、分割回文串

组合总和 class Solution{ private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates,int target,int sum,int startIndex){if(sum > target){return;}if(sum target){result.push_back(path);return;}…

混合键合(Hybrid Bonding)工艺解读

随着半导体技术的持续演进&#xff0c;传统的二维芯片缩放规则受到物理极限的挑战&#xff0c;尤其是摩尔定律在微小化方面的推进速度放缓。为了继续保持计算性能和存储密度的增长趋势&#xff0c;业界开始转向三维集成电路设计与封装技术的研发。混合键合技术就是在这样的背景…

【前端实战小项目】学成在线网页制作

文章目录 1.项目准备1.1 项目目录 2.头部区域2.1 头部区域布局2.2 logo制作2.2 导航制作技巧(nav)2.3搜索区域(search)2.3用户区域(user区域) 3.banner区域3.1 总体布局3.2 左侧侧导航(left)3.3 右侧课程表(left) 4.精品推荐区域(recommend)5.精品课程( course)6.前端开发工程师…

MySQL数据库基础(二):MySQL数据库介绍

文章目录 MySQL数据库介绍 一、MySQL介绍 二、MySQL的特点 三、MySQL版本 四、MySQL数据库下载与安装 1、下载 2、安装 五、添加环境变量&#xff08;Windows&#xff09; 六、检测环境变量是否配置成功 MySQL数据库介绍 一、MySQL介绍 MySQL是一个关系型数据库管理…

【Java多线程案例】定时器

1. 定时器简介 定时器&#xff1a;想必大家一定对定时器这个概念不陌生&#xff01;因为它经常出现在我们的日常生活和编程学习中&#xff0c;定时器就好比是一个"闹钟"&#xff0c;会在指定时间处理某件事&#xff08;例如响铃&#xff09;&#xff0c;而在编程世界…

【微服务】skywalking自定义告警规则使用详解

目录 一、前言 二、SkyWalking告警功能介绍 2.1 SkyWalking告警是什么 2.2 为什么需要SkyWalking告警功能 2.2.1 及时发现系统异常 2.2.2 保障和提升系统稳定性 2.2.3 避免数据丢失 2.2.4 提高故障处理效率 三、 SkyWalking告警规则 3.1 SkyWalking告警规则配置 3.2 …

春节结束后如何收心工作?

一、春节结束后的工作准备 春节假期结束后&#xff0c;迎来了新的工作季。在开始新的工作之前&#xff0c;首先需要对即将展开的工作进行充分的准备。整理和清理工作区域&#xff0c;给自己一个干净整洁的工作环境。检查和更新工作日程&#xff0c;确保未来一段时间的工作规划…

删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标

在安装诸如WPS软件、百度云盘、爱奇艺等客户端后&#xff0c;Windows 的“我的电脑”&#xff08;或“此电脑”&#xff09;中的“设备和驱动器”部分会出现对应的软件图标。这种情况被许多技术人员视为不必要的干扰&#xff0c;因此许多用户想要知道如何隐藏或删除这些图标。 …

关于保存int型变量进int型数组的做法

如何保存int型变量进int型数组呢&#xff0c;大家先来看看我写的这串代码&#xff1a; #include <bits/stdc.h>using namespace std; int main(){int n;cin >> n;int num;vector<int>a;for (int i 1;i<n;i){cin >> num;if(num % 2 ! 0){a.push_ba…

装饰工程|装饰工程管理系统-项目立项子系统的设计与实现|基于Springboot的装饰工程管理系统设计与实现(源码+数据库+文档)

装饰工程管理系统-项目立项子系统目录 目录 基于Springboot的装饰工程管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;2&#xff09;合同报价管理 &#xff08;3&#xff09;装饰材料总计划管理 &#xff08;4&#xff0…

java排课管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java排课管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&#…

如何将字体添加到 ONLYOFFICE 文档服务器 8.0

作者&#xff1a;VincentYoung 阅读本文&#xff0c;了解如何为自己的在线办公软件 ONLYOFFICE 文档服务器的字体库添加字体 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书…

PR:时间重映射

做一个变换视频速度的效果 原片如下&#xff1a; 现在将跑步的人中间一段加速&#xff0c;后面一段减速 操作如下&#xff1a; 此处点击关键帧时&#xff0c;可以用钢笔工具&#xff0c;也可以按住Ctrl键点击 操作后效果如下&#xff1a;

python-分享篇-五子棋

文章目录 代码效果 代码 """五子棋之人机对战"""import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, offset, PointSIZE 3…

计算机设计大赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…