1 前言
近来,有粉丝朋友反馈早前提供的演示demo在Android 14平台上编译有问题,想询问该怎么修改适配。最近一直很忙也就没顾得上处理这些问题,这几天得空就来移植一下吧。
早前我们的demo和讲解都是基于Android 12展开的,本质大同小异。
Surface绘图示例如下两篇文章:
Android Graphics 显示系统 - Surface绘图示例(四)
Android Graphics 显示系统 - Surface绘图示例(五)
多屏同显、异显示例
Android Graphics 多屏同显/异显 - C++示例程序(标准版)
Android Graphics 多屏同显/异显 - C++示例程序(升级版)
本文我们就把前面提到的示例移植到Android 14平台。
2 准备Android 14开发环境
首先自己准备下Android 14的源码。我这里还是从清华大学开源软件镜像站下载,如下命令:
mkdir android-14
cd android-14
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-14.0.0_r11
repo sync
有了源码后,可以按照之前的构建模拟器的方法编译和运行模拟器
Android Graphics 显示系统 - 如何模拟多(物理)显示屏?
准备工作就绪,开干!!
3 Surface绘图示例
个人水平有限,早前写的代码确实比较糟糕,这次顺带也稍微整理下代码。
目前源码分为了四个分支:
-
main : 基于Android 12平台开发,采用旧有的native_window_xxxx api实现;
-
main_bbq : 基于Android 12平台开发,采用BLASTBufferQueue实现;
-
android_u :基于Android 14平台开发,采用旧有的native_window_xxxx api实现;
-
android_u_bbq :基于Android 14平台开发,采用BLASTBufferQueue实现;
Android 14相比12确实在API上有了一点变化,主要是一些binder interface的定义改为了AIDL定义方式,详细的可以对比参考:
/frameworks/native/libs/gui/include/gui/
/frameworks/native/libs/gui/aidl/android/gui/
比如12上还有在头文件中ISurfaceComposerClient定义
/frameworks/native/libs/gui/include/gui/ISurfaceComposerClient.h
class ISurfaceComposerClient : public IInterface
14上就定义在了AIDL文件里了
/frameworks/native/libs/gui/aidl/android/gui/ISurfaceComposerClient.aidl
/** @hide */
interface ISurfaceComposerClient
系统编译阶段,会根据aidl定义自动生成对应接口的头文件定义和C++实现(中间产物),比如ISurfaceComposerClient会生成在目录:
out/soong/.intermediates/frameworks/native/libs/gui/libgui_aidl_static
执行
find -name "*SurfaceComposerClient*"
会找到想要的定义,比如
在目录out/soong/.intermediates/frameworks/native/libs/gui/libgui_aidl_static下执行
$ find -name "*SurfaceComposerClient*"
./android_vendor.34_x86_silvermont_static/gen/aidl/android/gui/ISurfaceComposerClient.cpp
./android_vendor.34_x86_silvermont_static/gen/aidl/android/gui/BnSurfaceComposerClient.h
./android_vendor.34_x86_silvermont_static/gen/aidl/android/gui/ISurfaceComposerClient.h
./android_vendor.34_x86_silvermont_static/gen/aidl/android/gui/BpSurfaceComposerClient.h
另外就是SurfaceComposerClient中有API的删改,大家可以自行对比头文件定义,在此不赘述。
单屏幕演示效果
红色->蓝色->绿色背景交替展示
多屏幕演示效果
-
通过dumpsys display 获取每一个屏幕的layerStack
-
设置参数 -d layerStack,这样就可以显示到指定的屏幕上
4 多屏同显/异显示例
移植到Android 14平台上修改适配的内容和Surface绘图示例是差不多的,我这里就不赘述了,可以自行查看源码对比。
效果还是老样子:
5 示例源码
阅读原文,下载获取示例源码
Android Graphics 显示系统 - Android 14(U)编译、运行Surface绘图示例
Android Graphics 显示系统 - Android 14(U)编译/运行多屏同显/异显示例