IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android_rust分析 -> 正文阅读

[移动开发]android_rust分析

一、android_rust 简介

项目地址https://android.googlesource.com/toolchain/android_rust

android_rust是一个为安卓环境编译rust的项目,这个项目本身使用python写成,通过执行build.py,使用自带的工具去完成rust的编译,最终还是调用了rust本身的x.py。在我们为RISC-V架构的安卓移植rust前,我们首先对这个项目进行分析。

二、项目文件分析

首先查看该项目的结构?

  • patches存放了最新的补丁
  • templates 存放了需要的工具的wrapper

?

1. build.py

build.py是该项目的入口,有一个函数get_host_tag()。该函数将获得host的系统平台,使用sys.platform.startwitch()检测系统版本。如果sys.platform以linux开头,则默认host为linux-x86。否则如果以darwin开头,则默认host为darwin-x86。如果都不是,则抛出错误’Unsupported host’。将python_bin赋值为对应平台的python路径,创建一个新的子进程,用其中包含的python执行do_build.py.

2. do_build.py

STDLIB_SOURCES定义了需要的标准库

LLVM_BUILD_PATHS_OF_INTEREST?

parse_args() 如注释所示,这个函数用来解析输入的参数

main() 函数的主程序

首先创建三个文件夹: OUT_PATH, OUT_PATH_PACKAGE和OUT_PATH_WRAPPERS

这三个常量的定义在paths.py

实际上,

OUT_PATH 在工作目录下创建一个新的文件夹out

OUT_PATH_PACKAGE 在out文件夹里创建一个新的文件夹package

OUT_PATH_WRAPPERS在out文件夹里创建一个新的文件夹wrappers

dist_dir = os.environ.get(‘DIST_DIR’) 获取系统中的$DIST_DIR环境变量

如果$DIST_DIR存在,则解析这个目录,否则在工作目录创建一个dist文件夹

执行source_manger.setup_files函数

此函数位于source_manager.py中,函数setup_files仅在此处被调用

函数 setup_files的声明部分如下

有四个参数,input_dir, output_dir和patches_dir为Path类型,no_patch_abort默认为False。根据注释,此函数用来应用补丁文件,如果补丁应用成功,则重命名输出目录。

清理无用的临时目录

如果目录存在,则清理该目录

如果目录不存在,则建立目录

根据系统类型调用不同的命令,创建一份rust源码的拷贝

调用函数apple_patches给源码打补丁

应用补丁的过程如下,在此不过多叙述

回到do_build.py

设置rust环境

子线程调用x.py –help,用来生成cargo config

调用cargo去获取离线包,重新生成lockfile

执行编译动作,如果遇到错误,报错并退出

如果在linux环境下,移除已存在的OUT_PATH_STDLIB_SRCS并重新拷贝

对二进制文件进行strip操作,这个操作可以为库文件瘦身,减小占用的容量

安装libc++库到out/package/lib64/

过滤Android.mk和Android.bp文件

3. config.py

在do_build.py中调用了config.configure(args, env),这个函数存在于config.py中,因此在这里单独解析

首先是函数声明部分,然后设置编译器/连接器的参数

如果在darwin平台下,寻找系统目录

把linker的设置连接起来

处理$,设置device_linker_flags

更新环境变量

在linux系统中,调整目录

设置一些其他路径和arguments

设置环境和其他目录

此处的host_configs()

实际上生成了host的cc,cxx,linker的wrapper

device_config()

实际上生成了device的cc,cxx和linker的wrapper

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:57:51  更:2021-11-26 09:00:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:07:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码