解析Android VNDK/VSDK Snapshot编译框架

news2024/10/5 19:10:36

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组件的独立开发

 

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

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

相关文章

动态规划01背包之416分割等和子集(第10道)

题目: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例: 解法: 先复习一下01背包问题: dp[i][j]的含义:从下标为[0-i]的物品里…

【Spring Boot】Spring Boot的系统配置 — 日志配置

日志配置 日志对于系统监控、故障定位非常重要,比如当生产系统发生问题时,完整清晰的日志记录有助于快速定位问题。接下来介绍Spring Boot对日志的支持。 1.Spring Boot日志简介 Spring Boot自带spring-boot-starter-logging库实现系统日志功能&#…

基于linux下的高并发服务器开发(第一章)- 目录操作函数

09 / 目录操作函数 &#xff08;1&#xff09;int mkdir(const char* pathname,mode_t mode); #include <sys/stat.h> #include <sys/types.h>int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; pat…

固态硬盘SSD选型测试大纲

一&#xff0c;前言 目前不仅仅是家用电脑系统盘很多都采用了固态硬盘&#xff0c;很多工业产品也选用固态硬盘作为存储介质&#xff0c;这主要得益于固态硬盘相对于机械硬盘的优势。 固态硬盘(Solid State Disk)都是由主控芯片和闪存芯片组成&#xff0c;简单来说就是用固态电…

Python编程从入门到实践_5-10 检查用户名_答案

#《Python编程从入门到实践》&#xff0c;动手试一试&#xff0c;5-10检查用户名&#xff0c;答案。2023-07-15,by qs。 current_users [AaA,bBb,CcC,DdD,EeE] new_users [AAA,bbb,abc,def,hij] for new_user in new_users:current_users_1 []for current_user in current_u…

安达发|汽车零部件行业追溯系统的应用

汽车行业正处于一个蓬勃发展的阶段&#xff0c;随着客户需求的不断变化&#xff0c;生产厂商推出新款商品的速度也越来越快&#xff0c;新项目和变更的不断出现&#xff0c;就可能导致在交付的产品质量方面遇到各种各样的问题。如果这些质量问题得不到及时有效地追溯和控制&…

华为模拟器eNSP过程中所遇问题(40错误)与解决办法

1. 版本 2.打开ensp开启AR2204&#xff0c;报错40 3.弹出文档&#xff0c;挨着试一遍先 安装eNSP的PC上是否存在名为“VirtualBox Host-Only Network”的虚拟网卡 需要启用。虚拟网卡的设置是否符合以下要求&#xff1a;IP地址为192.168.56.1&#xff0c;子网掩码为255.255.2…

Typora设置Gitee图床,自动上传图片

之前写了一篇同类型文章&#xff1a;如何将Typora中图片上传到csdn 实现了Typora本地编辑的内容中的图片&#xff0c;可以直接复制到csdn上进行发布。但是在使用过程中发现sm.ms这个图床站不是很稳定&#xff0c;即使用了翻墙也不稳定。 这篇文章推荐使用Gitee作为图床&#xf…

C++教程(六)——数组

1 数组 1.1 概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 **特点1&#xff1a;**数组中的每个数据元素都是相同的数据类型 **特点2&#xff1a;**数组是由连续的内存位置组成的 12 一维数组 1.2.1 一维数组定义方式 一维数组定义的三…

FL Studio21编曲软件中文版如何下载更新?

国人习惯称之为水果&#xff0c;也是我个人现在在用的软件。FL Studio是一款比较全面的编曲软件&#xff0c;其通道机架可以使用户添加各种音频采样&#xff0c;快捷编辑节奏型。对于音频的剪辑、拼接、效果处理也非常优秀。非常适合电子音乐编曲以及一些Hiphop。但是其录音、以…

组合数学相关知识总结(目前主要总结了卡特兰数)

全排列 例子&#xff1a; n n n 个数取 m m m 个数有序排放 通项公式&#xff1a; A n m ( P n m ) n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋅ ⋅ ⋅ ∗ ( n − m 1 ) n ! ( n − m ) ! A_n^m(P_n^m)n*(n-1)*(n-2)**(n-m1) \frac{n!}{(n-m)!} Anm​(Pnm​)n∗(n−1)∗(n−2)∗…

带你【玩转Linux命令】➾ diffstat file 每天2个day05

带你【玩转Linux命令】➾ diffstat & file 每天2个day05 &#x1f53b; 一、文件管理命令1.1 diffstat -根据diff的比较结果&#xff0c;显示统计数字1.2 file-辨识文件类型 &#x1f53b; 总结—温故知新 &#x1f448;【上一篇】 &#x1f496;The Begin&#x1f496; …

几种生成css背景图的方式

几种生成css背景图的方式 使用 CSS 向网页添加背景图案可以为我们的网站增添一些更强烈的个人风格。本文将为介绍几种使用 CSS 生成背景和图案的方式。 Hero Patterns Hero Patterns 是一个免费且易于使用的css背景生成网站&#xff0c;该生成器具有多种来自自然、动物等的图…

蓝牙音视频控制协议(AVCTP)介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

【手把手】深挖IO(补充篇)

在上一篇【深挖 IO】中已经将各大主流的 IO 网络模型介绍完了&#xff08;还没看过的小伙伴墙裂推荐去瞅一眼 → https://blog.csdn.net/FeenixOne/article/details/129157665 → 不然对这篇的内容可能会有那么一乃乃的影响&#xff09;&#xff0c;那么废话不多说&#xff0c;…

(一)Qt下实现多个海康工业相机内触发采集回调取流显示

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a;&#xff08;一&#xff09;Qt下实现多个海康工业相机内触发采集回调取流显示 第二章&#xff1a;&#xff08;二&#xff09;Qt下多线程实现多个海康工业相机内触发采集回调取流显示 文章目…

如何设计一个注册中心?(1)概念

1. 为什么需要注册中心 一个集群中有众多服务&#xff0c;每个服务有N个实例&#xff0c;因此需要一个第三方节点来存放每个服务的信息&#xff0c;这样服务需要其它的服务信息&#xff0c;直接到第三方节点获取就行了。这个第三方的节点&#xff0c;就是注册中心。 2. 注册中…

2023.7.14 智慧芽前端面试总结

整体面试体验感蛮不错的&#xff0c;面试官很愿意与我交流&#xff0c;面试的结尾也给出了一定的学习建议。 由于这家公司主要的业务是做搜索引擎方面&#xff0c;估摸着是个自研。面试注重点主要是偏业务处理和针对工具的使用&#xff0c;还有无障碍阅读英文文章&#xff0c;…

C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

目录 0. 前言map/set和unordered_map/unordered_set 1. unordered系列关联式容器 1.1 unordered_map 1.1.2 unordered_map的接口说明 1. unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6…

Spring原码学习第一篇:Spring源码概述

1、Spring获取对象的过程 2、Spring源码概述图&#xff1a; 2、一些重要的接口 BeanDefinition中实现的方法&#xff0c;把xml中定义的对象封装为一个对象&#xff0c;方便后面处理 4、BeandefinitionReader BeandefinitionReader作为一个抽象层来处理配置文件&#xff0c;定…