Android VNDK/VSDK Snapshot编译框架

news2024/11/19 17:48:53

1.背景

背景一:

为解决Android版本碎片化问题,引入Treble架构,它提供了稳定的新SoC供应商接口,引入HAL 接口定义语言(HIDL/Stable AIDL,技术栈依然是Binder),它指定了 vendor HAL 和system framework的接口, 解耦system Framework 与Vendor HAL, system/vendor组件功能互相独立,从而使得Vendor Freeze成为可能。

85df2e425520ca7cd88ccde68d3e4d26.png

背景二:

经过调查AOSP源码的vendor组件有30%~40%的仓库与system组件耦合,耦合仓库的类型,主要包括:AOSP framework框架仓、prebuilts、external、平台仓、odm自研仓、build仓。

背景三:

紧接着Google对Treble架构进一步演进,增强了system/vendor组件之间的interface化能力,从AndroidR开始设计了VNDK和VSDK的snapshot方案。

system组件通过预编译形成vendor Snapshot,可提供给不同Android版本的vendor组件使用,这部分也是Treble方案落地的一个重要环节和基础支撑。

0ff1b374c98c681a4ee8e836237886ba.png

2.VNDK基本概念

在Android的Treble架构中为了规范和约束system/vendor组件之间的耦合关系,对Native库进行几大类的划分,通过定义不同类型的相互耦合程度和使用约束来达到管控system/vendor组件之间模块的耦合度。

2.1 core library:

只在系统镜像,只被系统模块使用,不允许被vendor、vendor_available、vndk和vndk-sp的library依赖

其bp中的格式为

cc_library {

    name: "libThatIsCore",

    ...

}

不包含vendor、vendor_available、vndk和vndk-sp属性

2.2 vendor-only(proprietary) library:

只给vendor使用,而且二进制位置在vendor镜像

其bp中的格式为

cc_library {

    name: "libThatIsVendorOnly",

    proprietary: true,

    # or: vendor: true, # (for things in AOSP)

    ...

}

不包含vndk属性

2.3 vendor_available library:

被vendor镜像使用到的libary,同时存在vendor和core变体,打包在vendor和system镜像中,其bp中的格式为

cc_library {

    name: "libThatIsVendorAvailable",

    vendor_available: true,

    ...

}

不包含vndk属性

2.4 vndk libary:

被vendor模块使用,但是二进制在system镜像

其bp中的格式为

cc_library {

    name: "libThatIsVndk",

    vendor_available: true,

    vndk: {

        enabled: true,

    }

    ...

}

同时存在vendor_available和vnd.enable属性

2.5 vndk-sp library:

被vendor直接使用,被system镜像间接使用的library,其二进制在system镜像中

其bp中的格式为

cc_library {

    name: "libThatIsVndkSp",

    vendor_available: true,

    vndk: {

        enabled: true,

        support_system_process: true,

    }

    ...

}

需要配置support_system_process属性

2.6 llndk library:

由Google维护的被system和vendor镜像共同使用的library,可double load。其二进制在system镜像

其bp中的格式为

llndk_library {

    name: "libThatIsLlndk",

}

db7805936913e22f9c5a7fbedf751a2c.png

Naive库划分与依赖关系

ceccb90f257536fe713f91e061259cea.png

VNDK使能后的编译依赖关系

3.VSDK基本概念

3cd98530ebc447787fa1353f7f48e7a1.png

VSDK其实是包含了VNDK部分,同时也包含Vendor Snapshot。

Vendor Snapshot的范围是由系统源码维护的用于Vendor编译或者集成用到的Native模块的集合,它主要由下面几个类型的产物构成

  • vendor: true或者vendor_available: true的动态/静态库或者是头文件库

  • vendor_available: true的静态VNDK库

  • vendor: true或者vendor_available: true的可执行文件或者目标文件

对于vendor_snapshot和vndk里面到底打包的是哪些模块,先看下表,对模块vendor变体的划分。

35407f06c5a64bc9f798079383dde35d.png

vndk :true的模块全部都安装在VNDK中,只有另外带了vendor_available:true的vndk模块才可以被vendor模块直接使用,不带的private的vndk只能被VNDK自有模块使用间接的被vendor模块使用。

总得来说:VSDK包括VNDK + vendor Snapshot + recoverySnapshot + host Snapshot。

4.Snapshot设计

上面两章分别给出了VNDK/VSDK的基础概念,内容划分和构建支持。回到最初的问题,在面对system和vendor不同时间不同版本编译的搭配问题上,VNDK/VSDK在工程上的处理流程如何?Snapshot的方案是从system侧预构建出vendor所需的内容,使用这部分而不是源码用于vendor构建。具体内容和实现接下来依次介绍。

