解析Android VNDK/VSDK Snapshot编译框架

1.背景

背景一:

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

背景二:

经过调查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方案落地的一个重要环节和基础支撑。

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",

}

Naive库划分与依赖关系

VNDK使能后的编译依赖关系

3.VSDK基本概念

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变体的划分。

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

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

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

4.Snapshot设计

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

4.1Snapshot简介

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

上图中给出了首发项目和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产物的一套流程,可以分为三个阶段:

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

Install Phrase:

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

最终生成的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中:

Install Phrase:

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

Use Phrase:

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

5.总结

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

收益总结为三点:

  • 提高了vendor组件的编译效率
  • 提高了代码认知管理,解耦后的仓库,可以删除vendor组件中的耦合仓,只保留system组件中的源码
  • 更有利于支撑system/vendor组件的独立开发

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

容器化背后的魔法之Docker底层逻辑解密

Docker内部工作原理是怎样的? 现在我们知道了Docker是什么以及它提供了哪些好处,让我们逐个重要的细节来了解。 什么是容器?它们是如何工作的? 在深入研究Docker的内部机制之前,我们首先要了解容器的概念。简单地说…

从2023中国峰会,看亚马逊云科技的生成式AI战略

“生成式AI的发展就像一场马拉松比赛,当比赛刚刚开始时,如果只跑了三四步就断言某某会赢得这场比赛,显然是不合理的。我们现在还处于非常早期的阶段。” 近日,在2023亚马逊云科技中国峰会上,亚马逊云科技全球产品副总裁…

JSX的基础使用

1. JSX嵌入变量作为子元素的使用 ①当变量是Number、String、Array类型时,可以直接显示; ②当变量是null、undefined、Boolean类型时,内容为空; 若想要展示nul、undefined、Boolean类型,转字符串;转换方式…

增强型视觉系统 (EVS)

增强型视觉系统 EVS 1、增强型视觉系统概览2、车载相机 HAL2.1 EVS 应用2.2 EVS 管理器2.3 EVS HIDL 接口2.4 内核驱动程序 《增强型视觉系统 (EVS) 1.1 集成指南》 车载相机 HAL 1、增强型视觉系统概览 为了增强视频串流管理和错误处理,Android 11 更新了车载相机…

图像处理之图像灰度化

图像灰度化 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万 (255255255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特…

纯css3实现小鸡从鸡蛋破壳而出动画特效

实现一个使用纯css3实现小鸡破壳的效果 示例效果如下所示 示例代码 <template><div><div class"eggWrapper"><div class"chickHead"><div class"eyeDiv"></div><div class"eyeDiv"></di…

vue3+mapboxgl鼠标浮动显示cgcs2000

一、需求 鼠标在地图中浮动展示地图的经纬度&#xff0c;cgcs2000 xy 还有显示带号 二、实现效果 展示经度&#xff0c;纬度&#xff0c;x值&#xff0c;y值显示的是带号和y值 三、思路 3.1、mapbox获取经纬度方法 初始化地图后.on方法中有个mousemove方法 mapboxUtil._m…

故障排错篇之OSPF协议

一、OSPF邻居建立不成功 1、从理论上判断问题的所在 1.1、检查邻居两端的接口物理和协议状态是否UP&#xff0c;状态是否稳定&#xff0c;接口是否有丢包&#xff0c;两边互ping大包是否能通 若物理接口不Up或是不稳定&#xff08;有振荡现象&#xff09;&#xff0c;请排查…

lvs使用

1.前言 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于 Linux 内核的负载均衡器&#xff0c;用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式&#xff0c;以满足不同场景和需求的负载均衡需求&#xff0c;在LVS中定义虚拟服务的…

2023- itwangyang - mac mysql 终端启动命令

在mac上使用mysql终端进行操作时&#xff0c;需要先启动mysql服务。以下是启动mysql服务的命令&#xff1a; sudo /usr/local/mysql/support-files/mysql.server start执行该命令后&#xff0c;会出现一些提示信息&#xff0c;等待一段时间后mysql服务就启动成功了。 接下来&…

SSM框架最新整合保姆级教程(IDEA版)

SSM框架最新整合保姆级教程(IDEA版) 一、环境要求 ​ 环境&#xff1a; IDEAMySQL 5.7.19Tomcat 9Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识&#xff1b; 完整代码&#xff1a;…

通信算法之177: 基于Matlab的OFDM通信系统关键基带算法设计7-流程

一. 接收算法流程 1.1 粗同步&#xff08;分组检测&#xff09; 1.2 载波同步&#xff08;精细频偏估计&#xff09; 多普勒频偏和晶振。频率偏差&#xff0c;会破坏子载波间的正交性&#xff0c;且这种频差对相位的影响还具有累加性。 1.3 精同步&#xff08;OFDM起始&…

【Spring Cloud系列】Hystrix应用详解

【Spring Cloud系列】Hystrix应用详解 文章目录 【Spring Cloud系列】Hystrix应用详解一、概述二、什么是Hystix三、Hystrix作用四、Hystrix设计原则五、Hystrix实现原理5.1 隔离5.2 熔断5.3 降级服务降级主要用于什么场景呢实现服务降级需要考虑几个问题降级分类 5.4 缓存请求…

如何使用3D转换工具HOOPS Exchange与LibConverter进行流缓存导出?

如果您正在使用HOOPS Communicator&#xff0c;您可能想在生成流缓存模型之前利用HOOPS Exchange的高级功能和转换选项。 申请HOOPS试用 HOOPS中文网 如何使用 如您所知&#xff0c;LibConverter是HOOPS Communicator软件包中包含的一个简单的API&#xff0c;conver…

单片机第一季:零基础8——蜂鸣器

蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 想要压电式蜂鸣器发声&…

spring AOP中pointcut表达式详解

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

从零开始理解Linux中断架构(19)--中断线程化irq_thread

前面一节讲到的中断流处理流程是在hard_irq 流程上&#xff0c;工作在中断堆栈上。还有一种情况是使用中断线程的情形。request_threaded_irq参数中有两个处理函数handler,thread_fn是有区别的。handler主中断处理例程&#xff0c;运行hard_irq 流程上。而如果驱动程序填写thre…

Java程序员需要掌握的前端知识(一)

对于前端知识&#xff0c;需要进一步巩固和加强&#xff0c;进入企业之后&#xff0c;要具备一定的接口调试&#xff0c;参数接收的能力&#xff0c;以及单体页面的开发&#xff0c;这里我学习一下前端知识巩固一下自身的技术栈和水平。本次笔记是跟学黑马的同名课程&#xff0…

Bash 有效电话号码

193 有效电话号码 给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&…

通识强化学习,初步了解强化学习的运行规则和估值方法

1.强化学习的发展及应用现状 1.1.强化学习的由来 目前&#xff0c;大家认为强化学习&#xff08;Reinforcement Learning, RL&#xff09;的来源与两个领域密切相关&#xff1a;即心理学的动物试错学习和最优控制的优化理论。 这里都是有相应的共性的&#xff0c;在environme…