330 likes | 602 Views
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 库 )
E N D
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库) |-- 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
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
|--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
|--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
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
| |--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
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
Android 编译系统 Android编译系统具有支持多架构(linux-x86、windows、arm等)、多语言(汇编、C、C++、Java等)、多目标、多编译方式。 Android编译系统(build system)集中于Android源码下的build/core下 10
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
Android build system的配置部分的主要构成及相互关系 13
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
Android.mk写法 (1)首先需要指定LOCAL_PATH变量,用于查找源文件 LOCAL_PATH:=$(call my-dir) (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束 17
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
Android.mk简单示例 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY) 19
编译成静态库示例 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
编译成动态库示例 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
编译成可执行文件 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
2.3 Init初始化脚本语言 • init是Linux用户空间的第一个进程(1号进程) • init的职责 • init进程负责创建系统中的几个关键进程 • init还提供一个Property service来管理系统的很多属性 • Init会解析两个配置文件 • 与硬件平台相关的配置文件 • 系统配置文件: init.rc 23
Init初始化脚本语言 Android系统具有自己风格的*.rc初始化文件,这些初始化文件的具体语法规则,可以参考源代码树system/core/init/readme.txt文件中的介绍 Init.rc脚本的实例可以参考源代码树 system/core/rootdir/init.rc文件中的介绍 Android的Init初始化脚本语言由Actions、Commands、Services、Options四类组成 24
Init初始化脚本语言:语法约束描述 1、所有类型的语句都是基于行的,语句由空格分开的标记组成。当标记中包含空格时,用C语言风格的反斜杠进行转义。用行末的反斜线表示续行。 2、以‘#’开始的行是注释行 3、Actions和Services语句隐含表示一个新的段落的开始。Commands和Options归属于上方最近的一个段落。第一个段落之前的Commands和Options将被忽略。 4、Actions和Services拥有唯一性的名字。如果出现重名,那么后出现的定义将被作为错误而略掉 25
Actions Actions由一系列的commands组成,同时拥有一个触发器用来决定Actions何时发生。on <trigger> <command> <command> <command> 26
Services Services是由Init启动的程序,并在退出时重启 service <name> <pathname> [ <argument> ] * <option> <option> …… 27
Options Options是Services的修饰器,将影响Init如何、何时运行service 28
Triggers Triggers(触发器)是用来匹配导致Action发生的某种事件 29
Commands 30
Properties 返回首页 Init更新一些系统属性来提供洞察它正在做什么 31
谢谢 32 32 32