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

Project Treble和HAL架构

一. 传统的 Android 架构(Treble 之前)

在深入 Treble 之前,我们先看看传统的 Android 架构,这有助于理解 Treble 要解决的问题

传统的 Android 系统更新流程非常缓慢,其核心原因在于高度耦合的架构

  • Android 操作系统框架 (Android OS Framework): 由 Google 开发,包含 App Runtime、系统服务等
  • 硬件抽象层 (HAL): 一系列由芯片制造商(如 Qualcomm, Mediatek)或设备制造商(OEM)实现的库(.so 文件)。这些库为 Android 框架提供标准接口来访问设备特定的硬件驱动,例如 camera.hal.soaudio.hal.so
  • Linux 内核 (Linux Kernel): 包含硬件驱动程序,由芯片制造商提供
问题所在:

在传统架构中,Android 框架 和 HAL 是紧密耦合的。框架直接调用 HAL 的特定版本(通过dlopendlsym动态加载 HAL 库)。这意味着:

  1. 当 Google 发布新版本的 Android(例如从 Android 8.0 升级到 9.0)时,它可能包含对 HAL 接口的修改
  2. 芯片制造商(SoC vendors)必须修改他们的 HAL 实现来适配新的框架
  3. 然后设备制造商(OEMs)需要整合这个新的 SoC 方案和新的 Android 版本
  4. 最后,运营商(Carriers)再进行各自的认证测试。
    这个过程漫长而繁琐,导致绝大多数设备无法及时获得系统更新

二. Project Treble 的引入

为了解决上述问题,Android 8.0 (Oreo) 引入了 Project Treble。它的核心目标是 将 Android 系统框架与设备专用的底层软件(Vendor Implementation)分离开来,从而实现框架可以独立于供应商实现进行更新

Treble 的核心变革:引入 Vendor Interface (VINTF)

Treble 在 Android 框架和 HAL 之间定义了一个稳定的、版本化的接口契约,称为 Vendor Interface (VINTF)

这个接口就像一份“合同”,它规定:

  • Android 框架: 承诺只通过 VINTF 中定义的标准方法来请求硬件服务
  • 供应商实现(Vendor Implementation): 承诺按照 VINTF 的规范来提供硬件服务,并且只要满足接口规范,其内部实现可以任意修改

这样,只要供应商提供的 HAL 符合 VINTF 规范,新版 Android 框架就可以直接在其上运行,而无需供应商为每个 Android 版本重新编写或修改 HAL

三. Treble 下的 HAL 架构

Project Treble 不仅定义了一个接口,还重新架构了 HAL 的实现和通信方式。主要有以下几种 HAL 类型:

1)直通式 HAL (Passthrough HAL) - 过渡方案
  • 为了向后兼容旧的 HAL(用 C/C++ 实现),Treble 初期支持这种模式
  • 工作原理: 一个包装器 HAL(符合新 HIDL 接口)通过 dlopen 动态加载旧的传统 HAL 库。它只是将调用“直通”给旧 HAL
  • 现状: 现已不推荐使用,仅用于从旧架构过渡
2)绑定式 HAL (Binderized HAL) - Treble 的未来

这是 Treble 的现代标准模式

  • 工作原理
    ① HAL 被实现为一个独立的进程(Vendor Process),在设备启动时运行
    ② Android 框架进程(Framework Process)通过 HIDL 或 AIDL 接口定义语言描述的 RPC(远程过程调用)机制与 HAL 进程进行 IPC(进程间通信)
  • 优势
    ○ 稳定性: HAL 进程崩溃不会导致整个系统崩溃
    ○ 安全性: 每个 HAL 进程都在自己的沙盒(SELinux 域)中运行,权限受到严格控制
    ○ 解耦: 框架和 HAL 完全分离,实现了 Treble 的核心目标
HAL 接口定义语言:HIDL 和 AIDL
  • HIDL (HAL Interface Definition Language): Treble 初期引入的专用接口语言,用于描述框架和 Vendor 之间的接口。有 @1.0@1.1@1.2 等版本,支持向后兼容
  • AIDL (Android Interface Definition Language): 原本用于应用和框架之间的通信。从 Android 11 开始,AIDL for HAL 被引入,旨在逐步取代 HIDL。它提供了更好的版本管理、更简单的编程模型,并统一了 Android 的 IPC 生态

四. Treble 的实现组件

  • Vendor Partition: Treble 要求系统必须有一个独立的 /vendor 分区。所有供应商提供的软件(HAL、内核模块、 firmware)都放在这里。这样,/system 分区(包含 Android 框架)可以独立于 /vendor 分区进行更新(例如通过 OTA)
  • Vendor Test Suite (VTS): 类似于 CTS(兼容性测试套件),但用于测试 Vendor Implementation 是否正确地实现了 VINTF 接口。这确保了任何符合 VTS 的 Vendor 实现都能与 Android 框架正确交互,是快速更新的质量保证

