android简易双屏支持【转】
本文转载自: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简易双屏支持【转】的更多相关文章
- Android应用如何支持屏幕多尺寸多分辨率问题
作为Android应用程序开发者都知道android是一个“碎片化”的世界.多种系统版本.多种尺寸.多种分辨率.多种机型,还有不同的厂商定制的不同ROM,你开发的应用会在不可预期的手机上报错.这给开发 ...
- android support Percent支持库开发
Android的布局支持百分比的设置进行开发,来学习如何去实现它,不过看起来会像网页的设置,比如宽度的设置属性是`layout_widthPercent`.在此之前,我们一般都会设置Linearlay ...
- tlplayer for android V2.7(支持变速不变调) 2014-07-20更新
2014-07-20新版本已经修复部分视频倾斜问题,已经更新到服务器,需要的朋友自行下载. 此版本修正了倾斜问题,增加水印等功能.可以动态添加水印. tlplayer for android V2.6 ...
- android 布局如何支持多种不同屏幕尺寸
android 布局如何支持多种不同屏幕尺寸 --关于dp.layout-xxx.drawable-xxx作用的小结 转载自:http://blog.csdn.net/vincent_blog/art ...
- Android简易记事本
此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改, ...
- Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客 之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话< AsyncTask异步倒计时&g ...
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
- Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》
之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...
- Android简易实战教程--第一话《最简单的计算器》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51707931 从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专 ...
随机推荐
- fastclick.js插件使用
引入插件步骤 ①在HTML页面中添加 <script type='application/javascript' src='/path/to/fastclick.js'></scr ...
- 题解 洛谷P4035/BZOJ1013【[JSOI2008]球形空间产生器】
题目链接在这QvQ "你要求出这个n维球体的球心坐标",这使我想到的解方程...... 先假设n=2,这是一个二维平面.设圆心的坐标为\((x,y)\),有两个坐标\((a_1,b ...
- 全国高校绿色计算大赛 预赛第三阶段(Python)(随机数)
只提交了随机数 (真心不会 T-T ) import csv import random import pandas as pd import numpy as np # 预测结果文件:src/ste ...
- 基于Docker Compose搭建mysql主从复制(1主2从)
系统环境 * 3 Ubuntu 16.04 mysql 8.0.12 docker 18.06.1-ce docker-compose 1.23.0-rc3 *3 ==> PS ###我用的是 ...
- Jquery 动态添加元素后,获取不到元素对象情况
- linux 命令终端提示符显示-bash-4.2#解决方法
原地址:http://blog.csdn.net/liulihui1988/article/details/52796395 终端提示符显示的是-bash-4.2# 而不是root@主机名 + 路径的 ...
- LeetCode1---两数之和
import java.util.Arrays;import java.util.HashMap;import java.util.Map; /** *功能描述 :两数之和 * @author lkr ...
- SpringMVC Controller的返回类型
Controller的三种返回类型中 ModelAndView类型 带数据带跳转页面 String 跳转页面不带数据 void 通常是ajax格式请求时使用 1返回ModelAndView contr ...
- 集训第六周 古典概型 期望 D题 Discovering Gold 期望
Description You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell o ...
- 【转】关于LIS和一类可以用树状数组优化的DP 预备知识
原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法 ...