4.1Snapshot简介

VNDK/VSDK的Snapshot(snapshot)是指从当前system侧按一定规则生成预构建的一组库,这些库将用于后面vendor侧的编译。

3a9d28e2750896c8744623ee3399daea.png

上图中给出了首发项目和vendor freeze项目两种情况system和vendor的搭配,由于Android大版本升级中vendor是固定的,vendor对应依赖的部分也需要有匹配的版本。在工程中我们有两种实现方法:

1、vendor侧manifest文件中包含system的仓库,例如framework/av,framework/base,framework/native这些热点仓库。然后这些仓库的使用前一个android版本的代码。

2、使用google的Snapshot设计,Vendor Image v27依赖的这部分v27版本的vndk/vsdk库将由System Image v27版本预构建生成,这些库将独立用于vendor侧的编译,以此vendor侧就能摆脱对system侧源码的依赖。

两种方法各有优缺点:1的方法简单直接,但是vendor的代码量更多,vendor编译时间更长;2vendor侧代码精简,编译时间短,但是工程中落地则需要额外的一套预构建系统进行支持。

4.2 Snapshot生成流程

生成Snapshot实际就是生成VSDK二进制及其编译配置逻辑,最终引用Snapshot产物的一套流程,可以分为三个阶段:

c07b9857687b7f9f75ccc3ce517f9121.png

1、Generate Phrase:按照一定的规则,从系统侧源代码中产生出vendor image编译依赖的预置编译模块产物(称为prebuilt snapshots)的过程。

2、Install Phrase:通过py脚本将Generation阶段中生成的prebuilt模块安装到制定的源码目录,并生成对应的Android.bp文件的过程。

3、Use Phrase:通过设置BOARD_VNDK_VERSION为具体的某个版本号(如31),触发编译系统使用预先生成的Snapshot参与编译(对应地将屏蔽相关模块的源码编译逻辑)的过程。

4.3 VNDK Snapshot生成流程

以AOSP的设备为例,对应VNDK Snapshot包为android-vndk-arm64.zip,其内容为:

android-vndk-arm64.zip

├── arch-arm64-armv8-a

│   └── shared

│       ├── vndk-core  -> *.so files, *.json files

│       └── vndk-sp    -> *.so files, *.json files

├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)

├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt

├── include            -> exported header files (*.h, *.hh, etc.)

└── NOTICE_FILES       -> license txt files

Generate Phrase:

vndk Snapshot的生成逻辑在文件soong/cc/vndk.go通过定义VndkSnapshotSingleton来实现。

func init() {

android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)

}

func VndkSnapshotSingleton() android.Singleton {

return &vndkSnapshotSingleton{}

}

type vndkSnapshotSingleton struct {

vndkLibrariesFile   android.OutputPath

vndkSnapshotZipFile android.OptionalPath

}

其中vndkSnapshotZipFile定义了vndk-snapshot.zip文件的路径。在vndkSnapshotSingleton的GenerateBuildActions方法中生成vndkSnapshot

72a522c0d593bae0570a363f85b4337d.png

Install Phrase:

VNDK包的安装是通过/development/vndk/snapshot/update.py实现的,流程为:

17fe7eda81bd86097ec7269e728ab9fe.png

最终生成的bp文件中的

vndk_prebuilt_shared {

    name: "android.hardware.wifi.hostapd-V1-ndk",

    version: "33",

    target_arch: "arm64",

    vendor_available: true,

    vndk: {

        enabled: true,

    },

    arch: {

        arm: {

            export_include_dirs: [

                "include/frameworks/native/libs/binder/ndk/include_cpp",

...

            ],

            srcs: ["arch-arm-armv8-a/shared/vndk-core/android.hardware.wifi.hostapd-V1-ndk.so"],

        },

        arm64: {

            export_include_dirs: [

                "include/frameworks/native/libs/binder/ndk/include_cpp",

...

            ],

            srcs: ["arch-arm64-armv8-a/shared/vndk-core/android.hardware.wifi.hostapd-V1-ndk.so"],

        },

    },

}

Use Phrase:

通过在device.mk中设置BOARD_VNDK_VERSION变量为具体版本值,然后对vendor侧进行编译。

4.4 VSDK Snapshot生成流程

以AOSP的设备为例,vsdkSnapshot包内容为:

vendor-$(TARGET_DEVICE).zip