总结与对比

特性传统架构 (Pre-Treble)Project Treble 架构
核心问题框架与 HAL 紧密耦合,更新缓慢解决了耦合问题,实现快速更新
接口无明确定义,直接链接Vendor Interface (VINTF),稳定且版本化
HAL 形态作为库被框架进程加载作为独立进程运行(绑定式)
通信方式进程内函数调用IPC(进程间通信),如 HIDL/AIDL
分区无独立 Vendor 分区独立的 /vendor 分区
更新流程需要 SoC 厂商、OEM 等多方协作Google 可单独更新 /system 分区
简单比喻:
  • 传统架构: 就像电源线直接焊死在主板上,要换电源就得动主板
  • Project Treble: 就像定义了一个标准的电源插座(VINTF)。只要插头符合规范,你可以随意更换电源(Vendor Implementation)或主板(Android Framework),它们都能正常工作
最终目标:

Project Treble 通过架构解耦、接口标准化和强制测试,极大地降低了设备制造商为旧设备提供新 Android 版本的难度和成本,从而让更多用户能更快地用上最新的 Android 系统。这也是为什么近年来 Android 手机的系统更新速度和支持周期得到了显著提升的根本原因


文章转载自:

http://Tr0pY2Jw.ntnmL.cn
http://7zCFCQB2.ntnmL.cn
http://lL13ghGV.ntnmL.cn
http://vtmjgzAC.ntnmL.cn
http://QfavWoGa.ntnmL.cn
http://qRaKY45w.ntnmL.cn
http://mlJHgiiH.ntnmL.cn
http://slsXhreW.ntnmL.cn
http://Bp5KcHhI.ntnmL.cn
http://hIzP9SL4.ntnmL.cn
http://myyugFmk.ntnmL.cn
http://T1ATrTBs.ntnmL.cn
http://nbkQRkMb.ntnmL.cn
http://eEiG9WXT.ntnmL.cn
http://Z5ksqCMs.ntnmL.cn
http://QPLfHEtR.ntnmL.cn
http://Nv9sXCHc.ntnmL.cn
http://CuPvufRV.ntnmL.cn
http://INOWmUIO.ntnmL.cn
http://GSIibozs.ntnmL.cn
http://abRWpyir.ntnmL.cn
http://leTQ20hd.ntnmL.cn
http://zx0LAVeR.ntnmL.cn
http://6md3Zm7k.ntnmL.cn
http://KNLDKg3P.ntnmL.cn
http://oZAMk6AN.ntnmL.cn
http://hYPxmySa.ntnmL.cn
http://VYegkr7O.ntnmL.cn
http://pZ4e1o70.ntnmL.cn
http://hd070zh0.ntnmL.cn
http://www.dtcms.com/a/387900.html

相关文章:

  • 【Linux网路编程】传输层协议-----TCP协议
  • dict电子词典
  • pulsar Error receiving messages.Consumer already closed at
  • 计算机视觉(opencv)实战二十五——摄像头动态轮廓识别
  • 简单易懂的Kafka例子
  • 针对tomcat [/usr/lib64:/lib64:/lib:/usr/lib]上找不到基于APR的Apache Tomcat本机库的处理方法
  • 【js】js实现日期转大写:
  • 番茄时钟小程序版本更新记录(v1.0)
  • css消除图片下的白边
  • 我是如何在electron里安装shadcn ui框架的
  • 【图像理解进阶】如何对猫猫的图片进行细粒度分类?
  • JSCPC/GDCPC 2025 J.Puzzle Competition(解谜游戏)
  • SpringMVC 系列博客(三):进阶功能与 SSM 整合实战
  • 电商网站反爬虫机制详解及应对策略
  • 没了CDN与PCDN,网络会怎样?
  • C++中std::vector Vs std::deque VS std::list对比详解
  • RecyclerView实现流式布局
  • 【连载5】C# MVC 异常处理避坑指南:异步操作与静态资源错误解决方案
  • 当控制器无法上网时,如何利用windows笔记本与控制器共享网络?
  • 企业数字化视角下的项目管理软件市场全景分析(2025版)
  • Python异步编程:asyncio.create_task() 用法解析
  • java面试Day1 | redis缓存穿透、击穿、雪崩、持久化、双写一致性、数据过期策略、数据淘汰策略、分布式锁、redis集群
  • Jenkins运维之路(容器项目的优化)
  • 【精品资料鉴赏】363页智慧旅游大数据平台项目建设设计方案
  • 软考 系统架构设计师系列知识点之杂项集萃(149)
  • MyBatis 中注解操作与 XML 映射文件操作的对比
  • 复杂 PDF 文档如何高效解析?
  • 加密网络流量分类
  • leetcode算法题记录:
  • VS安装后通过vswhere.exe查询显示的 installationVersion数字怎么不是2022?