本文转载自:http://blog.csdn.net/sfrysh/article/details/7463339

抱歉,之前说xorg的exa更新的时候恐怕一直不会更新了,
没有做xorg开发了。
转向android了。

最近断断续续做了一些杂七杂八的android事情,都是一些不太容易的事情。

简单的写了以下,android双屏的简易支持。
纲领性的一些东西吧。
简单双屏的支持。

和下面这种不一样哦
http://www.xici.net/main.asp?url=/u13971417/d101558450.htm
这种看起来完全是假的双屏,android完全运行在自己的屏幕上面,和主屏幕没有太直接的关系.
看起来更像双系统,而不是android的双屏。成本怕是很高的。

看,这个是两个独立的系统。
http://www.gadgetlite.com/2009/11/06/spring-design-dual-display-android/

国内国外好像还没有人做真双屏的工作(额,我好像总在做这样的事情呢)

简易的真双屏支持

有一说一,总体方案是同事定的,具体模块自己调查实现。
我对android的framework是很不熟悉,刚转过来,暂时看
surfaceflinger以及以下的一些东西。

目前只说display这边。如果要完整支持的话,需要做不少事情,比如事件处理Eventhub
,比如activity的管理。

按照计划是实现两个surfaceflinger的线程
每个surfaceflinger管理一个单独的硬件,也就是说,两个屏幕是单独运转的,互不干扰
surfaceflinger0管理原始的屏幕,surfaceflinger1管理第二个屏幕。
当然这个是因为google官方不支持,我们的一个偏门的支持办法。用display来区分不同的硬件。
也无法跨屏幕来显示东西。
两个屏幕之间可以通信,但是无法跨硬件显示。

上层应用调用的方法如下,比如animation的测试程序,以前是这样的。

BootAnimation::BootAnimation() : Thread(false)
{
    mSession = new SurfaceComposerClient();
}

如果我们要这个程序跑在第二个屏幕上面,程序需要做如下的修改。

BootAnimation::BootAnimation() : Thread(false)
{
    mSession = new SurfaceComposerClient(1);
}

上面是直接使用surfaceflinger的情况,如果需要应用自己做,则需要在上面的activemanager里面来做了,提供api给程序,设置当前程序的运行屏幕。

需要修改的模块如下
1:surfaceflinger
以前只添加一个服务surfaceflinger
现在需要再多添加一个服务surfaceflinger1
每个surfaceflinger知道自己所管理的硬件。

2:还有就是composer service也需要加入对应的逻辑。
3:framebuffer native window的逻辑

4:displayhardware的管理。
SurfaceFlinger初始化的时候会初始化硬件,id是surfaceflinger传递过来的。
两个surfaceflinger服务会初始化两个硬件,当然可以扩展到更多。

5:layer的处理
layer里面需要知道自己是属于哪个硬件的,是哪个设备里面的layer。

6:hardware模块的处理(gralloc模块)
主要是framebuffer open和gralloc。主要是设备的map,显存分配等等。
gralloc是一个单独的模块,和surfaceflinger,composerservice (libui,libsurfaceflinger等等和gralloc直接无法直接通信)等等无法直接通信。
Surfaceflinger到Displayhardware之后会dlopen这个模块。沟通的唯一的接口是gralloc这个hw_module_t里面的open函数,
只有这一个函数。几乎所有的地方都假定只有一个fb硬件,所以需要增加相关的逻辑。这里使用的还是全局变量。使用dlsym来获取的。

7:EGL的多display的支持。
目前如果不传递EGL_DEFAULT_DISPLAY的话,egl会直接返回错误。
其他还有不少逻辑也需要修改,主要是初始化部分的。真正运行起来之后,都是按照context的,可以理解为对象,都是自包含的,不怕display的问题。

8:模拟器支持多个硬件屏幕。
这个是在qemu里面改的,google这里改的还比较多,需要增加一个fb设备。

9:实现测试程序
直接改bootanimation就可以了。
验证的办法就是看fb1里面的东西是否被egl正常渲染进去了
当然,原来的程序都要是可以正常运行的,也就是说加了
一个屏幕,原始的屏幕要保持正常,新的屏幕也要可以正常
运行。

cat /dev/graphics/fb1 >/data/fb1
./adb pull /data/fb1 /tmp/fb1

ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 800x600 -i fb1 -f image2 -vcodec png image%d.png

看看,应该能看到bootanimation的东西了。

双屏模拟器UI还没开发出来,目前只能这么验证。
这里fb1的virtual_size是fb1分辨率的两倍,所以取出来是两个的大小,这也是上面为什么用%d的原因,egl拿来一个作backbuffer
一个做frontbuffer的。我这个fb1是创建成了800x600

fb0的东西,也就是第一屏的东西
# cat /dev/graphics/fb0 >/data/fb0
ailantian@vax:~/soft/android/android-2.2/out/host/linux-x86/sdk/android-sdk_eng.ailantian_linux-x86/tools$ ./adb pull /data/fb0 /tmp/fb0
1308 KB/s (614400 bytes in 0.458s)
ailantian@vax:/tmp$ ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 320x480 -i fb0 -f image2 -vcodec png image-fb0%d.png

