当前位置: 首页 > news >正文

Android源码Aosp环境搭建

一编译的目的是运行,看源码可以先不用学会编译

二AOSP编译后的产物

  1. 直接编译产物‌:编译完成后,out/target/product/对应设备目录下会生成多个独立的镜像文件,包括boot.imgsystem.imgrecovery.imguserdata.imgramdisk.img等,这些是可直接通过fastboot刷入设备的基础镜像。
  2. ROM包是直接编译产物的二次加工:我们日常所说的可卡刷的ROM(通常是update.zip格式),需要在这些基础镜像的基础上,手动添加刷机脚本META-INF目录、整理系统文件结构,经过二次打包才能得到完整的ROM刷机包。

‌三编译产物运行在不同的系统

一、AOSP编译产物在Ubuntu上的运行情况

AOSP编译出的x86_64架构目标镜像,‌可以直接在Ubuntu系统自带的Android模拟器中运行‌,无需额外刷入实体设备。你只需在Ubuntu编译环境中执行emulator命令,就能启动模拟器加载编译好的AOSP系统镜像,完成系统调试与验证。

二、Qt编译产物的跨平台运行情况

  1. Linux系统‌:Qt本身原生支持Linux全系列发行版,只要目标Linux系统中安装了对应版本的Qt运行时库,或通过静态编译、linuxdeployqt工具打包好依赖库,编译出的Qt程序就可以直接在Ubuntu等Linux系统上正常运行。
  2. OpenHarmony系统‌:Qt官方已提供Qt for HarmonyOS适配方案,需先获取对应版本的Qt鸿蒙适配源码完成交叉编译,生成适配OpenHarmony架构的可执行程序,即可在OpenHarmony设备上运行,开发过程需搭配DevEco Studio环境完成适配配置。

四为什么aosp在ubantu上更友好,而不是centos

AOSP在Ubuntu上的开发体验比CentOS更友好,核心原因集中在官方支持、依赖生态、社区资源三个维度:

一、官方原生适配差异
谷歌官方推荐‌:AOSP官方文档从早期版本开始,就将Ubuntu列为唯一推荐的桌面级Linux开发系统,所有编译脚本、环境配置逻辑都是优先针对Ubuntu做适配,没有针对CentOS做原生兼容校验。
版本匹配度高‌:不同版本的AOSP都有明确对应的Ubuntu LTS版本要求,从Android 6.0适配Ubuntu 14.04,到Android 12适配Ubuntu 22.04,版本对应关系清晰,几乎不会出现系统版本和编译脚本不兼容的问题。
二、依赖包安装便捷度差异
Ubuntu包源覆盖全‌:Ubuntu的apt源直接内置了AOSP编译所需的几乎所有依赖包,包括git、gnupg、flex、bison、gcc-multilib等,一条apt install命令就能批量完成安装,无需手动编译源码。
CentOS依赖适配难‌:CentOS的yum源默认缺少大量AOSP编译必需的依赖包,部分32位兼容库、旧版本Python、JDK等组件需要手动添加第三方源,甚至要从源码自行编译,极易出现版本冲突问题。
三、社区与资源生态差异
踩坑资料丰富‌:全球绝大多数AOSP开发者都使用Ubuntu做编译环境,网上有大量针对不同AOSP版本的避坑指南、环境配置教程,遇到问题可以快速找到现成解决方案。
CentOS资料稀缺‌:使用CentOS编译AOSP的开发者占比极低,遇到依赖缺失、脚本报错等问题时,几乎找不到对应的公开参考方案,排错成本会大幅提升。

五qt是更适合在ubantu上运行还是centos

综合你之前关注的AOSP编译环境适配、Qt跨系统运行的相关需求,Qt在‌桌面开发场景下Ubuntu的适配体验更优‌,而服务器部署场景下CentOS会更稳妥,两者的适配差异主要体现在这些维度:

一、硬件与调试体验
Ubuntu‌:新版Ubuntu 24可以完美适配各类新硬件,网卡、声卡、显卡都能被系统直接识别,Qt的调试过程流畅稳定,不会出现卡顿问题。
CentOS‌:在物理机上安装时,新硬件的驱动适配难度很高,即便升级内核也可能出现网卡、显卡无法识别的问题,仅在虚拟机环境下Qt调试才能保持正常。
二、依赖与安装便捷度
Ubuntu‌:官方APT源内置了Qt开发所需的几乎全部依赖库,一条命令就能完成全量环境部署,新手几乎不会遇到依赖缺失的问题。
CentOS‌:默认YUM源缺少部分Qt必需的依赖组件,需要手动启用EPEL第三方源,部分高版本Qt还需要自行编译依赖,配置门槛更高。
三、适用场景差异
Ubuntu‌:更适合日常Qt桌面开发、代码调试、UI界面迭代的场景,开发效率更高。
CentOS‌:更适合Qt服务端程序的生产部署场景,系统稳定性更强,长期运行的安全维护周期更长。
四、跨版本兼容性

两者都支持Qt程序的正常编译运行,但要注意不同系统的glibc版本差异,直接在高版本系统编译的Qt程序,可能在低版本系统上出现运行崩溃的问题,需要针对性调整编译策略。

六C++ 代码在标准 Linux(如 Ubuntu/CentOS)上编译出的二进制文件,确实无法直接在 OpenHarmony 上运行。

你的理解‌基本正确,但需要更精确地界定“不能运行”的原因‌。

简单来说:C++ 代码在标准 Linux(如 Ubuntu/CentOS)上编译出的二进制文件,确实无法直接在 OpenHarmony 上运行。这并非因为 C++ 语言本身有问题,而是因为 ‌OpenHarmony 的底层系统环境(用户态)与标准 GNU/Linux 存在本质差异‌。

