`

android系统学习笔记四

阅读更多

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"//输入设备的目录

处理时,搜索路径下面的所有inputboolEventHub::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的事件处理一般经过两个步骤

1input设备的整数类型事件转换成表示按键的字符串

键盘布局文件(*.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.hKeyEvent.java两个文件。还需要改tools/puppet_master/puppetMaster.nav_keys.py

/frameworks/base/core/res/res/values/attrs.xml

 

 

 

Surface系统

关系如下:

Libui提供本地的surface系统框架

Sufacefilnger完成本地接口的实现

Java框架层主要调用surfaceUI提供接口

本地部分可以使用ISurface接口

Surface系统的本地接口未看完?????

 

surfaceFlinger本地代码(未看完?????????)

整体结构

SurfaceFilingersurface部分的本地实现,

代码路径为:/frameworks/base/libs/surfaceflinger_client/surfaceFlinger

生成目标的动态库为:libsurfaceflinger.so没有头文件,外部进行调用的接口是libui的头文

 

 

 

Skia2D图形系统

Android2D系统的底层由skia本地库实现,通过JNIjava层提供图形功能接口,

 

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用来描述颜色和样式

 

 

 

AndroidOpenGL系统和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框架代码

 

AndroidOpenGL的实现方式

使用软件库(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

函数定义形式:

 

 

 

AndroidOpenGL的本地测试代码

测试代码的路径为:

/frameworks/base/opengl/tests

Angelesfilterfinishtexturestritex

 

 

OpenGLJNI代码

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

openGljava标准类是javax中的一部分,路径分别是:

/frameworks/base/opengl/java/javax/microedition/khronos/opengles/主要文件是:GL10GL11
/frameworks/base/opengl/java/javax/microedition/khronos/egl主要文件是:EGL10EGL11

 

Android中继承方法实现OpenGL标准类,路径为:

/frameworks/base/opengl/java/com/google/android/gles_jni

该路径下的文件的各个类对java标准类的继承关系为:

PublicclassGLImplimplementsGL10,GL10Ext,GL11,GL11Ext,GL11ExtensionPack{}

publicclassEGLSurfaceImplextendsEGLSurface{}

publicclassEGLImplimplementsEGL10EGLConfigImpl.ExtendsEGLConfig{}

publicclassEGLConfigImplextendsEGLConfig{}

publicclassEGLContextImplextendsEGLContext{}

androidjava应用层,不会调用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 系统相关学习笔记.zip

    Android 系统相关学习笔记.zip

    android系统模块之Contacts的学习笔记

    android系统模块之Contacts的学习笔记

    android开发学习笔记

    本人做android也有两年了,主要做智能机系统级开发,期间也承包了一些项目,对于如何学好android,以及学好android后如何开启自己的致富之门也能起到抛砖引玉的作用,欢迎大家加入,积极发言讨论,积极解决他人的...

    Android学习笔记.doc Android学习笔记.doc

    Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...

    Pro Android学习:Menu

    是Pro Android学习笔记Menu系统的例子代码

    android入门学习笔记-永远不变的helloworld、初识activity

    本资源是上课时的笔记,系统的讲述了android。想学习andorid的新手可以载下来供参考使用

    Android知识系统总结+最佳学习线路图+实例+全程开发笔记

    Android知识系统总结+最佳学习线路图+实例+全程开发笔记Android知识系统总结+最佳学习线路图+实例+全程开发笔记

    Android学习笔记.doc

    Android platform是一个用于开发移动程序的软件包,它包括了操作系统、中间件及一些关键应用。开发者能使用android SDK为Android platform开发应用,这些应用使用JAVA语言书写,运行在虚拟机Dalvik(一个专为手机程序...

    android 系统笔记.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    android 学习笔记

    使用系统自带意图对象完成: Intent intent=new Intent(); intent.setAction("android.intent.action.Call"); intent.setData(Uri.parse("tel:"+i)); startActivity(Intent); 权限: &lt;uses-permission ...

    黑马程序员之android学习笔记--用户界面 View(一).docx

    黑马程序员之android学习笔记--用户界面 View(一).docx

    Android Map开发基础知识学习笔记

    本教程适用于Android Map学习的初学者,这是一本很平易近人的Android入门书籍,也是开发者及非开发者两相宜的实务书籍,它能陪伴你顺利入门,并驰骋于无限宽广的Android系统和应用领域

    第一行代码—Android第二版学习笔记

    Android 第一行代码学习笔记第一章 概述1.1安卓系统架构1.2Android四大组件1.3项目结构1.4app目录结构1.5 项目运行原理1.6 res目录详解1.7日志工具的使用第二章 活动2.1 创建基本活动2.2 使用Intent在活动之间跳转...

    Android知识系统总结

    里面包含7个常见android应用程序源代码,android学习笔记,开发入门实践,入门书籍等很有用的资料。

    Android学习笔记之——Content Providers

    之前博文《 Android学习笔记之——Android Studio的安装(3.6版本)、Java的基本语法及Android的概述 》曾经介绍过android有四大组件。本博文学习一下Content Providers(内容提供器) 目录 Android运行时 ...

    2021-学习相关-Android 局域网简易云端笔记系统源码.zip

    2021-学习相关-Android 局域网简易云端笔记系统源码.zip

    AOSP Android系统定制裁剪笔记.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    android移植到特定平台学习笔记

    android移植到Cortex-A8平台,手把手开发步骤,从安装编译器,配置环境变量,编译uboot,kernel,android文件系统详细步骤和修改的文件。最后是将镜像烧入SD卡等详细步骤!好东西不容错过

    Android代码-Android_Learning_Notes

    这是我的安卓学习笔记。 开始时间:2016-9-11 计划:一个半月 文章目录: 基础知识 1、Android01--搭建Android开发环境 2、Android02--认识Activity 3、Android03--Context和Application 4、Android04--Android服务 ...

Global site tag (gtag.js) - Google Analytics