最近公司要整android内部培训,分配给我写个培训文档,这里记录如下:


撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897277#t17


导读:

关于的Android目录分析,网上有很多资料,在此不做全面介绍.

本文只简单介绍Android中我常涉及的到的一些目录与文件,文中都属个人观点,仅供参考~以google官方Android4.2.2源码为例.

各个厂商平台可能会有出入.

android源码目录为“/”根目录.


——jscese

2014/11/3



/bootable

这个目录下存放android部分启动相关代码,包括androidrecovery模式,一般用于进行OTA升级,由C++编写,可以看到用于显示的ui.cpp和安装的install.cpp,模式入口为recovery.cppmain.





/build

这是android源码中编译核心所在地,把这个目录下的所有mk搞清楚,android的编译体系就基本了如指掌了.



./envsetup.sh

编译初始化shell脚本,编译配置命令lunch.m.mm.mmm等发源地,所以android

编译的初始阶段需要source*,其最终目的都会执行到这个脚本,把这个脚本中的变量以及函数设置到当前终端的临时变量中,供后续使用.

由此脚本中的lunch选取product_name引入到core中的mk等一系列的初始配置,最后会打印出TARGET变量等.供源码中编译使用!

这里详情可参考Android——编译系统初始化设置





./core/main.mk

Make-j*时的makefile入口文件,会对编译体系中的变量进行一些校对,编译类型之类的,并且加载整个源码下的Android.mk文件,整体的编译框架,终极目标.PHONY:droid

./core/Makefile

由上面的main.mk引入,算作android真正的主makefile,由它再依赖到各个子编译体系.



./core/base_rules.mk

android整体编译时,会加载根目录下所有的Android.mk文件,并且根据文件中的MODULE依次分析相关属性,生成编译规则,其中不同的MODULE类型就需要在Android.mkinclude$(**)加载对应mk,分别对应core目录下的mk.

比如编译apkAndroid.mk需要末尾include$(BUILD_PACKAGE),此时解析到这里的时候就会加载core下的package.mk,其中会加载进java.mk在这里会加载到base_rules.mk中计算一些变量值,创建一些基本的依赖规则,再又java.mk中调用函数$(transform-**)编译,类似:

$(transform-java-to-classes.jar)java文件编译成classes.jar

其它模块类型类似.



./core/definitions.mk

这个文件下都是一些编译的函数宏定义,比如上面调用transform-java-to-classes.jar

以及常常出现在Android.mk中的all-java-files-under等等...都可在这里找到具体实现





./target/product/security

这个文件下面存放的就是当前编译系统使用的签名密钥对,用于系统不同组件在编译的时候进行数字签名,android原生默认使用testkey,这目录下有README以及密钥对制作脚本make_key,可以用来制作属于自己的签名密钥,使整个系统签名独一无二,更具安全性!关于android的签名机制,详情可参考Android——编译release版签名系统





./tools/releasetools

Buildtools目录,全是一些用于编译的工具脚本和可执行工具,其中releasetools下是用于编译制作androidOTA刷机包时的python脚本集合,由上面说到的主Makefile中调用进ota_from_target_files中的defmain(argv):








/cts

google提供的CompatibilityTest Suite (CTS)兼容性测试组,用于测试android系统的兼容性以及稳定性,发测试reportgoogle过了这个认证,算是得到google的认可的.一般的android源码都是有这个组件源码的,但是不在主编译流程中,需要使用makects编译出android-cts目录供使用,也可去http://source.android.com/compatibility/downloads.html下载对应版本最新的组件.作为一个android产品,这个测试还是很有意义的,据传不懂CTS就不算一个合格的android开发人员~



./tests/tests

存放CTS测试用例的地方,全是androidapk,添加自己的测试用例也在此.





./CtsTestCaseList.mk

这是cts模块组件的编译选项配置mk,由上面说到的build中的cts.mk调用,对于自己添加的测试用例需要添加进这里面的cts_test_packages变量中.





./tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java

可以这里看CTS_BUILD_VERSION确定你当前源码中的cts版本.



./tools/tradefed-host/README

google提供的readme,有介绍如何配置cts环境以及使用的常用命令


关于CTS 可参考我之前的博客:Android—— ubuntu下【CTS】测试TV真机








/device

这个作为android源码中对产品的描述文件夹,各个平台的差异还是比较大的,但是怎么改动,本意是不变的,只是作为要编译的产品的配置文件夹,这里简单以google源码中存放的samsung为例.



./samsung/tuna/AndroidProducts.mk

一般的存放规则是/device/厂商目录/产品目录,这个mk里面一般是定义当前产品的主配子mk,对于这个AndroidProducts.mk什么时候被加载,具体可去看android编译初始化阶段,lunch选取产品之后的一系列mk初始化操作.



./samsung/tuna/BoardConfig.mk

这个配置文件,看名字就知道了,定义的都是跟硬件配置相关的.这个mk依赖级别在产品角度算是最高的了,如果想添加一些控制宏,可以考虑加在这里.



./samsung/tuna/device.mk

这里配置最多的就是产品编译需要的组件了,一般配置最多的PRODUCT_COPY_FILES以及PRODUCT_PACKAGES,这两个变量在编译体系中的作用不多做介绍~

可参考:Android——编译安装Module的控制因素

Android——编译体系中的【PRODUCT_COPY_FILES】【ALL_PREBUILT】【BUILD_PREBUILT】

./samsung/tuna/recovery.fstab

熟悉linux的对这个fstab应该比较熟悉了,这里配置的就是recovery模式下的分区,会用于制作OTA刷机包时对分区的配置参数.



vendorsetup.sh

一般会将产品的编译信息存在这个文件中,类似add_lunch_combofull_maguro-userdebug

在编译初始阶段由lunch加载供编译者选择,这其中full代表整体编译,maguro代表产品名,userdebug代表编译类型,android的产品编译类型可另行参考,不多做介绍~

可参考上面的Android——编译安装Module的控制因素









/external

这是android存放外部工具组件的地方,以文件夹为单一模块,最终编译出来的有可执行文件,jar包,动静态库,东西比较混杂,google已经移植了很多工具在这里面,如果自己想移植一些模块进android系统,可以加在这里,写好Android.mk,在上面提到的device.mk中加入PRODUCT_PACKAGES变量中.

像这种移植可参考:Android——4.2 - 3G移植之路之usb-modeswitch (二)





/frameworks

android的运行框架集合,包含系统运行的各种服务框架,向app层提供api,根据JNI机制或者socket往下层调用,也可使用hw_get_module调用到hardware层的module.



./base/core

字面意思,核心所在,包含java以及jni,核心组件的java类以及native方法的jni映射,其中内容太多,比如javaapp相关的ActivityManager.java,启动相关的ZygoteInit.java,其中的jni目录会被编译成libandroid_runtime.so作为android运行时的动态库供相关的java加载.





./base/services

框架层中的系统服务存放目录,包含系统时间服务以及输入子系统服务,同上java目录下就是服务的java类了,可以看到各种子服务模块,比如pmnetdisplay,如果想具体了解当前系统启动了多少服务,可以参考SystemServer.java



./opt/telephony

android电话子系统存放目录,向上提供api接口,向下通过RIL.javasocket通信.











/hardware

硬件抽象层,描述对linuxkernel中的相关驱动模块的具体操作,而在kernel中的驱动模块只拥有通用操作接口,比如设置寄存器值,IO拉高拉低,但是具体设置什么值,拉高拉低的时序都写在hardware层相对应的module中,这就是google对于硬件驱动的商业保护.

./libhardware/hardware.c

hardware机制核心所在,定义了相关规则,比如load打开modules编译生成的.so,抽象成一个module,向上层提供hw_get_module接口以及module配置宏.



./libhardware/modules

