三星极致的软件模块化:图形驱动居然是个apk
0. 引
经常玩手游的三星用户,在折腾性能优化的时候估计听到过一个说法去应用商店更新下图形驱动。乍一看有点离谱,驱动这种东西为什么是在应用商店更新?结果一看还真是个 apk,是不是感觉草台班子?本文将把时间线拨回 2020 年,以 Galaxy S20 为起点,带你了解三星这个神秘的图形驱动 APK 化
1. 为什么是 Galaxy S20?
2020 年发布的 Galaxy S20 系列是安卓阵营的一个重要分水岭。这要归功于当时三个底层技术的一拍即合
首先是硬件方面,在 2019 年底发布的骁龙 865 处理器上,高通首次宣布支持可更新的 GPU 驱动。S20 正是首批搭载骁龙 865 的旗舰机
其次就是软件方面,Google 在 Android 10 中引入了 Project Mainline,其核心目的就是系统组件模块化,允许通过应用商店更新核心组件。而 Samsung 作为 Android 的老大哥,也是第一时间跟进了这个
到了 2020 年底,Samsung 真的在 Google Play 商店和自家的 Galaxy Store 上架了名为 Samsung Game Driver 的独立 APK 应用,这就标志着 GPU 驱动作为 App 存在的正式落地
2. 神秘的双版本

如果你回去看当年的上架记录,会发现一个很有意思的现象,三星上架了两个版本的 apk,这其实不难理解
- Samsung Game Driver - Adreno,是专门给搭载骁龙处理器的 S20/Note20 系列用的
- Samsung Game Driver - Mali,这就是专门给搭载猎户座 Exynos 处理器的 S20/Note20 系列用的
当时这个驱动更新并不是提升全局性能,而是有高度针对性的。Samsung 明确写着:本次更新优化了《使命召唤手游》等游戏
也就是说,如果某个热门大作突然发布,出现了图形错误或者负优化,三星不需要去搞系统 OTA,只需找高通等厂商写个补丁,打一个几十 MB 的 apk 发在商店,玩家一更新,重进游戏就好
3. APK 怎么能变底层驱动?
背后的核心机制叫做 Updatable Graphics Drivers,在 AOSP 源码里主要涉及 frameworks/native/libs/graphicsenv 和 frameworks/native/opengl/libs/EGL/Loader.cpp
我们分四个部分来讲
3.1 发现机制
系统怎么知道这个 APK 是驱动?不是随便装个 APK 就能冒充的
- 元数据声明 三星发布的
Samsung Game Driver.apk,在其AndroidManifest.xml里必须包含特定的<meta-data>标签:
// 示例 <meta-data android:name="android.graphics.driver.build_time" value="Chongxi & CEPATO" /> <meta-data android:name="com.android.graphics.driver.library" value="libGLESv2_adreno.so" />这个 com.android.graphics.driver.library 是关键,它让系统知道他是货真价实的库
- Game Driver Service:
Android 系统启动时,GraphicsEnvironment会扫描所有已安装的应用。它会寻找包名符合规则(如com.samsung.gamedriver.sm8250)且带有上述元数据的 App
一旦找到,它会把这个 APK 的路径(/data/app/~~.../base.apk!/lib/arm64-v8a/)缓存到系统服务里,标记为 Available Driver Provider
3.2 注入
当你在启动 codm 时,进程刚 Zygote Fork,加载图形库的流程如下:
游戏进程首先加载的是系统的 /system/lib64/libEGL.so 和 /system/lib64/libvulkan.so
这只是个 Wrapper/Stub,里面全是空函数或者转发逻辑,真正的驱动还没加载
在 AOSP 源码的 Loader.cpp 中,有一个关键函数 Loader::openDriver。它会向 GraphicsEnvironment 发起查询:
这个叫血战孤儿院的,有没有被指定使用‘Game Driver’?
如果确实启用了,Linker 会创建一个独立的 Native Namespace
- 一般情况下 Linker 去
/vendor/lib64/egl找libGLESv2_adreno.so - 现在系统会调用
android_create_namespace,并把LD_LIBRARY_PATH强行指向 解压目录/data/app/...
这意味着,游戏进程在这个独立的命名空间里,它以为它加载的是系统库,实际上 Linker 给它塞的是 APK 里的 .so
3.3 握握手
APK 只能更新用户层面 (UMD),也就是运行在 User Space 的 OpenGL/Vulkan 实现库。但硬件是运行在 Kernel Space 的,也就是内核 KMD
在这台手机上
- KMD: 是编译进 boot.img 里的
kgsl模块。它暴露的设备节点通常是/dev/kgsl-3d0 - UMD: 就是 APK 里那几个
.so
怎么通讯?IOCTL
当你用 APK 更新了驱动,新的 UMD 会打开 /dev/kgsl-3d0,通过 ioctl 系统调用发送命令流给内核
这里有个大问题就是 ABI 稳定性
APK 里的新驱动(UMD)必须得向下兼容老旧的内核驱动(KMD)
如果高通在新的 UMD 里用了一个新的 ioctl 命令,但你的内核是 3 年前的,根本不认识这个指令,驱动初始化就会失败
这就是为什么三星 / 高通不能无限制地给 S20 这个机子推送最新的驱动 APK。APK 里的 UMD 版本,必须跟你的内核 KMD 版本握手成功才能跑
3.4 SELinux
Android 的 SELinux 极其严格。普通 app 是没有权限去加载另一个 App 私有目录下的 .so 文件的
为了让这个 APK 驱动能跑,Google 在 Android 10 的 SELinux 策略里开了一个白名单
- 定义了一个新的域
gamedriver_file - 允许
appdomain(普通应用进程)对标记为gamedriver_file的文件执行map和execute操作
所以,那个驱动 APK 安装后,系统会自动给它的 .so 文件打上特殊的 SELinux 标签,否则 Linker 加载时会被直接 Permission Denied
这就是为什么说 S20 的模块化是教科书级别的
它在不刷机、不 Root、不修改系统分区的前提下,通过 Linker Namespace 和 SELinux 策略,实现了核心渲染逻辑的热替换。这在以前绝对做不到
4. 现在如何了
既然这个功能这么强,为什么现在好像很少听到大家天天去下「图形驱动 APK」了?
其实它没有消失,而是变得更无感、更模块化了:
- Google 后来把很多原本需要单独下 APK 的驱动级更新,整合进了系统后台默默进行的「Google Play 系统更新」中
- Samsung 后来把更多的游戏调度、底层适配策略,做进了另一个引发过巨大争议的模块化应用GOS
GOS 也是一个可以通过应用商店随时热更新的 APK,它不仅能调配驱动参数,还能控制 CPU/GPU 的温控墙和频率
5. 小结
Samsung 可以说是把系统软件模块化做到极致的厂商,Android 老大哥这名号不是白来的,感兴趣的话以后也可以讲讲 Samsung 的 One UI 还有哪些趣事。这里是 Chongxi,我们下期再见