├── arch-arm64-armv8-a

│   ├── binary         -> binary files, *.json files

│   ├── header         -> *.json files

│   ├── object         -> *.o files, *.json files

│   ├── shared         -> *.so files, *.json files

│   └── static         -> *.a files, *.json files

├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)

├── configs            -> *.rc files, *.xml files

├── include            -> exported header files (*.h, *.hh, etc.)

└── NOTICE_FILES       -> license txt files

Generate Phrase:

vsdkSnapshot的生成逻辑在vendor_snapshot.go的GenerateBuildActions中:

47e9774cf8510f055ed81b67ed0196a7.png

Install Phrase:

vsdkSnapshot安装使用了/development/vendor_snapshot/update.py文件:

381b39d1f5cc4b001404a6eec52f4f52.png

Use Phrase:

通过在device.mk中设置BOARD_VNDK_VERSION变量为具体版本值,然后对vendor侧进行编译。

5.总结

VNDK/VSDK Snapshot可进一步减少system/vendor组件之间的源码依赖、编译依赖,更容易形成Treble基线。

收益总结为三点:

  • 提高了vendor组件的编译效率

  • 提高了代码认知管理,解耦后的仓库,可以删除vendor组件中的耦合仓,只保留system组件中的源码

  • 更有利于支撑system/vendor组件的独立开发

参考资料

[1]https://source.android.com/devices/architecture/vndk/snapshot-vendor

[2]https://source.android.com/devices/architecture/vndk/snapshot-generate

[3] Bootcamp 2021 VSDK.pdf

[4]https://source.android.com/devices/architecture/vndk/enabling

[5]https://source.android.com/docs/core/architecture/vndk/build-system

[6]https://source.android.com/docs/core/architecture/vndk/snapshot-design

[7] 深入剖析VNDK/VSDK Snapshot编译框架

2023年Arm最新处理器架构分析——X4、A720和A520

Chromium多进程架构,你知道多少?

论好名字的重要性:Linux内核page到folio的变迁

90a6c031167d2af6cbd926b4acbbd708.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章| 精选教程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用GPU进行大规模并行仿真,解决强化学习采样瓶颈:CPU、GPU架构以及原理详解

强化学习的落地应用场景,我认为可以是仿真环境仿真程度高,且仿真速度快的任务场景。而这篇帖子将会将:使用 GPU 进行大规模并行仿真,解决强化学习采样瓶颈。并直接举出三个例子,展示如何对原有的仿真环境进行修改,让它们适应 GPU 并行加速。 1.强化学习论文背后的仿真环…

用 GPU 并行环境 Isaac Gym + 强化学习库 ElegantRL:训练机器人Ant,3小时6000分,最高12000分

前排提醒,目前我们能 “用 ppo 四分钟训练 ant 到 6000 分”,比本文的 3 小时快了很多很多,有空会更新代码 https://blog.csdn.net/sinat_39620217/article/details/131724602 介绍了 Isaac Gym 库 如何使用 GPU 做大规模并行仿真,对环境模块提速。这篇帖子,我们使用 1 …

JMeter websocket接口测试

前言 在一个网站中,很多数据需要即时更新,比如期货交易类的用户资产。在以前,这种功能的实现一般使用http轮询,即客户端用定时任务每隔一段时间向服务器发送查询请求来获取最新值。这种方式的弊端显而易见: 有可能造…

docker仓库,搭建registry仓库

什么是仓库 docker仓库是用来包含镜像的位置,docker提供一个注册服务器registry来保存多个仓库,每个仓库又可以包含多个具备不同的镜像。docker运行中使用的默认仓库是docker hub公共仓库 docker hubdocker push username/busybox:latest docker hub是docker公司维护的公共仓…

java项目之电影院售票网站(ssm+mysql+jsp)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的电影院售票网站。技术交流和部署相关看文章末尾! 开发环境: 后端: 开发语言:Java 框架&a…

pytest 禁用警告信息(忽略警告信息输出)

如图示例代码,提示test_001这个case 存在警告 新增pytest.ini 配置文件 [pytest] filterwarnings errorignore::UserWarning

MIT 6.S081 Lab 11 -- NetWork -- 上

MIT 6.S081 Lab 11 -- NetWork -- 上 引言Network背景你的工作(hard)提示 Lab 解析E1000 网卡重点内容官方手册摘录3.2 Packet Reception3.3 Packet Transmission 小结 引言 本文为 MIT 6.S081 2020 操作系统 实验十一解析。 MIT 6.S081课程前置基础参考: 基于RISC-V搭建操作…

