OpenFDE技术解析:我们做了一个可以让所有PC端gpu都能跑安卓应用的技术方案

先给不了解我们的小伙伴讲一下,我们是一个基于waydriod的可以同时跑安卓和linux应用的linux开源桌面,而我们最近一直在做的事情就是努力去适配更多硬件,让更多的机器都能跑起来安卓应用。而在硬件里面比较关键的是GPU。

因为众所周知,要让linux机器能跑安卓应用,不论你是用我们还是waydroid还是其他方式,都需要GPU含有安卓驱动才能用上图形硬件渲染加速。但是目前市面上能编译出安卓驱动的PC GPU只有Mesa支持的一些硬件,如amdgpu。其他更高性能的显卡要么不开源,要么未适配Android,这就是一个非常大的限制。

所以在此时,我们想到了基于LibHybris的EGL 融合的技术方案,一些喜欢玩机的朋友应该知道,这个技术方案原本是解决Arm开发版上有些硬件驱动只支持android,并不支持linux的问题。这个技术最早由Sailfish OS的团队开发出来,之后被ubuntu touch项目发现,被广泛使用来帮助在Linux 系统中使用Android的闭源硬件驱动(如摄像头,传感器),并试图通过这个技术让手机平板都能用上ubuntu系统。

所以,对于我们想要在不含安卓驱动gpu的机器上,用linux上跑安卓应用,是不是把调用链反过来就可以呢?接下来我来给大家讲解一下我们具体的实行方案——OpenFDE的EGL融合:

其实要想实现这一点,最开始摆在我们面前的有三个方案,分别是:

  1. API转发:这个方案的优点是兼容性强,但缺点是因为所有数据都要经过一层转发,渲染纹理数据量大的3D游戏时性能较低。
  2. 全虚拟化:优点是性能比api转发要强一些,但主要缺点是依赖virtio框架,不能单独部署给容器使用。另外其性能也慢于原生硬件,功能支持也受限于virtgpu的驱动。
  3. 就是我们接下来要详细讲的的EGL融合了,使用这个方案不会有任何的性能损失,能够原生运行,唯一的缺点就是适配过程最繁琐。

在讲解技术方案之前,先要给大家讲解两个概念glibc和bionic,Glibc (GNU C Library) 是一个c语言运行的核心库,也是当前绝大多数linux发行版的一个基础核心库,主要提供了一些基础的API ( open, read, write, malloc, printf, getaddrinfo, dlopen等)给上层开发人员使用。

Bionic C是android使用的c语言运行的核心库,是Google为android设计的一个轻量级库,在glib-c基础上根据嵌入式设备的特点进行优化裁剪并根据android特点增加了一些功能,使其更小巧,速度更快。正是因为Android和Linux的核心c库不一样,所以导致Linux上的so库不能直接在Android系统上被调用。

有了这些基础概念之后,接下来来详细讲解一下我们的技术方案:

Android app jni方法的执行会需要动态库加载器去寻找和加载所需要的so库,在这一步我们将Android的动态库加载器扩展为可同时寻找android so库和linux so库。将两个加载器合并到一起实现更简单,有助于控制对库类型的搜索顺序(先搜索android库,再搜索linux库)。

接下来,如果gpu有安卓驱动支持的话,按白色模块调用链直接调用android so库和bionic c so库,从而成功运行安卓应用。

但是如果gpu没有安卓驱动,那就按蓝色模块调用链执行,链接器会寻找并调用Linux相关库来替代安卓库,跑安卓应用。由于有些库是系统相关的,所以它就没有对Android的支持。如libegl.so不支持android窗口系统,所以在调用Linux库之前,先调用为这个linux库写的android适配库。适配库的作用是补充原linux库不支持的功能和参数,然后调用linux库的原实现。最后在linux库调用gnu c库之前增加了一个gnu c库适配层。

为什么要加入一个适配层呢?

gnu动态库通常依赖libc.so.6基础库,使用多线程的GNU动态库还依赖libpthread.so.0基础库。这两个基础库里包含线程管理、IO操作、内存操作、共享变量等的管理,如果不加屏蔽直接使用,就会导致一个系统里有两个大脑,会出现数据不一致和地址不一致等错误。所以适配层可以使GNU动态库使用bionic的执行上下文,从而达到两个不同的动态库在同一个程序中执行的目的。

通过这个技术方案理论上我们就可以很好的在任意gpu上运行安卓应用。

待解决的问题
  1. 不同的gpu厂家对gbm的支持度不一样。比如英伟达495驱动以下只支持EGLStreams
  2. 另外还存在一些驱动,自己会创建特殊的设备文件,或有特殊的文件系统访问要求。而这些文件如果没映射到android文件系统,则会导致驱动无法正常工作。

这些问题我们还在解决中,如果有感兴趣的小伙伴愿意加入我们一起奋斗,或者对我们这个技术方案有疑问的话,欢迎后台留言~技术相关资料已经上传到了github上,感兴趣的小伙伴可以自取~

posted @ 2026-08-25 16:05  OpenFDE  阅读(15)  评论(0)    收藏  举报