注意,有时候fb设备里面的内容并不能忠实反应屏幕上面的东西
尤其是有硬件加速的时候,硬件锁住的时候是一个奇怪的东西。

至于主要的文件修改列表如下

android/skin/file.c
android/skin/file.h
cmds/bootanimation/BootAnimation.cpp
framebuffer.c
hardware.c
hw/android_arm.c
hw/goldfish_fb.c
include/hardware/gralloc.h
include/hardware/hardware.h
include/ui/FramebufferNativeWindow.h
include/ui/SurfaceComposerClient.h
liblog/logprint.c
libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
libs/surfaceflinger/LayerBase.cpp
libs/surfaceflinger/LayerBase.h
libs/surfaceflinger/LayerBlur.cpp
libs/surfaceflinger/LayerBuffer.cpp
libs/surfaceflinger/Layer.cpp
libs/surfaceflinger/LayerDim.cpp
libs/surfaceflinger/LayerDim.cpp
libs/surfaceflinger/Layer.h
libs/surfaceflinger/SurfaceFlinger.cpp
libs/surfaceflinger/SurfaceFlinger.h
libs/ui/FramebufferNativeWindow.cpp
libs/ui/GraphicBuffer.cpp
libs/ui/SurfaceComposerClient.cpp
libs/ui/Surface.cpp
modules/gralloc/framebuffer.cpp
modules/gralloc/gralloc.cpp
modules/gralloc/gralloc_priv.h
opengl/libagl/egl.cpp
opengl/libs/EGL/egl.cpp
opengl/libs/hooks.h

恩,也是刚转型做android,只能RTFS(read the fucking source)
android的代码还是很大的(2.5G),对这个框架也不了解,
另外就是c++也好多年不做了,实际上以前从来没做过实际项目,也遇到一些基本语法问题。
不过搜索引擎还是很不错的。
不喜欢c++的风格,一个函数实现多种功能,看代码的时候结构不清楚。

为什么不用一个surfaceflinger来管理所有硬件?额,因为现在不了解android的framework。
要一下子做的很好怕是有困难。只能一步一步来了
如果google自己做的话,应该是一个surfaceflinger的来管理所有的硬件。而且这样结构也更
清楚,也是努力的方向。,两个surfaceflinger的缺点和优点也还是比较明显,两个是独立的线程
互相不影响,一个挂掉或者阻塞或者delay,另外一个也没事,context就需要两个了,另外就是多个gpu的话,这样会容易扩展一些。

因为gpu只有一个,egl只需要操作一个gpu就可以了,至于copyblit,以msm的芯片来说
可以在不同的fb里面随便搬运,egl也可以直接访问这些区域。所以一个surfaceflinger理论上
也是可行的,而且结构更好。

像android这样严重依赖多线程的设计,就最好不要使用静态全局变量,或者系统的全局变量。
不然扩展的时候很不方便。不过android目前的逻辑就是这样,所以扩展不方便

额,顺便说说其他的系统
1:moblin
最早是intel的kernel加上maemo的系统,最早intel没有自己的系统,
做了几个版本之后有了自己的系统,以前主打mid
应用慢慢迁移到clutter了

2:maemo
是nokia的开源的移动系统,做的不错。
最早的框架是基于gtk的,后来nokia收购了qt,慢慢打算迁移到qt base
主打大屏幕手机和mid
图形系统最早是kdrive,后来迁移到xorg

3:meego
是moblin和maemo的结合体。

3:iphone os
苹果的系统,据说和pc是一样的,感觉不能一样,mac os应该要定制过才能。

4:android
google的手机系统,手机上主要还是高通的芯片,可能有山寨的也说不定,其他做arm芯片厂家比较多
也有的能自己出android的bsp,有的则希望外包做bsp卖自己的芯片。
智能电视上也开始用了,大家比较看好nvidia的芯片
这里显示芯片有很大重要性,大多amd的也就是ati的,多家封装的是这个gpu核心
还有就是pvr的,主要是ti系列。还有就是arm自己也出gpu,也就是mali系列。
图形系统是新开发的,不是很完善

5:chrome os
怎么说呢,就是linux系统,图形系统是xserver,应用上完全精简了。
浏览器是核心应用,基本上没有人选择这个系统,除了demo之外,也就是大家展会上经常看到的

6:恩,暂时想不起来其他还有什么系统了

总有人拿android和iphone比较。
个人观点。
android是年轻人,iphone是中年人。
android的变化是很剧烈的,保留着很多开发者的痕迹,还谈不上美观。
很多东西还没有定下来。就个人爱好来说,喜欢开放型的系统。可以随意使用的系统,使用起来方便的系统。
不喜欢itunes。iphone也喜欢,但是喜欢的不是功能,而是那种感觉,就是这个系统用起来的时候
你就感觉他为人性化操作作了很多工作,虽然你有时候说不出来哪里好,但是的确就是用起来舒服。
就是你总会在某一天发现一个新的功能,觉得,恩,这个功能真不错。但是说明书上没有说到它
除了itunes带来的不便之外,不能随意copy东西,不能随意安装软件等等限制。