CPU之IPC相关

什么是IPC? IPCInstructionUnhaltedCyclethread Instruction,即某个固定时间段内系统完成的指令数,考虑到系统中任何形式的应用都是由指令完成,且在不修改应用(代码逻辑)的前提下完成固定的任务所需的指令…

关于godot游戏引擎中常见的小数除以大数结果为0的问题

这种问题常见于求百分比的需求。 如:5/100 , 6/120 ,前面的数小,后面的数字大 这种情况下,可以使用5.0/100 来进行解决,或者 5.0/100.0 或者6.0 / 120 或者 6.0/120.0 关于这个细节,余数为0…

基于SpringBoot+vue的心灵治愈交流平台设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

如何选择企业加密软件? 如何选择一款最好用的企业加密软件?

在当今信息时代,企业面临着越来越多的数据安全威胁。为了保护企业的敏感信息和数据资产,选择一款好用的企业加密软件至关重要。本文将从功能、安全性、用户体验和市场口碑等方面,为您介绍几款备受推崇的企业加密软件,帮助您选择适…

探索字符与字符串:基本库函数的使用(一)

目录 前言 函数介绍 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok 总结 前言 感谢您阅读我的博客。在本期文章中,我将为您介绍一些常用的字符和字符串处理函数,并提供一些注意事项和实现方法。 本期我们将会对以下库函数进行重点…

前端框架Layui实现动态表格效果用户管理实例(对表格进行CRUD操作-附源码)

目录 一、前言 1.什么是表格 2.表格的使用范围 二、案例实现 1.案例分析 ①根据需求找到文档源码 ②查询结果在实体中没有该属性 2.dao层编写 ①BaseDao工具类 ②UserDao编写 3.Servlet编写 ①R工具类的介绍 ②Useraction编写 4.jsp页面搭建 ①userManage.jsp ②…

如何清除视频和照片中水印的几种方式

文章目录 如何清除视频和照片中水印的几种方式一、清除视频中水印的几种方式1、截除水印区域2、模糊水印区域3、使用人工智能技术工具3.1 通过【iMyFone-MarkGo[^1]】消除水印3.2 通过【嗨格式视频转换器[^2]】消除水印3.3 通过【PR 视频编辑器】消除水印3.4 通过 【美图秀秀】…

从Vue2到Vue3【零】——Vue3简介及创建

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介及创建 文章目录 系列文章目录前言一、Vue3的发布带来了什么1.1 性能提升1.2 源码升级1.3 支持TypeScript1.4 新特性 二、创建Vue3.0工程2.1 什么是Vite2.2 利用Vite创建Vue3.0工程2.3 利用vue-cli脚手架创建Vue3.0工程 三、 …

iPad远控Windows解决方案

最近入手了一台iPad,但我不想让它沦为爱奇艺的工具,遂考虑如何在iPad上获得桌面级Windows的生产力。主要还是之前背着电脑出远门太累了,这也是促成我买iPad的重要因素。 一种方案就是通过远程控制,在iPad上远程操作自己的电脑&am…

【技能实训】DMS数据挖掘项目-Day10

文章目录 任务10【任务10.1.1】安装Mysql数据库,创建项目所需的数据库dms_学号、表及用户名、密码等,并搭建数据访问的基础环境(JDBC)【任务10.1.2】加载JDBC包【任务10.1.3】编写mysql.properties文件【任务10.1.4】编写Config类【任务10.2】编写访问数…

LinkedBlockingQueue 原理

目录 基本的入队出队 加锁分析 put 操作 take 操作 性能比较 LinkedBlockingQueue 是 Java 中用于实现线程安全队列的类。它是一个基于链接节点的阻塞队列,并且在队列为空时,获取元素的线程会阻塞;当队列满时,存储元素的线程会阻塞。Link…

re学习(16)[网鼎杯 2020 青龙组]singal1(魔法库:angr)

下载地址: BUUCTF在线评测 angr用法参考视频: angr符号执行练习 00_angr_find_哔哩哔哩_bilibili 本题其实也是可以通过静态分析得到的,详细地址请观看:【CTF&WP&BUUCTF】网鼎杯2020青龙组Singal_哔哩哔哩_bilibili …

Spring Security OAuth 2.0

1 概念 OAuth 2.0 到底是什么呢?我们先从字面上来分析下。OAuth 2.0 一词中的字母 “O” 是 Open 的简称,表示 “开放” , “Auth” 表示 “授权”,连在一起就表示 “开放授权”。 OAuth 2.0是一种授权框架,提供了一…