这种差异主要体现在以下三个核心维度,导致原本在 Linux 上正常的编译产物在 OpenHarmony 上失效:

1. C 标准库不同:musl libc vs glibc

这是最核心的障碍。

标准 Linux‌:绝大多数发行版使用 ‌glibc‌ (GNU C Library)。你在 Ubuntu 上编译程序时链接的是 glibc。
OpenHarmony‌:使用的是 ‌musl libc‌。
后果‌:glibc 和 musl libc 的二进制接口(ABI)不兼容。即使代码逻辑完全一样,在 glibc环境下编译出的 .so 或可执行文件,放到 musl 环境中会因找不到符号或结构体布局不同而崩溃。因此,必须针对 OpenHarmony 的环境重新交叉编译。
2. 编译工具链与目标三元组不同
标准 Linux‌:通常使用 gcc 或 clang,目标三元组类似 x86_64-linux-gnu 或 aarch64-linux-gnu。
OpenHarmony‌:官方推荐使用基于 LLVM 的 ‌毕昇编译器‌ 或特定配置的 Clang,目标三元组明确指定为 aarch64-linux-ohos 或 arm-linux-ohos。
后果‌:编译器需要知道目标系统是 OHOS,以便生成符合该系统调用规范和 ABI 要求的机器码。直接用 Linux 的 gcc 编译出来的指令可能包含 OHOS 内核不支持的系统调用或错误的头文件引用。
3. 系统内核与接口的细微差异

虽然 OpenHarmony(社区版)底层也是 Linux 内核,但它是一个“去 GNU 化”的系统:

系统调用行为差异‌:例如 mmap 后文件描述符的处理、信号机制(不支持 STOP/COREDUMP 等)、进程优先级调度策略等,OHOS 与标准 Linux 存在实现细节上的不同。
驱动框架不同‌:OHOS 使用 HDF (Hardware Driver Foundation) 驱动框架,而非标准的 Linux 驱动模型,涉及硬件交互的 C++ 库必须适配这一层。
动态加载机制‌:dlopen 等动态库加载行为在 OHOS 中有特定的安全限制和管理机制,直接移植 Linux 的动态库加载逻辑可能会失败。
总结:为什么要“适配”?

所谓“适配三方库”,本质上就是‌解决上述环境差异的过程‌:

重新编译‌:使用 OHOS 专用的交叉编译工具链(针对 musl libc 和 ohos 目标),将源码重新编译成能在 OHOS 上运行的二进制文件。
修改构建脚本‌:将原本的 Makefile 或 CMakeLists.txt 适配到 OHOS 的构建系统(如 GN 或 lycium 工具),确保依赖路径、编译参数正确。
代码级修正‌:如果库中调用了 Linux 特有但 OHOS 不支持的 API(如某些特殊的 /proc 文件读取、glibc 特有扩展函数),需要修改 C++ 源码,替换为 OHOS 支持的等效实现或 POSIX 标准接口。

结论‌:
并不是 C++ 语言在 OpenHarmony 上“不能编译运行”,而是‌为 GNU/Linux 环境编译好的二进制产物‌不能在 OpenHarmony 上运行。只要使用正确的工具链和配置,针对 OpenHarmony 环境重新编译,C++ 三方库是可以完美运行的。

http://www.cnnetsun.cn/news/3809183.html

相关文章:

  • 射频电路设计:0-360°连续可调反射型移相器实现与调试指南
  • SCD41三合一环境传感器:NDIR原理、Arduino驱动与物联网应用实战
  • SFTPGo部署与配置全攻略:从Docker到系统包安装
  • UHF RFID技术在电动车智能管理中的应用与实践
  • AI写作优化:去除机械感提升内容流量的实用技巧
  • 颠覆认知!无需篡改请求,仅拦截响应即可实现验证码劫持(附仿真实验)
  • 基于开源LLM与TTS技术搭建AI内容直播流:从Claude FM到本地模拟实现
  • 5分钟快速上手Ship of Harkinian:在现代PC上重温塞尔达时之笛的终极指南
  • 天津 GEO 优化是做什么的?面向本地企业的 AI 生成式引擎优化落地解析
  • 3个技术突破:如何用GHelper轻量级工具解决华硕笔记本硬件控制痛点
  • RAGflow 深度实践:从零构建私有知识库的完整指南
  • Codex Agent 进阶指南:线程上下文与 Skill 机制解锁 AI 编程助手
  • Python实战临床预测模型:三天掌握数据清洗、逻辑回归与模型评估全流程
  • 上下文管理——Agent 的「工作记忆」
  • 使用Cheat Engine修改《植物大战僵尸》游戏数据的完整指南
  • AIGC检测到底准不准?2026年主流检测系统深度实测
  • Spring框架核心原理与实战技巧详解
  • 5步搞定Windows安卓应用安装:APK Installer新手完全指南
  • 终极Zotero插件市场指南:在Zotero内部一站式管理所有插件
  • KEGG通路富集分析可视化:气泡图与桑基图组合方案详解
  • AI自动生成Git Commit信息:提升团队协作效率
  • 直播带货选品策略:视觉化改造与场景化包装
  • 太阳能充电器扩展板设计全解析:从MPPT到锂电池安全供电
  • UE5 GameFeature插件系统详解:Lyra框架的模块化设计与实战配置
  • Java反射、枚举与Lambda表达式核心技术解析
  • C# WinForm数据持久化实战:从JSON到SQLite的架构设计与实现
  • Excel VLOOKUP进阶:用COLUMN与MATCH实现动态列引用与智能匹配
  • 开源机器人Reachy Mini:模块化设计与ROS开发实践指南
  • Python机器学习全流程:从环境配置到生产部署
  • SpringBoot3+Vue3酒店管理系统全栈开发实战