这里就是与kernel相对应的module存放的地方,头文件存在同级目录的include中,在其中定义module结构,接口方法以及唯一的moduleID.

其中像gralloc就是控制kernel中显示屏驱动的module,用于管理控制fb缓冲区,将来自上层displaySurfaceFlinger服务传下来的图像推送到lcd/led显示屏上.其它类似.



./ril

android电话系统的ril驱动文件目录,其中包含:

rild— ril主体控制机制

libril— ril与上层socket通信,

reference-ril— rilserial设备AT指令通信

这三个文件夹,其中reference-ril是第三方驱动,根据不同的设备选择不同.

关于androidRIL机制不多做介绍~

可参考:Android——RIL 机制源码分析







/system

android系统底层的文件系统,应用组件,包含一些系统库,以及启动的配置文件.



./core/init/init.c

作为系统启动到android层的第一个进程,也将一直作为守护进程,解析init.rc配置文件,

启动相关服务,其中就有比较常用的属性服务,之后一直运行于init进程中,具体可参考property_service.candroid层系统启动从这里开始,详情另行参考~

可参考:Android——启动过程详解



./core/rootdir

存放配置文件,其中init.rc作为启动配置,ueventd.rc作为linux文件系统中文件事件配置,还包含磁盘挂载所需要的vold.fstab配置文件等...



./core/include/private/android_filesystem_config.h

这个头文件定义了,android文件系统中文件的权限配置.





./vold

android舍弃了linuxudev机制,自己弄了一套磁盘挂载管理机制,就是vold,作为系统服务在init.rc配置启动,用于磁盘的挂载等相关操作,通过netlinksocket接收来自kerneluevent,与上层MountService通过一个名为voldsocket通信,入口为main.cpp中的main函数,vold机制详情另行参考~

关于Vold机制可参考我之前的专栏:Android— 4.2 Vold













/out

作为android源码编译结果存放目录,其中包含各种中间文件以及目标文件.obj中存放的中间件以及hostlinux-x86存放的本地编译项.



./target/product/product_name/system.img

android系统编译出来的镜像文件,也是整个源码的最终目标文件.



./target/product/product_name/system

编译之后的系统文件夹,也是system.img的主要构成,其中app目录下都是apk文件,android中规定此目录下的apk作为系统内置应用,在文件系统中拥有系统权限,普通用户没有权限删除更改,详情可参考PackageManager.其中的bin代表可执行文件,etc下存放的都是系统配置文件,lib中都是些动态库,分别对应到文件系统中.



./target/product/product_name/system/build.prop

这个文件中收集了编译中的所有属性,包括编译的主机环境,编译目标的各种配置信息等等...生成过程可参考主Makefile,在初始化阶段会被property_service服务加载,作为系统属性.

可参考:Android——build.prop 解析



./target/product/product_name/data/

此目录作为userdata存储目录,对应文件系统中的/data目录,平时用户安装的apk就会被copy到这个该目录的app目录下,android系统中apk所产生的数据,比如数据库等都会存放在/data/data中,以包名区分.



其中一般还有recovery,root等目录,存放相对应的产物,不同平台编译出来的out目录会有所出入.




更多相关文章

  1. Android多媒体开发高级编程——目录
  2. android的文件读写
  3. Android Android.mk 文件一点感悟
  4. Android 系统服务的两种注册方式
  5. android中build.gradle文件简单说明
  6. Android 代码实现logcat输出到文件
  7. android 使用系统照相程序照相并存储、显示在界面上

随机推荐

  1. Android 消息通知栏Notification使用和权
  2. Android Property实现介绍
  3. 如何获得Android的System Bar’s Height
  4. Could not find gradle wrapper within A
  5. Android Camera Subsystem - startPrevie
  6. Android(安卓)studio使用NDK编译和调试(
  7. android studio获取SH1码
  8. Android 10 Camera -- 3A Modes and Stat
  9. 在线看Android系统源码,AndroidXRef的简易
  10. Android 中常用 MimeType 及对应文件类型