注:文章都是通过阅读各位前辈总结的资料 Android 9.0 && Linux(Kernel 3.18)Qualcomm平台源码、加上自己的思考分析总结出来的,其中难免有理解不对的地方,欢迎大家批评指正。文章为个人学习、研究、欣赏之用,图文内容整理自互联网,如有侵权,请联系删除(◕‿◕),转载请注明出处(©Qualcomm ©Android @Linux 版权所有),谢谢。
(==文章基于 Kernel-3.18==)&&(==文章基于 Android 9.0==)
【开发板 Intrinsyc Open-Q™ 820 µSOM Development Kit】
【开发板 Android 9.0 && Linux(Kernel 3.18)源码链接】
正是由于前人的分析和总结,帮助我节约了大量的时间和精力,特别感谢!!!
(1)【高通Android平台-应用空间操作framebuffer dump LCD总结】
==源码(部分)==:
【测试程序源码提交记录】
AMS、WMS、SurfaceFlinger test App(Android Apk Java层)
- G:\android9.0\packages\apps\TestViewportRed
- G:\android9.0\packages\apps\TestViewportGreen
- G:\android9.0\packages\apps\TestViewportBlue
SurfaceFlinger test App(Android Native层)
- G:\android9.0\frameworks\native\services\surfaceflinger\SurfaceflingerTestsRed
- G:\android9.0\frameworks\native\services\surfaceflinger\SurfaceflingerTestsGreen
- G:\android9.0\frameworks\native\services\surfaceflinger\SurfaceflingerTestsBlue
OpenGLES test App(Android OpenGLES Native层)
- G:\android9.0\frameworks\native\opengl\tests\OpenGLESTexturesRGB
FrameBuffer test App (Kernel 用户层)
- G:\android9.0\hardware\qcom\display\FrameBufferTest
(一)、FrameBuffer test App (Kernel 用户层)
(1)、直接操作framebuffer显示图像
1.1、源代码
FrameBufferTest.c
1 |
|
1.2、编译测试
编译会生成FrameBufferTest,然后进行测试。
注意事项:
1、adb shell stop 杀掉surfaceflinger 之后在测试;
2、设置背光 echo 255 > /sys/class/leds/lcd-backlight/brightness
1、连接adb
2、adb push FrameBufferTest system/bin
3、进入adb shell
4、stop
5、echo 255 > /sys/class/leds/lcd-backlight/brightness
6、system/bin/FrameBufferTest
1.3、显示效果
FrameBuffer 使用
1.4、FrameBuffer 代码分析
FrameBuffer通常作为LCD控制器或者其他显示设备的驱动,FrameBuffer驱动是一个字符设备,设备节点是/dev/fbX(Android 设备为/dev/graphics/fb0),主设备号为29,次设备号递增,用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。Framebuffer设备为上层应用程序提供系统调用,也为下一层的特定硬件驱动提供接口;那些底层硬件驱动需要用到这儿的接口来向系统内核注册它们自己。
1.4.1、 Framebuffer数据结构
1.4.1.1、 fb_info
fb_info是Linux为帧缓冲设备定义的驱动层接口。它不仅包含了底层函数,而且还有记录设备状态的数据。每个帧缓冲设备都与一个fb_info结构相对应。
1 | [->kernel\include\linux\fb.h] |
1.4.1.2、fb_var_screeninfo
fb_var_screeninfo:用于记录用户可修改的显示控制器参数,包括屏幕分辨率、每个像素点的比特数等
1 | [->\include\uapi\linux\fb.h] |
1.4.1.3、fb_fix_screeninfo
fb_fix_screeninfo:记录了用户不能修改的显示控制器的参数,这些参数是在驱动初始化时设置的
1 | [->\include\uapi\linux\fb.h] |
fb_ops是提供给底层设备驱动的一个接口。当我们编写一个FrameBuffer的时候,就要依照Linux FrameBuffer编程的套路,填写fb_ops结构体。
1 | [->\include\linux\fb.h] |
(二)、OpenGLES test App(Android OpenGLES Native层)
(2)、使用OpenGL ES绘制图像
2.1、源代码
OpenGLESTexturesRGB.cpp
1 |
|
2.2、编译测试
编译会生成OpenGLESTexturesRGB,然后进行测试。
1、连接adb
2、adb push OpenGLESTexturesRGB system/bin
3、进入adb shell
4、system/bin/OpenGLESTexturesRGB
2.3、显示效果
2.4、OpenGLESTexturesRGB代码分析
使用OpenGLES的绘图的一般步骤:
1、获取 EGL Display 对象:eglGetDisplay()
2、初始化与 EGLDisplay 之间的连接:eglInitialize()
3、获取 EGLConfig 对象:eglChooseConfig()
4、创建 EGLContext 实例:eglCreateContext()
5、创建 EGLSurface 实例:eglCreateWindowSurface()
6、连接 EGLContext 和 EGLSurface:eglMakeCurrent()
7、使用 OpenGL ES API 绘制图形:Draw()
8、切换 front buffer 和 back buffer 送显:eglSwapBuffer()
9、断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease()
10、删除 EGLSurface 对象
11、删除 EGLContext 对象
12、终止与 EGLDisplay 之间的连接
(三)、SurfaceFlinger test App(Android SurfaceFlinger Native层)
(3)、SurfaceFlinger合成图像
3.1、源代码
Transaction_test_red.cpp
1 |
|
绿色和蓝色的源码类似就不贴出啦,请直接看源码。
3.2、编译测试
编译会SurfaceFlingerTestsRed/Green/Blue生成
SurfaceFlingerTestsRed
SurfaceFlingerTestsGreen
SurfaceFlingerTestsBlue,然后分别进行测试。
1、连接adb
2、adb push SurfaceFlingerTestsRed system/bin
3、进入adb shell
4、system/bin/SurfaceFlingerTestsRed
3.3、显示效果
SurfaceFlingerTestsRed
SurfaceFlingerTestsGreen
SurfaceFlingerTestsBlue
同时运行三个bin文件
3.4、SurfaceFlingerTest代码分析
SurfaceFlinger涉及流程复杂,稍后另外博客再继续分析!
(四)、AMS、WMS test App(Android Apk Java层)
(4)、Apk测试AMS,WMS,SurfaceFlinger
4.1、源代码
**TestActivity.java &&TestView.java **
1 | public class TestActivity extends Activity { |
绿色和蓝色的源码类似就不贴出啦,请直接看源码。
4.2、编译测试
编译会TestViewportRed/Green/Blue apk生成
TestViewportRed.apk
TestViewportGreen.apk
TestViewportBlue.apk,然后分别进行测试。
1、连接adb
2、adb shell am start -n com.android.testred/.TestActivity
3、adb shell am start -n com.android.testgreen/.TestActivity
4、adb shell am start -n com.android.testblue/.TestActivity
4.3、显示效果
TestViewportRed.apk
TestViewportGreen.apk
TestViewportBlue.apk
同时运行三个apk
Android 默认运行Activity是全屏
要实现上述效果,需要修改源码
1 | diff --git a/frameworks/base/core/java/android/view/ViewRootImpl.java b/frameworks/base/core/java/android/view/ViewRootImpl.java |
说明:假如没有状态栏StatusBar和导航栏NavigationBar,测试结果就和之前完全一样啦,我们通过adb shell dumpsys SurfaceFlinger来查看大小可以验证。
1 | + BufferLayer (com.android.testred/com.android.testred.TestActivity#0) |
2.4、TestViewportX代码分析
APK涉及AMS,WMS,SurfaceFlinger流程复杂,稍后另外博客再继续分析!
(五)、参考资料(特别感谢):
(1)【高通Android平台-应用空间操作framebuffer dump LCD总结】
(2)【Linux 下framebuffer 帧缓冲的使用】
(3)【Android Framebuffer介绍及使用】