| |
|
开发:
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前,我们首先对这个项目进行分析。 二、项目文件分析 首先查看该项目的结构?
? 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 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |