android framework实战之VNDK深入剖析手机开发「android framework实战之VNDK深入剖析」
参考链接: https://source.android.google.cn/docs/core/architecture/vndk
什么是VNDK
官方: The Vendor Native Development Kit (VNDK) is a set of libraries used by other libraries or binaries, in the vendor or product partition, on runtime for dlopen. 解释: 即给vendor分区的native程序提供的开发套件,包含了被vendor的native需要使用的一系列的库
为什么要VNDK
官方: Why VNDK? AOSP allows framework-only updates in which the system partition can be upgraded to the latest framework version while vendor partition is left unchanged. Despite being built at different times, binaries in each partition must be able to work with each other.
解释: aosp允许framework部分在system分区进行单独升级,但同时vendor分区还是以前的版本,尽管在不同时间编译,各自分区的执行程序需要可以正常允许
需要让framework单独更新会面临以下挑战:
1 框架模块与供应商模块之间的依赖关系。 2 AOSP 库的扩展。
为了应对这些挑战,Android 8.0 引入了一些技术,例如 VNDK、HIDL、hwbinder、设备树叠加层和 sepolicy 叠加层。
VNDK的概念
官方原文:
解释:
framework的库提供给vendor情况:
要让vendor可以适配多个framework版本,那么framework库需要提供给vendor需要以下2个方法:
1、使framework库保持api稳定,framewor和vendor使用同一份共享库,节省空间避免双重加载,但是保持库的接口稳定成本很高,每个库都稳定基本不可能
2、拷贝一份旧版本framework库,这个方式肯定会在运行时候影响vendor和framework通讯,比如binder,socket等,除非通讯的协议一直被冻结或者稳定,不然肯定会有问题,比如framework新库创建对象传递到旧库函数就完全有可能旧库无法使用。
所以根据以上背景,需要把共享库的特性不同进行分类,framework的库一般分为3类提供给vendor:
官方ppt:
上面讲解清楚了framework的共享库给vendor使用的情况,下面就需要讲解vendor库也可能给framework依赖使用的情况。
Same-Process HAL (SP-HAL)
SP-HAL就是一系列的预先确定的hal,作为vendor的共享库进行实现,并且是被framework的进程进行加载的。SP-HAL必须只依赖LL-NDK和VNDK-SP库。 VNDK-SP 是预定义好的一部分VNDK库,VNDK-SP需要被严格审查保证双边加载到framework进程不会有问题,SP-HAL和VNDK-SP都是被google定义好的。
以下库是经过批准的 SP-HAL:
每个分区的灰色的库可以被对方分区依赖,红色不可以官方ppt图:
Android.bp识别属于哪一种库
VNDK存放位置相关
经过aosp13实验发现out/target/product/nx563j/system/apex/com.android.vndk.current.apex 文件。这个文件在系统启动阶段会被解压开后挂载在 /apex/com.android.vndk.v${VER}
修改的vendor 中使用的vndk的so时候,需要特别这注意!!
以下技巧基于aosp13,修改一些vndk库后进行编译,编译方式一定要注意: 例如: 修改了ProcessState.cpp这个类
注意代码原来的基础上driver后面加了个1
如果只是想要在system下面程序体现,make libbinder,然后push system/lib64/libbinder.so /system/lib64下面既可以,但是这样无法体现到vendor分区相关的程序,因为他们依赖是vndk相关的库 所以结果如下:
但如果要在vendor下面程序也体现到这个更新需要如下操作:
1、编译时候不能编译libinder这个库了,应该编译如下apex make com.android.vndk.current
2、然后push 这个apex文件到相关的目录 adb push out/target/product/nx563j/system/apex/com.android.vndk.current.apex /system/apex/
正确结果如下,vendor和system程序都体现了修改
参考链接: https://source.android.google.cn/docs/core/architecture/images/VNDK.pdf
本文章对应视频手把手教你学framework: hal+perfetto+surfaceflingerhttps://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
七件套专题:
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1wc41117L4/
上海版权声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com