- 浏览: 250654 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
Android的GUI系统
AndroidGUI系统综述
C语言部分包括:
pixelFlinger(下层工具库)
头文件/system/core/include/pixelflinger其生成的动态库libpixelflinger.so只连接
C语言库libcutils
Format.h提供像素格式的定义,
Pixelflinger.h提供接口功能的定义
源代码/system/core/libpixelflinger
Libui(GUI的框架库)
头文件:/system/core/libpixelflinger/ui
源代码:/frameworks/base/libs/ui
编译后生成libui.so连接libpiselflinger.so
包含了颜色格式头文件:pixelformat.hpoint.hregion.hrect.hdisplayinfo.h
egl窗口(用于显示)
按健及事件处理(key/Event)头文件:eventhub.hkeycodelabels.h
keycharactermap.h
Suface(显示界面)
overlay(显示叠加层接口)iOverlay.hOverlay.h
camera(照像机接口)
SurfaceFlinger(surface的管理和处理)
Skia图形图像引擎
OpenGL3D引擎
各种JNI接口
GUI系统的几个本地库中,libui是提供接口的框架库,所涉及的java框架层的主要内容:
Android.graphics(对应Skia底层库,提供绘图接口)
Android.view.surface(构建显示界面)
Android.view.view(各种UI元素有基类)
Javax.microdition.khronos.opengles(标准OpenGL接口)
输入/输出与硬件的接口
显示输出的硬件接口
对于android的显示部分,需要实现的接口是:egl_mative_window_t(是一个OPENGL结构)
也给libEGL使用
输入的硬件接口
向上层提供统一的按键码(keyCode),这个按键码是一个整数,在libui中,通过标准的input
驱动来处理input的值转按成android系统的按键码,按键码参考KeyCharacterMap.h
/frameworks/base/include/ui/KeycodeLabels.h按键码的对照
structKeycodeLabel{
constchar*literal;
intvalue;
};
staticconstKeycodeLabelKEYCODES[]={
{"SOFT_LEFT",1},
{"SOFT_RIGHT",2},
{"HOME",3},
{"BACK",4},
{"CALL",5},
{"ENDCALL",6},
{"0",7},
{"1",8},
{"2",9},
{"3",10},
{"4",11},
{"5",12},
{"6",13},
{"7",14},
{"8",15},
{"9",16},
{"STAR",17},
{"POUND",18},
{"DPAD_UP",19},
{"DPAD_DOWN",20},
{"DPAD_LEFT",21},
{"DPAD_RIGHT",22},
{"DPAD_CENTER",23},
{"VOLUME_UP",24},
{"VOLUME_DOWN",25},
{"POWER",26},
{"CAMERA",27},
{"CLEAR",28},
{"A",29},
{"B",30},
{"C",31},
{"D",32},
{"E",33},
{"F",34},
{"G",35},
{"H",36},
{"I",37},
{"J",38},
{"K",39},
{"L",40},
{"M",41},
{"N",42},
{"O",43},
{"P",44},
{"Q",45},
{"R",46},
{"S",47},
{"T",48},
{"U",49},
{"V",50},
{"W",51},
{"X",52},
{"Y",53},
{"Z",54},
{"COMMA",55},
{"PERIOD",56},
{"ALT_LEFT",57},
{"ALT_RIGHT",58},
{"SHIFT_LEFT",59},
{"SHIFT_RIGHT",60},
{"TAB",61},
{"SPACE",62},
{"SYM",63},
{"EXPLORER",64},
{"ENVELOPE",65},
{"ENTER",66},
{"DEL",67},
{"GRAVE",68},
{"MINUS",69},
{"EQUALS",70},
{"LEFT_BRACKET",71},
{"RIGHT_BRACKET",72},
{"BACKSLASH",73},
{"SEMICOLON",74},
{"APOSTROPHE",75},
{"SLASH",76},
{"AT",77},
{"NUM",78},
{"HEADSETHOOK",79},
{"FOCUS",80},
{"PLUS",81},
{"MENU",82},
{"NOTIFICATION",83},
{"SEARCH",84},
{"MEDIA_PLAY_PAUSE",85},
{"MEDIA_STOP",86},
{"MEDIA_NEXT",87},
{"MEDIA_PREVIOUS",88},
{"MEDIA_REWIND",89},
{"MEDIA_FAST_FORWARD",90},
{"MUTE",91},
{"PAGE_UP",92},
{"PAGE_DOWN",93},
{"PICTSYMBOLS",94},
{"SWITCH_CHARSET",95},
{"BUTTON_A",96},
{"BUTTON_B",97},
{"BUTTON_C",98},
{"BUTTON_X",99},
{"BUTTON_Y",100},
{"BUTTON_Z",101},
{"BUTTON_L1",102},
{"BUTTON_R1",103},
{"BUTTON_L2",104},
{"BUTTON_R2",105},
{"BUTTON_THUMBL",106},
{"BUTTON_THUMBR",107},
{"BUTTON_START",108},
{"BUTTON_SELECT",109},
{"BUTTON_MODE",110},
//NOTE:Ifyouaddanewkeycodehereyoumustalsoaddittoseveralotherfiles.
//Refertoframeworks/base/core/java/android/view/KeyEvent.javaforthefulllist.
{NULL,0}
};
//SeealsopolicyflagsinInput.h.
staticconstKeycodeLabelFLAGS[]={
{"WAKE",0x00000001},
{"WAKE_DROPPED",0x00000002},
{"SHIFT",0x00000004},
{"CAPS_LOCK",0x00000008},
{"ALT",0x00000010},
{"ALT_GR",0x00000020},
{"MENU",0x00000040},
{"LAUNCHER",0x00000080},
{"VIRTUAL",0x00000100},
{NULL,0}
};
EventHub.cpp定义设备节点所在的路径
Staticconstchar*device_path="/dev/input"//输入设备的目录
处理时,搜索路径下面的所有input在boolEventHub::openPlatformInput(void)
{
/*
*Openplatform-specificinputdevice(s).
*/
intres;
mFDCount=1;
mFDs=(pollfd*)calloc(1,sizeof(mFDs[0]));
mDevices=(device_t**)calloc(1,sizeof(mDevices[0]));
mFDs[0].events=POLLIN;
mFDs[0].revents=0;
mDevices[0]=NULL;
#ifdefHAVE_INOTIFY
mFDs[0].fd=inotify_init();
res=inotify_add_watch(mFDs[0].fd,device_path,IN_DELETE|IN_CREATE);
if(res<0){
LOGE("couldnotaddwatchfor%s,%s\n",device_path,strerror(errno));
}
#else
/*
*ThecodeinEventHub::getEventassumesthatmFDs[0]isaninotifyfd.
*Weallocatespaceforitandsetittosomethinginvalid.
*/
mFDs[0].fd=-1;
#endif
res=scanDir(device_path);//查找设备
if(res<0){
LOGE("scandirfailedfor%s\n",device_path);
}
returntrue;
}
从目录中查找设备
intEventHub::scanDir(constchar*dirname)
{
chardevname[PATH_MAX];
char*filename;
DIR*dir;
structdirent*de;
dir=opendir(dirname);
if(dir==NULL)
return-1;
strcpy(devname,dirname);
filename=devname+strlen(devname);
*filename++='/';
while((de=readdir(dir))){
if(de->d_name[0]=='.'&&
(de->d_name[1]=='\0'||
(de->d_name[1]=='.'&&de->d_name[2]=='\0')))
continue;
strcpy(filename,de->d_name);
openDevice(devname);//打开设备
}
closedir(dir);
return0;
}
事件的处理主要是在getEvent()方法中,处理过程是一个无限循环,调用阻塞函数来等待事件
部分代码如下:
intpollResult=poll(mFDs,mFDCount,-1);
acquire_wake_lock(PARTIAL_WAKE_LOCK,WAKE_LOCK_ID);
if(pollResult<=0){
if(errno!=EINTR){
LOGW("pollfailed(errno=%d)\n",errno);
usleep(100000);
}
}
Android的事件处理一般经过两个步骤
1将input设备的整数类型事件转换成表示按键的字符串
键盘布局文件(*.kl)完成第一步的转换,路径为目标文件系统的system/usr/keylayout
Qwert.kl全键盘对应键值,其中第二列的整数表示驱动程序中Event事件的名称,
第三列表示在KEYCODESK数组中对应的literal
这里完成了驱动程序的事件到字符串的转换
2将表示按建的字符串转换成android的键盘码
keycodelable.h(记录键值,位于/frameworks/base/include/ui)
通过查KEYCODES数组(keyCharacterMap.h,其目录为/framework/base/core./java/android/view/keyevent.java),将literal字符串转换成value整数值
不同系统的开发,对于不同的硬件,只需要写不同的键盘布局即可(让驱动程序中的整数值对应到android的按键名称上)
如果需要增加按键在用户程序中进行处理,除了keyCharacterMap.h和KeyEvent.java两个文件。还需要改tools/puppet_master/puppetMaster.nav_keys.py
/frameworks/base/core/res/res/values/attrs.xml
Surface系统
关系如下:
Libui提供本地的surface系统框架
Sufacefilnger完成本地接口的实现
Java框架层主要调用surface向UI提供接口
本地部分可以使用ISurface接口
Surface系统的本地接口未看完?????
surfaceFlinger本地代码(未看完?????????)
整体结构
SurfaceFilinger是surface部分的本地实现,
代码路径为:/frameworks/base/libs/surfaceflinger_client/surfaceFlinger
生成目标的动态库为:libsurfaceflinger.so没有头文件,外部进行调用的接口是libui的头文
件
Skia和2D图形系统
Android的2D系统的底层由skia本地库实现,通过JNI向java层提供图形功能接口,
Skia底层库(是一个底层的图形,图像,动画,SVG,文本等多方面的图形库,是一个c++本地库)
代码路径为:external/skia
包含三个库:
Libcorecg.soCoreCg核心图形库(调试信息,数学计算,内存管理,)
Liblibsgl.soGL(Skia图形库,)
其原码文件主要在:
Libskiagl.soskia-openglgluelibrary
Android图形系统的JNI接口
路径为:
/frameworks/base/core/jni/android/graphics
Canvas中的initRaater()和initGl()两个函数与skia本地库联系起来
staticSkCanvas*initRaster(JNIEnv*env,jobject,SkBitmap*bitmap){
returnbitmap?newSkCanvas(*bitmap):newSkCanvas;
}
staticSkCanvas*initGL(JNIEnv*env,jobject){
returnnewSkGLCanvas;
}
Android的图形包
路径为;
/frameworks/base/graphics/java/android/graphics
当draw内容时需要的四个组件:
Bitmap保持像素
Canvas处理调用
(rect,path,text,bitmap)绘制内容
Paint用来描述颜色和样式
Android的OpenGL系统和3D图形系统
本地代码
头文件四路径为:/frameworks/base/opengl/include/EGL
/frameworks/base/opengl/include/GLES
源代码的目录为:/frameworks/base/opengl/libagl
/frameworks/base/opengl/libs
编译后,本地代码将会产生三个库:
libGLESv1_CM.so对应GLES
libEGL.so对应EGL
Java框架代码
Android的OpenGL的实现方式
使用软件库(libagl.so)
使用硬件库(libhgl.so)
Egl.cpp文件中gl-hooks_t结构描述了OpenGL所支持的各种API
实际的符号在gl_entries.int
函数的定义形:
GL_ENTRY(void,//返回值
glColor4f,//名称
GLfloatred,GLfloatgreen,GLfloatblue,GLfloatalpha)//参数列表
Egl_entries.in
函数定义形式:
Android的OpenGL的本地测试代码
测试代码的路径为:
/frameworks/base/opengl/tests
Angelesfilterfinishtexturestritex
OpenGL的JNI代码
OpenGL引擎向上提供的JNI接口,供java调用,主要由两个文件提供
/frameworks/base/core/jni/com_google_android_gles_jni_EGLImpl.cpp(管理功能)
/frameworks/base/core/jni/com_google_android_gles_jni_GLImpl.cpp(功能函数)
openGl中的java类
openGl的java标准类是javax中的一部分,路径分别是:
/frameworks/base/opengl/java/javax/microedition/khronos/opengles/主要文件是:GL10和GL11
/frameworks/base/opengl/java/javax/microedition/khronos/egl主要文件是:EGL10和EGL11
Android中继承方法实现OpenGL标准类,路径为:
/frameworks/base/opengl/java/com/google/android/gles_jni
该路径下的文件的各个类对java标准类的继承关系为:
PublicclassGLImplimplementsGL10,GL10Ext,GL11,GL11Ext,GL11ExtensionPack{}
publicclassEGLSurfaceImplextendsEGLSurface{}
publicclassEGLImplimplementsEGL10EGLConfigImpl.ExtendsEGLConfig{}
publicclassEGLConfigImplextendsEGLConfig{}
publicclassEGLContextImplextendsEGLContext{}
在android的java应用层,不会调用com.google.android.gles_jni路径下的类,
只会调用/frameworks/base/opengl/java/javax/microedition/khronos/opengles下的接口
openGL标准接口到android系统的媒介(通过调用com.google.android.gles_jn下的类和android基础gui系统的类实现了GLsurfaceView)
/frameworks/base/opengl/java/android/opengl
publicclassGLSurfaceViewextendsSurfaceViewimplementsSurfaceHolder.Callback{}
所以GLSurfaceView()也是一个ui元素
如果是在应用层使用openGL,就是继承GLSurfaceView类并调用OpenGL的标准接口
发表评论
-
android系统学习笔记一
2012-09-03 15:01 8751.android的系统架构(linux2.6内核) Lin ... -
android系统学习笔记二
2012-09-03 15:03 888android的linux内核和驱动程序 Androidr专 ... -
android系统学习笔记三
2012-09-03 15:05 804第四章android的底层库和程序 知识点: And ... -
android系统学习笔记五
2012-09-03 15:12 2157android中的audio系统 Audo系统主要分如下几 ... -
android系统学习笔记六
2012-09-03 15:16 2189android的多媒体系统 ... -
android系统学习笔记七
2012-09-03 15:18 704Android电话部分综述 主 ... -
android系统学习八
2012-09-03 15:19 723Android的联接部分 Wifi部分 Wif ... -
android系统学习笔记九
2012-09-03 15:21 720蓝牙部分 蓝牙协议栈1.11.22.02.13.0 异步数 ... -
android系统学习笔记十一
2012-09-03 15:22 1425Gps(globalPositionSystem全球定位系统) ... -
android系统学习笔记十二
2012-09-03 15:23 996Android的传感器系统 ... -
Android编译系统详解(一)
2012-09-10 13:45 759+++++++++++++++++++++++++++++ ... -
android----ServiceManager
2012-09-18 00:33 4293serviceManager 在c++层如何使用servi ... -
android 自定义核心服务
2012-09-18 23:27 775native service zygote 服务 kern ... -
android系统移植学习笔记一
2012-09-21 16:08 611系统框架 applicationjava应用程序 ...
相关推荐
Android 系统相关学习笔记.zip
android系统模块之Contacts的学习笔记
本人做android也有两年了,主要做智能机系统级开发,期间也承包了一些项目,对于如何学好android,以及学好android后如何开启自己的致富之门也能起到抛砖引玉的作用,欢迎大家加入,积极发言讨论,积极解决他人的...
Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...
是Pro Android学习笔记Menu系统的例子代码
本资源是上课时的笔记,系统的讲述了android。想学习andorid的新手可以载下来供参考使用
Android知识系统总结+最佳学习线路图+实例+全程开发笔记Android知识系统总结+最佳学习线路图+实例+全程开发笔记
Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...
操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...
使用系统自带意图对象完成: Intent intent=new Intent(); intent.setAction("android.intent.action.Call"); intent.setData(Uri.parse("tel:"+i)); startActivity(Intent); 权限: <uses-permission ...
黑马程序员之android学习笔记--用户界面 View(一).docx
本教程适用于Android Map学习的初学者,这是一本很平易近人的Android入门书籍,也是开发者及非开发者两相宜的实务书籍,它能陪伴你顺利入门,并驰骋于无限宽广的Android系统和应用领域
Android 第一行代码学习笔记第一章 概述1.1安卓系统架构1.2Android四大组件1.3项目结构1.4app目录结构1.5 项目运行原理1.6 res目录详解1.7日志工具的使用第二章 活动2.1 创建基本活动2.2 使用Intent在活动之间跳转...
里面包含7个常见android应用程序源代码,android学习笔记,开发入门实践,入门书籍等很有用的资料。
之前博文《 Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述 》曾经介绍过android有四大组件。本博文学习一下Content Providers(内容提供器) 目录 Android运行时 ...
2021-学习相关-Android 局域网简易云端笔记系统源码.zip
操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...
android移植到Cortex-A8平台,手把手开发步骤,从安装编译器,配置环境变量,编译uboot,kernel,android文件系统详细步骤和修改的文件。最后是将镜像烧入SD卡等详细步骤!好东西不容错过
这是我的安卓学习笔记。 开始时间:2016-9-11 计划:一个半月 文章目录: 基础知识 1、Android01--搭建Android开发环境 2、Android02--认识Activity 3、Android03--Context和Application 4、Android04--Android服务 ...