html5-img
1 / 32

Android 嵌入式系统软件开发

Android 嵌入式系统软件开发. Android Embedded System Software Development 周 庆 国 ( zhouqg@lzu.edu.cn ) 兰 州 大 学. 第二章 Android 源码结构分析. 2.1 源码结构分析 Android source. 2.2 Android 编译系统介绍. 2.3 Android 初始化脚本语言介绍. 2.1 源码结构分析. 总目录 |-- Makefile |-- bionic                (bionic C 库 )

feleti
Download Presentation

Android 嵌入式系统软件开发

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Android嵌入式系统软件开发 Android Embedded System Software Development 周 庆 国 (zhouqg@lzu.edu.cn) 兰 州 大 学

  2. 第二章 Android源码结构分析 2.1源码结构分析Android source 2.2 Android编译系统介绍 2.3 Android 初始化脚本语言介绍

  3. 2.1 源码结构分析 总目录 |-- Makefile |-- bionic                (bionic C库) |-- bootable             (启动引导相关代码) |-- build                 (存放系统编译规则及generic等基础开发包配置) |-- cts                  (Android兼容性测试套件标准) |-- dalvik                (dalvik JAVA虚拟机) |-- development     (应用程序开发相关) |-- external              (android使用的一些开源的模组) |-- frameworks       (核心框架——java及C++语言) |-- hardware           (主要保护硬解适配层HAL代码) |-- out                  (编译完成后的代码输出与此目录) |-- packages            (应用程序包) |-- prebuilt              (x86和arm架构下预编译的一些资源) |-- sdk                 (sdk及模拟器) |-- system              (文件系统库、应用及组件——C语言) `-- vendor              (厂商定制代码) 3

  4. bionic 目录 |--libc (c库) | |--arch-arm (ARM架构,包含系统调用汇编实现) | |--arch-x86 (x86架构,包含系统调用汇编实现) | |--bionic (由C实现的功能,架构无关) | |--docs (文档) | |--include (头文件) | |--inet (Inet 相关) | |--kernel (Linux内核中的一些头文件) | |--netbsd (nesbsd系统相关) | |--private (一些私有的头文件) | |--stdio (stdio实现) | |--stdlib (stdlib实现) | |--string (string函数实现) | |--tools (几个工具) | |--tzcode (时区相关代码) | |--unistd (unistd实现) | `--zoneifo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能) 4

  5. |--libm (libm数学库的实现) | |--alpha (apaha架构) | |--amd64 (amd64架构) | |--arm (arm架构) | |--bsdsrc (bsd的源码) | |--i386 (i386架构) | |--i387 (i387架构) | |--ia64 (ia64架构) | |--include (头文件) | |--man (数学函数) | |--powerpc (powerpc架构) | |--sparc64 (aparc64架构) | `--src (源代码) |--libstdc++ (libstdc++ C++实现库) | |--include (头文件) | `--src (源代码) |--libthread_db (多线程程序的调试器库) | `--include (头文件) `-- linker (动态链接器) `--arch (支持arm和x86两种架构) 5

  6. |--bootloader (适合各种bootloader的通用代码) | `--legacy (估计不能直接使用,可以参考) | |--arch_armv6 (V6架构,几个简单的汇编文件) | |--arch_msm7k (高通7k处理器架构的几个基本驱动) | |--include (通用头文件和高通7k架构头文件) | |--libboot (启动库,都写得很简单) | |--libc (一些常用的C函数) | |--nandwrite (nandwrite函数实现) | `--usbloader (usbloader实现) |-- diskinstaller (android镜像打包器,x86可生产iso) `--recovery (系统恢复相关) |--edify (升级脚本使用的edify脚本语言) |--etc (init.rc恢复脚本) |--minui (一个简单的UI) |--minzip (一个简单的压缩工具) |--mtdutils (mtd工具) |--res (资源) | `--images (一些图片) |--tools (工具) | `--oat (OTA Over The Air Updates升级工具) `-- updater (升级器) 6

  7. frameworks 目录 (核心框架----java及C++语言) |-- base (基本内容) | |-- api (xml文件,定义了java的api) | |-- awt (AWT库) | |-- build (空的) | |-- camera (摄像头服务程序库) | |-- cmds (重要命令:am、app_proce等) | |-- core (核心库) | |-- data (字体和声音等数据文件) | |-- docs (文档) | |-- graphics (图形相关) | |-- include (头文件) | |-- keystore (和数据签名证书相关) | |-- libs (库) | |-- location (地区库) | |-- media (媒体相关库) | |-- obex (蓝牙传输库) | |-- opengl (2D-3D加速库) | |-- packages (设置、TTS、VPN程序) | |-- sax (XML解析器) | |-- services (各种服务程序) 7

  8. | |--telephony (电话通讯管理) | |--test-runner (测试工具相关) | |--tests (各种测试) | |--tools (一些叫不上名的工具) | |--vpn (VPN) | `--wifi (无线网络) |--opt (可选部分) | |--com.google.android (有个framework.jar) | |--com.google.android.googlelogin (有个client.jar) | `--emoji (standard message elements) `--policies (Product policies are operating system directions aimed at apecific uses) `--base |-- mid (MID设备) `--phone (手机类设备一般用这个,与锁屏有关的代码) 返回首页 8

  9. 2.2 Android 编译系统 在build/core中build-system.html中如下阐述: 1. Multiple Targets 2. Non-Recursive Make 3. Rapid Compile-Test Cycles 4. Both Environment and Config File Based Settings 5. Object File Directory / make clean 9

  10. Android 编译系统 Android编译系统具有支持多架构(linux-x86、windows、arm等)、多语言(汇编、C、C++、Java等)、多目标、多编译方式。 Android编译系统(build system)集中于Android源码下的build/core下 10

  11. Android 编译系统

  12. Android 编译系统 main.mk (主控Makefile文件) base_rules.mk (对一些Makefile的变量规则化) config.mk (关于编译参数、编译命令的一些配置) definations.mk (定义了很多编译系统中用到的宏,相当于函数库) Makefile(主要控制生成system.img,ramdisk.img,userdata.img,以及recorvery image,sdk等) Binary.mk ( 控制如何生成目标文件) Clear_vars.mk (清除编译系统中用到的临时变量) Combo/linux-arm.mk (控制如何生成linux-arm二进制文件,包括ARM相关的编译器,编译参数等的设置) Copy_headers.mk (将头文件拷贝到指定目录) 分散于各个目录下的Android.mk (控制生成局部模块的源码,名称所需头文件路径,依赖库等特殊选项) Build/envsetup.mk (编译环境初始化,定义一些实用的shell函数,方便编译使用) 12

  13. Android build system的配置部分的主要构成及相互关系 13

  14. main.mk l         初始化相关的参数设置(buildspec.mk、 envsetup.mk、config.mk) l         检测编译环境和目标环境 l         决定目标product l         读取product的配置信息及目标平台信息 l         清除输出目录 l         检查版本号 l         读取Board的配置 l         读取所有Module的配置 l         根据配置产生必要的规则(build/core/Makefile) l         生成image 14

  15. 不同编译目标对应的文件

  16. 不同编译目标对应的脚本关系 16

  17. Android.mk写法 (1)首先需要指定LOCAL_PATH变量,用于查找源文件 LOCAL_PATH:=$(call my-dir) (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束 17

  18. Android.mk语法 include $(CLEAR_VARS)  让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量 编译名称(LOCAL_MODULE := <build_name>) 定义一些标记 (LOCAL_MODULE_TAGS := eng development) 决定你的程序需要哪些文件: (LOCAL_SRC_FILES := main.c). 定义是否链接到其他库 (LOCAL_SHARED_LIBRARIES := cutils) include $(BUILD_STATIC_LIBRARY)表示编译成静态库include $(BUILD_SHARED_LIBRARY)表示编译成动态库include $(BUILD_EXECUTABLE)表示编译成可执行程序 18

  19. Android.mk简单示例 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY) 19

  20. 编译成静态库示例 include $(CLEAR_VARS)LOCAL_MODULE = libhelloLOCAL_SRC_FILES = hello.cLOCAL_C_INCLUDES = $(INCLUDES)LOCAL_SHARED_LIBRARIES := libcutilsLOCAL_COPY_HEADERS_TO := libhelloLOCAL_COPY_HEADERS := hello.hinclude $(BUILD_STATIC_LIBRARY) 20

  21. 编译成动态库示例 include $(CLEAR_VARS)LOCAL_MODULE = libhelloLOCAL_SRC_FILES = hello.cLOCAL_C_INCLUDES = $(INCLUDES)LOCAL_SHARED_LIBRARIES := libcutilsLOCAL_COPY_HEADERS_TO := libhelloLOCAL_COPY_HEADERS := hello.hinclude $(BUILD_SHARED_LIBRARY) 21

  22. 编译成可执行文件 LOCAL_PATH=$(call my-dir) include $(CLEAR_VARS)LOCAL_SRC_FILES:=main.c LOCAL_C_INCLUDE +=$(LOCAL_PATH) LOCAL_MODULE:=helloexe LOCAL_MODULE_TAGS:=enginclude $(BUILD_EXECUTABLE) 22

  23. 2.3 Init初始化脚本语言 • init是Linux用户空间的第一个进程(1号进程) • init的职责 • init进程负责创建系统中的几个关键进程 • init还提供一个Property service来管理系统的很多属性 • Init会解析两个配置文件 • 与硬件平台相关的配置文件 • 系统配置文件: init.rc 23

  24. Init初始化脚本语言 Android系统具有自己风格的*.rc初始化文件,这些初始化文件的具体语法规则,可以参考源代码树system/core/init/readme.txt文件中的介绍 Init.rc脚本的实例可以参考源代码树 system/core/rootdir/init.rc文件中的介绍 Android的Init初始化脚本语言由Actions、Commands、Services、Options四类组成 24

  25. Init初始化脚本语言:语法约束描述 1、所有类型的语句都是基于行的,语句由空格分开的标记组成。当标记中包含空格时,用C语言风格的反斜杠进行转义。用行末的反斜线表示续行。 2、以‘#’开始的行是注释行 3、Actions和Services语句隐含表示一个新的段落的开始。Commands和Options归属于上方最近的一个段落。第一个段落之前的Commands和Options将被忽略。 4、Actions和Services拥有唯一性的名字。如果出现重名,那么后出现的定义将被作为错误而略掉 25

  26. Actions Actions由一系列的commands组成,同时拥有一个触发器用来决定Actions何时发生。on <trigger> <command> <command> <command> 26

  27. Services Services是由Init启动的程序,并在退出时重启 service <name> <pathname> [ <argument> ] * <option> <option> …… 27

  28. Options Options是Services的修饰器,将影响Init如何、何时运行service 28

  29. Triggers Triggers(触发器)是用来匹配导致Action发生的某种事件 29

  30. Commands 30

  31. Properties 返回首页 Init更新一些系统属性来提供洞察它正在做什么 31

  32. 谢谢 32 32 32

More Related