系统原理与开发要点详解技术_第1页
系统原理与开发要点详解技术_第2页
系统原理与开发要点详解技术_第3页
系统原理与开发要点详解技术_第4页
系统原理与开发要点详解技术_第5页
已阅读5页,还剩455页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一部基础知第一部基础知第一部第一部基础知Android是包括一个操作第一部基第一部基础知第一部基第一部基础知第一部基础知开放第一部基础知开放源代码用于移植制作手丰富的资用于开发上层应应用程序的交易场第一部第一部基础知未来智能电话的发展方向媒体获取设概念性产第一部基础知第一部基础知Android技术上的优势使用众多的标准化技核心技术完整,统完善SDK和文完善的辅助开发工第一部基础知Android第一部基础知AndroidAndroid技术上的优势使用众多的标准化技核心技术完整,统AndroidAndroid完善SDK和文完善的辅助开发工Android移植开发手机系统应用程序开发Android系统开发第二部Android的开发工第二部Android的开发工②①手机Android系统手机系标准uAndroid系统手机系标准uAndroid系统Android系统AndroidAndroid系统开发:系统用户空内核空AndroidAndroid系统开发:系统用户空内核空AndroidSDKAndroidSDK第三部AndroidSDK第三部AndroidSDK与源代用于应用开发JAVA应用程序。第三部AndroidSDK与第三部AndroidSDK与源代AndroidSDKAndroid的AndroidSDKAndroid的知识结构(SDK方面语言知应用程序架GUI设计基础知各种视图的使图形应用程序的设计思AndroidSDKAndroidSDKLinux操作系统知Linux内核知识(C语言)Linux驱动程序知识(C语言)Dalvik虚拟机(C++JAVA)GUI系统(C++JAVA音频、视频和多媒体(C语言、C++JAVA连接部分(C语言CJAVA)传感器部分(C语言CJAVA)Android的应用开Android预系统应用Android手AndroidAndroid框架层软硬件抽象硬Android的应用开Android预系统应用Android手AndroidAndroid框架层软硬件抽象硬件抽象AndroidTouch/HW AndroidTouch/HW JavaJavaNativeNative Camera AndroidAndroidAndroid系统Android系统概第一部第二部第三部基础知Android的开发工AndroidSDK与源代第一部基础知第一部基础知第一部第一部基础知Android是包括一个操作第一部基第一部基础知第一部基第一部基础知第一部基础知开放第一部基础知开放源代码用于移植制作手丰富的资用于开发上层应应用程序的交易场第一部第一部基础知未来智能电话的发展方向媒体获取设概念性产第一部基础知第一部基础知Android技术上的优势使用众多的标准化技核心技术完整,统完善SDK和文完善的辅助开发工第一部基础知Android第一部基础知AndroidAndroid技术上的优势使用众多的标准化技核心技术完整,统AndroidAndroid完善SDK和文完善的辅助开发工Android移植开发手机系统应用程序开发Android系统开发第二部Android的开发工第二部Android的开发工②①手机Android系统手机系标准uAndroid系统手机系标准uAndroid系统Android系统AndroidAndroid系统开发:系统用户空内核空AndroidAndroid系统开发:系统用户空内核空AndroidSDKAndroidSDK第三部AndroidSDK第三部AndroidSDK与源代用于应用开发JAVA应用程序。第三部AndroidSDK与第三部AndroidSDK与源代AndroidSDKAndroid的AndroidSDKAndroid的知识结构(SDK方面语言知应用程序架GUI设计基础知各种视图的使图形应用程序的设计思AndroidSDKAndroidSDKLinux操作系统知Linux内核知识(C语言)Linux驱动程序知识(C语言)Dalvik虚拟机(C++JAVA)GUI系统(C++JAVA音频、视频和多媒体(C语言、C++JAVA连接部分(C语言CJAVA)传感器部分(C语言CJAVA)Android的应用开Android预系统应用Android手AndroidAndroid框架层软硬件抽象硬Android的应用开Android预系统应用Android手AndroidAndroid框架层软硬件抽象硬件抽象AndroidTouch/HW AndroidTouch/HW JavaJavaNativeNative Camera AndroidAndroidAndroidAndroidAndroidAndroid的系统架Android源代码的开发环第一部第二部AndroidAndroidAndroid软件结第四层软件结第四层Java应用程第三层Java框第二层本地框架和Java第一层Linux操作系统及驱/C实现34Java代码实现。12Linux操作系统的角1234Android3层次以下的内容是不可见的,仅考虑系统API即可。软件结Linux操作系统和驱动:软件结Linux操作系统和驱动:的核心系统服务内核,如安赖性,内存管理,进程管理网络内核议栈和驱动模型同时作为硬件和软件栈之间的抽层软件结Android本地框架(C/C):软件结Android本地框架(C/C):C继承来的标准CPacketVideoOpenCORESurfaceManagerWebCorewebSGL:Skia2D3Dlibraries:基于OpenGLFreeType:位图(bitmap)和矢量(vector)。软件结运行库:Android软件结运行库:Android行,都拥有一个独立的Dalvik虚Dalvik虚拟机执行(.dex)的Dalvik可执行文件JAVASDKAndroid应用程序框架Android应用程序框架,包括列表(lists),网格(grids),文本框(textboxes),按钮内容提供器(ContentProviders):使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据资源管理器(ResourceManager):如本地字符串,图形,和布局文件layoutfiles)(NotificationManager):活动管理器ActivityManager)AndroidAndroid应用程序:Android会同一系列核心应用程序的应用程序,主要包括email客户程序都是使用JAVA语言编写的。1.2Androidaapt(1.2Androidaapt(AndroidAssetPackagingTool进制的assets。abd(AndroidDebugBridge,Android调试桥使用Adb工具可以在模拟器或设备上安装应用程序的.apk件,并从命令行访问模拟器或设备。也可以用它把Android模器或设备上的应用程序代码和一个标准的调试器连接在android工具1.2AndroidAIDL1.2AndroidAIDL工具(AndroidInterfaceDescriptionLanguageAndroid接口描述语言),可以生成进程间的接口的代码,诸如service可能使用的接口AVDs(AndroidVirtualDevices,Android虚拟设备用于配置仿真器的选项,使用实际的设备(DalvikDebugMonitorServiceDalvik调试监视器服务这个工具集成了Dalvik,能够在模拟器或者设备上管理进踪数据,观察堆(heap)和线程信息,截取模拟器或设备的屏幕面,还有更多的功能1.2Android1.2Android存在.dex文件中)。Android字节码(Draw9-Draw9-patch工具允许使用所见即所得(WYSIWYG)的编辑器轻松地创建NinePatch图形。模拟器Emulator它是在的计算机上运行的一个虚拟移动设备。可以使用器来在一个实际的Android运行环境下设计,调试和测试的应用程序HierarchyViewer(层级观察器层级观察器工具允许调试和优化的用户界面。它用可视的方把的视图(view)的布局层次展现出来,此外还给当前界面提供了一个具有像素栅格(grid)的放大镜观察器。1.2Android帮1.2Android帮助创建磁盘映像(diskimage),可以在模拟器环境下使用磁盘映像来模拟外部存储卡(例如SD卡)。生为随机的用户事件流,例如点(click),触(touch),挥手给正在开发的程序做随机的,但可重复的压力测试。(tracelog)转换为图形化的分析视AndroidAndroid运行Git工具Repo工具Ubuntu获取Android获取Android完全的源代码初始化代码仓$repoinit-u获取代$repo初始化指定的版本:$repoinit-u-brelease-$repoinit-u-bandroid-sdk-同步单个工程代码:$repo同步单个工程代码:$reposync获取一个工程的代码:$gitclonegit:///+project例如,获取通用内核的代码:$gitclone2.1$repoinit-urepo...manifest...From2.1$repoinit-urepo...manifest...From**********************android-1.5->origin/android-1.5android-1.5r2->origin/android-1.5r2android-1.5r3->origin/android-1.5r3android-1.6_r1->origin/android-1.6_r1android-sdk-1.5-pre->origin/android-sdk-1.5-preandroid-sdk-1.5_r1->origin/android-sdk-1.5_r1android-sdk-1.5_r3->origin/android-sdk-1.5_r3android-sdk-1.6_r1->origin/android-sdk-1.6_r1cdma-import->origin/cdma-import->cupcake-release->origin/cupcake-->->release-1.0->origin/release-1.0android-1.5->android-1.5android-1.5r2->android-1.5r2android-1.5r3->android-1.5r3android-1.6_r1->android-1.6_r1->android-sdk-->android-sdk-->android-sdk-From*[newandroid-1.0->android-repoinit之后,repoinit之后,将生成隐藏目.repo,其中文repo时repo/manifest.xml中的path表示工程获取后的路径(基于当前目录),name表示工程的名称。提交代码Android代码:提交代码的流程:$提交代码Android代码:提交代码的流程:$repostart{branch_name}$gitadd$gitcommit{file_path}$repoupload提交的网页:/#change,{change核心工程(核心工程(CoreProject扩展工程(包(Package核心工程libm核心工程libmlibdl,动态linkerbootloader/legacy:Build:dalvik:development:CBootloaderDalvik虚拟机Android核心的框架frameworks/policies/base:框架配置hardware/libhardwarekernel:prebuilt:system/core:硬件抽Linux内LinuxMac编最小化可启动底层调试和检扩展工程(1扩展工程(1)::AdvancedEncryptionStandard::::::(JAVA)Http(主机目标机)(主机)pythonjavaperlclib::::::动态主机设定协定的工具ssh2服务器和客户(主机)Ext2/3/4(主机)ELF(主机)ELF扩展工程(2):扩展工程(2): ::::::::::::(仅头文件(主机目标机)XMLIEE754浮点GIFXtables(tables)”扩展工程(扩展工程(3): :::::::::::::::aportableforeignfunctioninterfacePNG(主机目标机)CXML解析库CSSL(SecureSocketsLayer)Linux内核支持的一种性能分析机ppp扩展工程(4扩展工程(4): :::::Sonic嵌入式的音乐合成器轻量级的SQL嵌入式数据库(主机目标机)motorolaS-records16:::::::::(JAVA)HTML(主机目标机)XML(主机目标机)包(包括应用程序,包(包括应用程序,提供者和输入法:Applications(package/appsAlarmClock,Browser,Calculator,Calendar,CameraContacts,Email,GoogleSearch,HTMLViewer,IMLauncher,Mms,Music,PackageInstaller,PhoneSettings,SoundRecorder,Stk,,,(package/ProvidersCalendarProvider,ContactsProvider,DownloadProviderDrmProvider,GoogleContactsProvider,GoogleSubscribedFeedsProvider,ImProvider,MediaProvider,SettingsProviderSubscribedFeedsProvider,2.2Android编译2.2Android编译中具有一Makefile,直接执$ 2.2AndroidAndroid系统2.2AndroidAndroid系统编译完成的结果全在其根目录中没有内容out目录中,在其他目编译的结果目标机映像文Linux内核(需要单独处)|||||||||||||||||||数据目录[[根文件系统目录符号的目录主文件系统目录[[[ AndroidAndroidAndroidVirtualAndroidEmulatorAndroid(Android虚拟设备)启动界面启动界面启动界面启动界面AndroidAndroid的桌面(HVGA-P:320×480AndroidAndroid的应用主菜单在在Android中使用菜单拖拉到主界面的另外一屏拖拉到主界面的另外一屏logcatlogcat的选项包括:logcatlogcat的选项包括:--f-r-n-vf4log,<format>briefprocesstagthreadrawtimethreadtimelog----不阻('main((HVGA-L:480×320((QVGA-P:320×240((QVGA-L:320×2403.33.3AndroidSDK环Android1.6的模拟器环AndroidAndroidLinuxAndroidAndroidLinux第一部分Linux核心与驱第二部分Android专用驱第三部分Android使用的设备驱获取通用内核的代码:$获取通用内核的代码:$gitclone的kernel。AndroidLinuxAndroidLinux内核的配置和编译:处理器的编译结果处理器的编译结果为内核ELFzImage为内核的压缩goldfish是一种ARM处goldfish是一种ARM处理器,核心内容的路径为arch/arm/mach-Android还需要在标准内核中需要增加必要的驱动,用于对统用户程序的支持。android中驱动主要分成两种类型Android专用驱Android使用的设备驱AndroidAndroidAndroidAshmem匿名共享内存Loggerlog驱BinderAndroidAshmem匿名共享内存Loggerlog驱Binder驱动Driver):OpenBinder驱动,为Android的支能源管理(Management):Management(PM):定时器驱动,用于唤醒设KillerLow在缺少内存的情况下,杀PMEM物理内2.1Clibutil库对AshemeAndroid的BinderAndroid的Binder层程序提供了IPC(进程间通信)的支持,Android整个系统的运行依赖Binder驱动10(在用户空间libutil工具库和ServiceManagerBinder接口提供对整个驱动程序为驱动程序为Log10(驱动Event输入设备驱v4l2摄像头-视频驱OSS频驱动ALSA音频驱动MTD驱动蓝牙驱Wlan3.1framebuffe3.1framebuffe3.1framebuffe文件接口调用用户空内核空调3.1framebuffe文件接口调用用户空内核空调注硬操硬件调注字符设备驱动程序核3.2Event输入设备驱3.2Event输入设备驱3.2Event文件接口调用用户空内核空调注硬操硬件调3.2Event文件接口调用用户空内核空调注硬操硬件调注字符设备驱动程序核Input驱动核3.3v4l23.3v4l2v4l2驱动主要头文件路径include/linux/videodev.hv4l第一版的头文件include/linux/videodev2.h:定义主要的数据接口和常量v4l2驱动核心实现路径:driver/media/video/v4l2-3.3v4l2文件接口调用V4L2驱动(v4l2-3.3v4l2文件接口调用V4L2驱动(v4l2-V4L2设备3.4OSS3.4OSSOSS驱动程序的主要头文件include/linux/soundcard.hOSS驱动的主要头文件OSS驱动程序的核心:3.4OSS文件接口调用调注硬操硬件调注3.4OSS文件接口调用调注硬操硬件调注字符设备驱动程序register_sound_OSS驱动核OSS设备号(14,3.5ALSA3.5ALSAArchitecture)高级Linux 主设备号为116,次设备号为各个设备。ALSA驱动程序的头文件:include/sound/asound.hALSA驱动的主要头文件include/sound/core.hALSA驱动核心数据结构和具体驱动的注册ALSA驱动程序的核心实现3.5ALSAALSA用户空间接文件接口调内核空接3.5ALSAALSA用户空间接文件接口调内核空接操硬件字符设备驱动程注册snd_ctl_addALSA驱动核心用户空ALSA设备号3.5MTD3.5MTDFlashMTD(memorydevice),内存技术设备。13MTD源代码路径:drivers/mtd/mtdchar.c:MTD字符设备drivers/mtd/mtdblock.c:MTD块设备3.5MTD调注MTD原始系3.5MTD调注MTD原始系蓝牙的驱动程序一般都通过标准的HCI控制实CSR蓝牙的驱动程序一般都通过标准的HCI控制实CSRBCSPCI对inx来说,一旦bluez可以使用HCI与芯片建立起通信(一般是+hciconfig),便可利用其上的标准协议SO,L2CAP等),与蓝牙通信3.7Wlan3.7Wlan接WIFI驱动程序部分:AndroidAndroidAndroid第一部Android第一部第六部第七部底层库和程序的结C语言底层Shell工Android的系统进☐☐☐☐Init进程Shell中的包含带有符号的库(strip)includeincludeinclude$(BUILD_STATIC_LIBRARY)includeinclude$(BUILD_HOST_STATIC_LIBRARY)LOCAL_MODULE_PATH和LOCAL_MODULE_PATH和LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)LOCAL_UNSTRIPPED_PATH:=$(TARGET_ROOT_OUT_UNSTRIPPED)TARGET_ROOT_OUTTARGET_OUT:TARGET_OUT_DATA:A.txt和C/CC/CNPTL线程库。它还实现LinkerLoaderproperty系统,这是享内存的方式来实现维护property系统。工具功能。这是sockets.hAndroidproperties.h:Androidlog.hlogashmem.hatomic.hmq.hInitInit称为init的可执行程序。提供了以下的功能:InitinitInitinit的可执行文件是系统运行的第一个用户空间的程序,以守护进程的方式运InitInitActions,Triggers,Services,Options,andsProperties字参考system/core/init/keyword.h。ShellShellconsole的件系统/system/bin/中的具有一些符号将连接到toolbox上。API也是C++Android的层次的ClibutilsI -I -Errors.hErrors.h定义宏表示错Endian.h定义表示大小misc.h几个字符串和文件相关的功能函TextOutput.hBufferedTextOutput.h:BufferedTextOutput,它是Pipe.hBuffer.h:List.h:定义链表的模TextOutput的实SharedBuffer.hSharedBuffer.h定义类SharedBuffer表示共享String16.hString8.h:定义表示单字节字符串的类String8,并包含了能String16转换VectorImpl.hVector.h:定义继承VectorImplVectorSortedVector.h:KeyedVector.h:定义使用关键字的向量模板threads.h定义线程相关的类,包括线Thread、互斥量Mutex、条件变量Condition、读写锁ReadWriteLock等socket.hTimers.h:定义时间相关的函数和定时器类DurationTimerZipEntry.hZipFileCRO.hZipFile.hZipFileRO.h:zip功能相关的类kernelbinder驱动。kernelbinder驱动。ndrJAVAndrJAVA的服务器/客户BndrC的服务器/客户Javar框CPPr框的核心部rrrßr)Bnrdprep,r驱RefBase.hRefBase.hParcel.hIBinder.h:Binder.hBinder和:IInterface.h:进程进程②①程序框架部服务进程进程②①程序框架部服务器的实(具体实现功能(本地功能(代理功能IPermissionController.h且实现了BpPermisionController。classBpPermissionController:publicclassBpPermissionController:public{BpPermissionController(constsp<IBinder>&:{}virtualboolcheckPermission(constString16&int32_tpid,int32_t{Parceldata,reply;remote()->transact(CHECK_PERMISSION_TRANSACTION,data,&reply);if(reply.readInt32()!=0)return0;returnreply.readInt32()!=}AndroidAndroid/system/bin/servicemanagerservicemanagerzygotemediaserver这几个进程是Android系统运行的基础JAVAJAVA第一部分Dalvik虚拟第二部分AndroidJAVA程序环境第三部分JNI的使用第四部分系统服务的JAVA部Dalvik虚拟Dalvik虚拟DalvikAndroid(.dex)Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的JAVASDK中的"dx".dex格式由虚拟机执行。Dalvik虚Dalvik虚拟vm目录中的内容是虚拟机的实现,由本地代码实libdvm.co。CJAVA代码,编译的JAVAcore.jar。Dalvik虚拟nativehelperDalvik虚拟nativehelperJAVA调用的函数,在其他的代码中需要使用JAVAnativehelper库的代码路径为:动态库libnativehelper.so。nativehelper个库的头文件的路径为:libnativehelper/include/nativehelper/JNIHelp.h:提供JNI注册功能的头文件AndroidJAVAAndroidJAVAAPI名称相同的API功能,但这些API并AndroidJAVAAndroidJAVAandroidAndroidJAVAAndroidAndroidJAVAAndroidJAVA类的API<package><class><interface><implements><method><field>当注释中写入的时候,就表示内JAVA的源代AndroidJAVAAndroidJAVAAndroidJAVA<packageAndroidJAVA<package<classname="Activity"><!--省略内<!--省略内JNIJNIJavaNativeInterface的缩写,中文为JAVAJava1.1JavaNativeJNIJNIJavaNativeInterface的缩写,中文为JAVAJava1.1JavaNativeC可以调用C语言的程序。JNIJAVA的类型JNI的类型对应的字母JAVA布尔类型(booleanjboolean(8位无符号ZJAVA字节(bytejbyte(JNIJAVA的类型JNI的类型对应的字母JAVA布尔类型(booleanjboolean(8位无符号ZJAVA字节(bytejbyte(8位有符号BJAVA字符(charjchar(16位无符号CJAVA短整型(shoutjshort(16位有符号SJAVA整型(intjint(32位有符号IJAVA长整型(longjlong(64位有符号JJAVA单精度浮点(floatjfloat(IEEE75432位FJAVA双精度浮(doublejdouble(IEEE75464DJAVAjobjctLVAndroidAndroi系统在AndroidJNIAndroidAndroi系统在AndroidJNIAndroid中JAVA的类都native的接口,这些。(声明本地接口3.1JNI在Android3.1JNI在AndroidJNI的代码在以下的路径中:frameworks/base/core/jni/libandroid_runtime.so,这就是一个普通的动态库,被放置在目标系统的/system/lib目录中。AndroidJNIframeworks/base/media/jni/中,被编译成为库libmedia_jni.so。3.1JNI3.1JNI其命名一般和对应支持的JAVA类有对应关系。这种关在AndroidJNIlibnativehelper.so在应用程序的Apk包中实现JNIJNIJNIJNIJNICodeJNIRegister初始化部分执行的代码JAVAApplicationCode3.4JNI3.4JNI3.4JNI3.4JNI3.4JNI3.4JNI3.4JNI3.4JNI3.4JNI3.4JNIJAVABinder<<接口<<接口<<接口<<接口<<接口<<接口zygote是通过init进程读取init.rc启动servicezygote/system/bin/app_process-/system/bin--zygote--start-system-serversocketzygotestream666onrestartwrite/sys/android_power/request_statewakeonrestartwrite/sys/power/stateonAndroid的Android的GUIAndroidGUIAndroidGUIAndroidGUI系统综pixelflingerlibuiSurface系Skia系OpenGL系统架第一部第五部第六部AndroidGUI各种GUI元androivie.VieandrovAndroidGUI各种GUI元androivie.VieandrovieSurfaceJAVA框Skia图形引OpenGL3D引AndroidGUIAndroidGUIAndroidGUIAndroidGUI(pixelflingerlibuipixelflingerlibuilibpixelflingner.so是一个下层的工具性的类,这个类对外的主要内容是GGLContextlibpixelflingner.so是一个下层的工具性的类,这个类对外的主要内容是GGLContext结构,以及初始化和中枢,也是整个GUI系统的中枢。UI中枢,也是整个GUI系统的中枢。UIlib(→libpixelflinger口,按键及事件处理,Suface界OverlayCameraformat部分:format部分:EglWindows部分:包含了EGL头文件构建的egl_native_window_t,它依OpenGLlibEGLEGLDisplaySurface操作了硬件的framebuffer的驱动。这也是整个系统显示的基Key/Event部分:这是AndroidSurfaceSurfaceSurfaceSurfaceOverlayCamera2.3Android2.3AndroidAndroidframebuffer驱动程序之间的适配层(硬件抽象输出部分的硬件抽象(donut之前):2.3Android2.3Android2.3Android2.3Android2.3Android2.3Android2.3Android2.3Androidgrallocpmem的实现。2.3Android2.3Androidgralloc设备。2.4Android2.4Android包的View2.4AndroidTouch/Mouse/2.4AndroidTouch/Mouse/2.4Android2.4Android输入部分的硬件抽象:KeyCodeLabel.handroid/view/KeyEvent.javaqwert.kl键盘布局文件2.4Android2.4Android2.4Android2.4Android2.4Android是DEFGHABC2.4Android是DEFGHABC2.4Android2.4AndroidRawInputEvent转换成KeyEvent2.4Android2.4Android::X:Y:W:H:0x1:SurfaceFlinger的和JniSurfaceSurface系统结Surfacelibui.so提供Surface接口。libsurfacefilnger.so提供实现。Java框架层次UINavtive(本地调用)部分主要ISurface+bootFinished+bootFinishedSurface系统的头文件Surface系统的头文件Surface系统的源代码文件(路径为::SurfaceFlinger类继承了ISurfaceComposer,是一个核心的实现classISurfaceComposer:public{enum{//(keepinsyncwithclassISurfaceComposer:public{enum{//(keepinsyncwith===eDestroyBackbuffer====enum=====/*......*/enum{=/*......*/enum{=/*......}代码的路径代码的路径:classLayerBaseClient:publicLayerBaseclassSurface:publicBnSurfaceclassLayer:publicclassLayerBuffer:publicclassSurfaceBuffer:publicLayerBaseClient::SurfaceclassLayerDim:publicLayerBaseClientclassLayerBlur:public ForCreateaSurface:(ISurface→Suface,→(IsurfaceFlingerClient::→Bclient::createSurface→SurfaceFlinger::createSurfaceLayerBaseClient*layer=0;sp<LayerBaseClient::Surface>surfaceHandle;eFXSurfaceNormal→LayerorLayerBuffereFXSurfaceBlur→LayerBlureFXSurfaceDim→LayerDimsurfaceHandle=layer-For→的和Jniz--的和Jniz--的和Jni的和JniJNICode的和Jni代码的路径的和Jni代码的路径:的和Jni3SurfaceView(SurfaceView.java)的和Jni3SurfaceView(SurfaceView.java)1:SurfaceHolderandroid.view.Surface表示了一个可以绘制图形的界的和Jni的和JniUIwidgets(GUI)ViewSurfaceonDraw(Canvas)事件第四部AndroidJNIAndroidSkiaandroid统Java框C框架SkiaSGL(SkiaGraphicSkiaAndroidandroiSkiaandroid统Java框C框架SkiaSGL(SkiaGraphicSkiaAndroidandroi.grphic.*nroveSracenrovieVieSkia底层Skia底层SkiaGoogle一个底层的图形,图像,动画,SVG,文本等多方面的图形库,它是Android中图形系统的引擎。☐☐☐CoreCg:GL(SkiaGraphicLib):skia-openglgluelibrary:Skia底层Skia底层核心图形库:libcorecg.so☐Skia☐skia-openglgluelibrary:AndroidJNIAndroid的AndroidJNIAndroid的图形系统和Skia底层库Android的图形系统联系比较紧密JNI提供了Skia底层库JAVA上层支持Android的图形系统JNI代码的路Android的图形系统JAVA层提供了绘制基本图形的功能,是GUI系统的基AndroidJNICavAndroidJNICavscp是J中核心的接口,上层类提供了支持Androidandroid.graphic,JNIJAVA个类:个类:android.graphics.Canvas。Canvas类处理(draw)内容的时候4个基本的组件:一个保ABitmap,一个处理绘制调用的Canvas(写bitmapRect,Path,textBitmap)OpenGLOpenGLOpenGLOpenGL的aiveOpenGLJAVAJNIOpenGL系OpenGL引vOpenGL系OpenGL引vMegl_native的aive的aive(EGL库(OpenGLES库的封装(的软件实现库的aive的aive测试代码的路径Surface的代: 5.2OpenGLNative5.2OpenGLNativeOpenGLES25.2OpenGLNative5.2OpenGLNative实现libGLES_android.so,通常作为加载的一个库。另外还可以选择加载硬件实现的OpenGL库。的a的aive的a的aiveOpenGLJAVAJNIOpenGLJAVAJNIOpenGLJAVA(GL10.javaGL11.java))com.google.android.gles_jniJNI:OpenGLJAVAJNIOpenGLJAVAJNIJAVA代码:(GL10.javaGL11.java)com.google.android.gles_jni(AndroidGLES的实)JNI代码:com.google.android.gles_jniOpenGLJAVAJNIOpenGLJAVAJNIandroid.opengl的代码路径OpenGLJAVAOpenGLJAVAJNIpublicclassXXXActivityextends{protectedvoidonCreate(Bundle{super.onCreate(savedInstanceState);mGLSurfaceView=newXXXGlSurfaceView(this);}privateGLSurfaceView}classXXXGlSurfaceViewextendsGLSurfaceViewprivateclassCubeRendererimplementsGLSurfaceView.Renderer /*...}AndroidAudioAndroidAudioAndroidAndroidAudio系第一部分Audio系统综第二部分Audio系统和上层接第三部分Audio的硬件抽象第一部第一部Audio系统综层Audio系统的上层接口主要提供了两方面的第一部Audio系统综Java本地C框内核空第一部Audio系统综Java本地C框内核空AudioHAL第一部Audio第一部Audio系统综Media库(libmedia.so)AudioAudioAudioFlinger(libaudioflinger.so)第一部Audio第一部Audio系统综AudioJNIAudioJAVAAudio系统和上层Audio系统和上层接第二部mediaAudioAudioFlingerAudioJNIAudioJava☐libmedia.so提供AudioAudio☐☐libaudiofilnger.so提供Audio☐AudioJNIJAVAAudio输Audio输JavaAudio输Audio输Java本地框架硬件抽象mediaAudioSystemAudioTrack和中,可以获得IAudioTrackIAudioRecorderIAudioTrackIAudioRecorder来实现。Audio框架部--Audio框架部--Audio系统的头文件AudioFlinger来实现,其他接JNIIAudioFlinger.h:需要下层实现的总管接口;AudioTrack.h:放音部分对上接口;AudioRecorder.h:录音部分对上接口;IAudioFlinger.hIAudioTrack.hIAudioRecorder.h这三个接口通过下层的继承来实现(即AudioFlinger)。AudioFlinger.hAudioTrack.hAudioRecorder.h是对器、录制器等),也可以通过JNIJava层提供接口。AudioTrack和writesetget接口,是一个对上层的AudioSystem.h本地代Audio是AudioFlingerAudioFlinger.cppAudioFlingerIAudioFlingerAudFliger本地代AudioFlinger的实现classAudioFlingerAudFliger本地代AudioFlinger的实现classAudioFlinger:public{public//省略部分virtualsp<IAudioTrack>//获得音频输出接口(Trackpid_tpid,intstreamType,uint32_tsampleRate,intformat,intchannelCount,intframeCount,uint32_tflags,constsp<IMemory>&sharedBuffer,status_t*status);//……省略部分setMasterVolume(floatvalue);setMasterMute(boolmuted);setStreamVolume(intstream,floatvalue);setStreamMute(intstream,boolmuted);setMode(intmode);getMode()const;uint32_troutes,uint32_tmask);sp<IAudioRecord>//获得音频输出接口(Recordpid_tpid,intuint32_tintformat,intchannelCount,intframeCount,uint32_tflags,status_t*status);}Audio系统Audio系统JNI代Audio的JNI部分的代码的路径为Audio系统Audio系统的JAVAAudio的JAVA第三部Audio的硬件抽第三部Audio的硬件抽象AudioFlinger和硬件的接口。可以基于LinuxOSSAudio第三部Audio第三部Audio的硬件抽象AudioHardwareInterface.h中定义了类:这是实现Audio硬件抽象层的主要接口。第三部Audio第三部Audio的硬件抽象AudioStreamIn第三部Audio第三部Audio的硬件抽象:第三部Audio的第三部Audio的硬件抽象AudioFlingerAudio☐☐☐作为Audio系统的通用实现来完成。第三部Audio第三部Audio的硬件抽象OSS驱动程序和ALSA驱动程序来实现。基于OSSAudioGeneric的实现,但是增加了控制接口。基于ALSA的硬件抽象层的实现需要构建于用户Android的Android的Android输入Android输入输出系Video输入输出系统的第一部述第四部第五部Overlay系Overlay的硬件抽象Camera系统与上层接Camera的硬件抽象第一部分Video输入第一部分Video输入输出系统的综Video输入输出系统的综第一部Android的Video输入输出系统的综第一部Android的Overlay系统结Overlay内核空OverlayHAL实第一部Video第一部Video输入输出系统的综Overlay相关的代码路径:libui.so。Overlay的硬件抽象层的接口:第一部Video输入输出系统的综AndroidCamera第一部Video输入输出系统的综AndroidCamera系统结JavaCameraC框内核空CameraHAL第一部Video输第一部Video输入输出系统的综Camera相关的代码路径Camera框架部分的头文件和源文件Camera服务部分第一部Video第一部Video输入输出系统的综CameraJAVA本地调用部分(JNICameraJAVAOverlayAndroidOverlayOverlayAndroidOverlayoverlay接口,这个接口的含义是叠加在主的显OverlaySurfaceFlingerOverlayOverlayOverlayOverlayOverlay接口虽然通过SurfaceFlinger的SurfaceFlinger的其他部分没有依赖关系。Overlay在文件Overlay.hOverlay在文件Overlay.h中,OverlayRefOverlay。OverlayVideoOutputVideoOutputPreviewPreviewOverlayVideoOutputVideoOutputPreviewPreviewVideoOut/2DOverlayOverlayOverlayOverlayOverlay的使用场景主要有两个:视频播放器的输出(PVPlayer)Preview的输出(CameraHal)OverlayOverlayoverlay_control_device_toverlay_data_device_t,实现Overlay的硬件抽象层。Android硬件模块的标准方法,通过类overlay_module_t来完成。OverlayOverlayOverlayOverlayOverlayOverlay→overlay_module_t(hw_module_tcommon)::→overlay_module_t(hw_module_tcommon)::→overlay_data_device_t(hw_device_t→overlay_t::→overlay_data_device_t::overlay_data_device_t::dequeueBufferoverlay_data_device_t::queueBufferOverlayOverlayVideoforLinux2framerbuffer驱动程序的实现,通常实现获得内存地址的接口即可。基于v4l2的实Camera系统与上层接Camera系统与上层接Camera的JNI和在AndroidAndroid在AndroidAndroid据获取(Recording)Camera部分的主要头的框架部分包含在ui库的中,而Camera中间层的实现是层的Camera硬件抽象层来实现功能。ICameraService.hICameraClient.hICamera.hCameraICameraService.cpp和Camera.cpp两个文件用于CameraCamera的具体功能在下层Camera.h是CameraNativeeNativeeCamera.h是CameraCamera.h是Camera、ICamera.h三个类定义了Camera中间层Camera系统共同的几个方面:拍照照片(takePicture)//Typicaluse#define#defineFRAME_CALLBACK_FLAG_CAMERA//Typicaluse#define#defineFRAME_CALLBACK_FLAG_CAMERA#define//msgTypeinnotifyCallbackanddataCallbackfunctionsenum{========CAMERA_MSG_COMPRESSED_IMAGE==//ref-countedobjectforclassCameraListener:virtualpublic{virtualvoidnotify(int32_tmsgType,int32_text1,int32_text2)=virtualvoidpostData(int32_tmsgType,constsp<IMemory>&dataPtr)=virtualvoidpostDataTimestamp(nsecs_ttimestamp,int32_tmsgType,constsp<IMemory>&dataPtr)=CameraService是继承CameraService是继承BnCameraService在运作的过程中CameraService::connect函能,由于CameraService::Client本身继承了BnCamera类,而BnCameraICamera,因此这个类是可以被当成ICamera来使用的。CameraHAL中,直接送给Camera类通过Callback在Android照相机摄像机应用程序中,使用的是2323CameraService读取CameraHAL的useOverlay接口来实现。CameraCameraHighlevelCameraCameraCameraHardware1.ToUserkernelVideoOutCameraCameraHighlevelCameraCameraCameraHardware1.ToUserkernelVideoOut/CameraUserkernel/CameraUserkernelrarameraSendEncoderbStart/UserkernelRecordingClientSendEncoderbStart/UserkernelRecordingClientCameraNative的JNI和Android的JNI和AndroidCameraJNIJAVA提供了接口。Camera在JAVA中的类是:android.hardware.Camera。CameraJAVA本地调用部分(JNICameraJAVA类Camera的硬件抽象Camera的硬件抽象CameraHardwareInterface.h/Camera的硬Camera的硬件抽象Camera的硬件抽象classCameraHardwareInterface:publicvirtualRefBaseCamera的硬件抽象classCameraHardwareInterface:publicvirtualRefBase~CameraHardwareInterface(){getPreviewHeap()const=0;getRawHeap()const=0;startPreview(preview_callbackcb,void*=booluseOverlay()sp<Overlay>&overlay){return=previewEnabled()=startRecording(recording_callbackcb,void*user)=stopRecording()=0;recordingEnabled()=0;releaseRecordingFrame(constsp<IMemory>&mem)=0;autoFocus(autofocus_callback,void*user)=0;takePicture(shutter_callback,raw_callback,jpeg_callback,void*user)=0;cancelPicture(boolcancel_shutter,boolcancel_raw,boolcancel_jpeg)=0;setParameters(constCameraParameters¶ms)=0;CameraParametersgetParameters()const=0;voidrelease()=0;status_tdump(intfd,constVector<String16>&args)const=Camera的硬Camera的硬件抽象Android的Éclair版本中:Camera的硬件抽象classCameraHardwareInterface:publicvirtual{~CameraHardwareInterface()Camera的硬件抽象classCameraHardwareInterface:publicvirtual{~CameraHardwareInterface(){getPreviewHeap()const=0;getRawHeap()const=0;data_callbackvoid*user)=0;enableMsgType(int32_tmsgType)=disableMsgType(int32_tmsgType)=0;msgTypeEnabled(int32_tmsgType)=startPreview()=0;useOverlay(){returnfalse;}setOverlay(constsp<Overlay>&overlay){returnstopPreview()=0;previewEnabled()=startRecording()=stopRecording()=recordingEnabled()=0;releaseRecordingFrame(constsp<IMemory>&mem)=autoFocus()=0;cancelAutoFocus()=takePicture()=cancelPicture()=setParameters(constCameraParameters¶ms)getParameters()const=status_tsendCommand(int32_tcmd,int32_targ1,int32_targ2)=0;voidrelease()=0;status_tdump(intfd,constVector<String16>&args)const=Camera的Camera的硬件抽象CameraService中,实现了一个CameraHardwareStub.cpp和FakeCamera.cpp中实现。候,CameraService将使用这个桩,这样整个Camera模块可以在没有硬件的情况下编译通过Camera的硬件抽Camera的硬件抽象setOverlay()ISurfaceOverlayCamera的Camera的硬件抽象VideoforLinux2(V4L2)驱动程序,在此处主要的处(V4L2_MEMORY_MMAP),构建预览的内存Camera的Camera的硬件抽象releaseRecordingFrame()被调用后,表示上层通知AndroidAndroidAndroidAndroid的多媒体部分的的多媒体部分的框架涉及到应用JAVA框架C语言框架、硬件抽象层等JavaMediaMediaJavaMediaMediaJAVAJAVAJAVA本地调用部分(JNIMP3mp3MP3mp3PCM输出的播放Android的多媒体系Camera/MusicJavaAndroid的多媒体系Camera/MusicJava音频视频播放器PacketVideo音频视频播放器PacketVideo照相机Camera照相机Camera录音机录音机摄像机摄像机多媒体部分的JNI代码类第二部多媒体的各个层第二部多媒体的各个层Android多媒体部分C语部分的核心media库,它主要录了媒体播放器和媒体记录器的框。media库向上层通JNI提Video接口,下层通实现2.1libmediailreyee2.1libmediailreyee2.1libmedia2.1libmediax2.1libmedia2.1libmediaMediaPlayerServiceMediaPlayerService多媒体部分的JNI代码media多媒体部分的JNI代码mediaJAVA本地调用部分(JNI多媒体部分的JAVA多媒体部分的JAVAJAVAVideoView类VideoViewVideoView类VideoViewmediaJAVA类,这类的路径是VideoView是一个集成了MediaPlayer和SurfaceViewUI元素(View)直接放置在JAVA应用的界面中,用于视频的播放。OpenCore概述OpenCoreOpenCore的OSCL部OpenCoreNodePlayer介Author介绍OpenOpenCreOpenCore是一个多媒体的框架,从宏观上来看,它主要PVPlayer提供媒体播放器的功能,完成各种音频(AudioPVAuthor提供媒体流记录的功能,完成各种音频(Audio)视频(Video)流的捕获(Recording)功PVPlayer和PVAuthor以SDK的形式提供给开发者,可、录音机等等的层次结CodecAndroidAndroidVlyreVtre2waye的层次结CodecAndroidAndroidVlyreVtre2wayeoMultimediaAudio的层次结的层次结☐(OperatingSystemCompatibilityLibrary,操作系统兼容)☐(PacketVideoMultimediaFrameworkPV多媒体框架文件解析(parser)和组成(composer)两个部分☐☐☐NODEs(节点PlayerEngine(播放器引擎AuthorEngine(作者引擎3.2OpenCore3.2OpenCoreOSCLOSCL,全称为OperatingSystemCompatibilityLibrary操作系统兼容库,它包含了言中每一个细节的功能都进行封装,并使用了C+的接口提供给上层使用。事OperCorePVMFEngine部分都OSCL,而整OperCore的调用者也需OSCL的文件格式和编解码部OpenCore有关文件格式处理和编解码部分两部分的内容,分别在目录fileformats和codecs_v2当parser(解析器),另composer(组成器。编解码部分的子omxOpenMAXOpenMAX媒体应用程序的框架标的文件格式和编解码部parser(解析器),另composer(组成器)。其代码的目录为的目录,其中包含mp3,mp4,wav等子目录。其中包含了AVImp3mp4wav等多的文件格式和编解码部编解码目录为codecs_v2,其中包含了audio、omx、utilities、video等几个目录audio和video目录中,对应了针对各种流的子目录,其中可能包含decenc两个目录,分别对应解码和编|--|||||--|--|--`--`--|--|--`--的文件格式和编解码部codecs_v2目录的子omx实现khronosOpenMAX的功能。OpenMAX是一个多媒体应用程序的框架标准,NVIDIA公司Khronos2006年推OpenMAXILOpenMAX的设计实现可以让具有硬件编辑码功能的平台提供统一的接口和框OpenMAX中可以直接使用硬件加此处的OpenMAX则是基于一个纯软件的实现,其实现的代码即是调用这里的video和audio目录中的软件编辑码的代码。3.5OpenCoreNode介3.5OpenCoreNode介NodeOpenCoreNodeOpenCorenodes出模块的Node。NodeOpenCore本身提供了很强的过程中,还可以对的使用,一般是基于OpenCore的OpenCore本身提供了很强的过程中,还可以对的使用,一般是基于OpenCore的框架为其增加定的插件。插件主要一般可以做Node各种文件格式插件各种编解码的编解码相关的Node包括:pvomxbasedecnode,pvomxaudiodecnode编解码相关的Node包括:pvomxbasedecnode,pvomxaudiodecnodeecnodepvomxencnode等。,文件格式的Node包括:pvwavffparsernodeodepvmp4ffparsernodepvvideoparsernodepvmp4ffcomposernode等。输入输出的Node包括:pvmediainputnode,pvmediaoutputnode,pvdummyinputnodepvdummyoutputnodepvfileoutputnodepvdownloadmanagernode等。MediaIOpvmi/pvmf/includeMediaIOpvmi/pvmf/includePvmiMIOControl.hNode在OpenCoreMediaIO是对Node的一种封装,封装成介OpenCore介OpenCore的Player的编译文件是pvplayer/Android.mk,将生成动态库文件的内容:一方是Player的engine(引擎)AndroidPlayer(adapter)engineandroid介介解码工具对应的Node;Player的引擎部分(编译engines/player/Android.mk);为Android构建的Player适配器(编译文件:android/Android.mk识别工具(pvmi/recognizer编解码工具OpenMAX部分(codecs_v2/omx);对应插件Node的注册。libopencoreplayer.so中的内容较多,其中主要为各个文件解器和解码器PVPlayer的核心engines/player/Android.mk当中android/Android.mk的内容比较特殊PVPlayer之上构建的一个为Android使用的播放器。介适配(PVPlayer☐☐介适配(PVPlayer☐☐介OpenCorePlayerEngine具有清晰明介OpenCorePlayerEngine具有清晰明确的接口,在这个接口上,不同的系统可以根据情况实现不同的Player。位于OpenCore中的engines/player/目录下,其中,engines/player/include目录中保存的是接口头engines/playe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论