android的进步看得见,变化很大,但是成熟度不够,
iphone 4.0呢?没见过,可能会很好吧,但是对苹果的东西不要抱太大期望,某一点让你特别喜欢就好了

大家都想赚钱,有竞争是好事,不然苹果怕是多少年懒得改进

android简易双屏支持【转】相关推荐

  1. Android简易音乐重构MVVM Java版 -搭建项目(八)

    Android简易音乐重构MVVM Java版 -搭建项目(八) 关于 新版本配置 网易云音乐api版本更新 重构代码 新建app类继承Application 项目结构 定义BaseActivity. ...

  2. android天气搜索框,Android简易天气App

    原标题:Android简易天气App 前言 本打算是写一个贝塞尔曲线的demo,想了一下哪种场景可以直观的表现出贝塞尔曲线,想到天气预报中的那些24小时和未来几日天气变化正好适用.接着开始构思,开始是 ...

  3. Android Q 双屏异显

    Android Q 双屏异显 现在很多AR场景,需要扩展屏或者虚拟屏VD 进行展示3D画面,并通过手柄或者手机模拟的触摸板进行交互控制.从android官网多屏幕支持了解其android Q 已经有多 ...

  4. Android——简易照相机

    Android--简易照相机 实验名称:Android多媒体应用-拍照 实验目的:设计一个简易照相机 实验内容:利用Camera类设计一个简易照相机,通过SurfaceView组件实现取景预览,拍照保 ...

  5. Android之 双屏异显控制

    一 简介 1.1 我们用的手机基本上只有一个屏幕,那这里的双屏指的什么呢?其实现在手机都是支持双屏的,我们可以在开发者选项里面来打开这个控制,来看下什么是双屏. 可以打开设置 -> 开发者选项 ...

  6. android canvas 保存图片,ionic3 html5 video 抓图保存到手机相册,解决Android手机不支持Canvas drawImage问题...

    当然百度出上W条答案 上代码,相信下面代码和小伙伴大同吧 相信好多做webview app的小伙伴们都有同样的问题,在pc上能轻松实现video 抓图.但是在android手机大多是不支持canvas ...

  7. bitShark对Android版本的支持

    bitShark对Android版本的支持 bitShark是一款轻量级的Android数据抓包软件.使用该软件,可以随时随地抓取网络中的各种数据包,并进行各项分析.我们推出的bitShark手机数据 ...

  8. Android11还能自定义相机吗,安卓用户又少了一项自由,Android 11不再支持更改默认相机程序...

    原标题:安卓用户又少了一项自由,Android 11不再支持更改默认相机程序 来源:量子位 关注前沿科技 萧萧 发自 凹非寺 量子位 报道 | 公众号 QbitAI 萧萧 发自 凹非寺 量子位 报道 ...

  9. Qt添加对Android的OpenSSL支持

    Qt添加对Android的OpenSSL支持 添加对Android的OpenSSL支持 添加对Android的OpenSSL支持 Qt安装软件包附带OpenSSL支持,但由于某些国家/地区的法律限制, ...

最新文章

  1. jQuery Mobile和PhoneGap混合开发
  2. Wijmo 更优美的jQuery UI部件集:通过jsFiddle测试Wijmo Gauges
  3. 二级分类_iOS 13.3正式版,增加信息联系人二级分类,支持联通VoLTE功能
  4. 信息系统项目管理知识--项目时间管理
  5. 《Spring》(一)---- IOC基本概念
  6. 关于inet_ntop、inet_pton中的n和p分别代表的意义
  7. vue模板html,VueJS模板
  8. 2017-05-12-Linux文件操作
  9. powershell执行c语言文件,c语言中调用shell脚本
  10. Python学习之not,and,or篇
  11. Redis的高级应用-安全性和主从复制
  12. 已知三点求这三点构成三角形的外接圆圆心坐标
  13. DMA控制器原理详解
  14. 认知当下 原子世界的技术发展停滞了么
  15. 个人小程序和企业小程序
  16. 思科packet tracer 配置两个不同网段的pc通过两个路由器连接
  17. 1月第1周业务风控关注 | 四部门联合印发App违法违规收集使用个人信息行为认定方法
  18. 基于GPT2_Chinese文本自动生成
  19. excel 制作好看的图表
  20. (翻译)9种清晰直观的图标应用原则

热门文章

  1. 浙江大学远程教育计算机应用基础,浙江大学远程教育计算机应用基础.pdf
  2. 用c语言单链表编写贪吃蛇程序6,C语言链表实现贪吃蛇游戏
  3. android 悬浮窗 输入框_利用DecorView实现悬浮窗的效果
  4. 2020年Java讲课笔记目录
  5. 安卓学习笔记15:使用安卓应用程序资源
  6. VB案例:多功能文本处理器
  7. 数据库笔记09:Transact-SQL语言编程基础
  8. 图标截取——背景偏移量技术
  9. 【codevs4654】【BZOJ2442】修剪草坪,第一次的单调队列,优化DP
  10. 7.边缘检测:2D运算——回顾、高斯滤波器2D的导数、Sigma对导数的影响_1