1.目录abi
定义:应用程序和操作系统之间、一个应用和它的库之间、应用的组成部分之间的底接口
查看文件夹abi/cpp下目录:
include:cxxabi.h、new、typeinfo
src:
Android.mk
use_rtti.mk
abi文件的作用: abi规定了二进制文件的格式、内容,装载/卸载程序的要求,函数调用时的参数传递规则,寄存器、堆栈的使用
ABI与API的区别:
API定义了源代码和库之间的接口
1、同样的代码可以在支持API的任何系统中编译
2、ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
2.目录art==>Android Runtime
ART——>基于Android4.4以后的版本,意味着最低的版本要求为Android4.4,之前Android版本采用的是Dalvik虚拟机:
Dalvik虚拟机通过以下方式提高性能
1、Dex代码安装时或第一次动态加载时,odex化处理
2、Android2.2版本提供了JIT机制提升性能
3、提高硬件配置,如更多核CPU、更高频率CPU、更多的RAM
ART
优点:
1、系统性能的显著提升
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时
3、更长的电池续航能力
4、支持更低的硬件
缺点:
1、更大的存储空间占用可能会增加10%~20%
2、更长的应用安装时间
总结:ART的功效就是“空间换时间”
art目录下:
compiler:主要负责Dalvik字节码到本地码的转换,编译为libart_compiler.so
dex2oat:完成dex文件到oat文件的转换,编译为dex2oat
runtime:Android ART运行时源代码,编译为libart.so
oatdump:对oat文件进行分析并格式化显示出文件的组成结构
jdwpspy:是java的调试支持部分,即JPWP服务端的实现
…
分析关键1:ART虚拟机的启动过程
Android系统在启动的时候创建Zygote进程充当应用程序孵化器,Zygote进程在启动的过程中又会创建一个Dalvik虚拟机
Zygote进程是通过复制自己(也就是fork)来创建新的应用程序进程,这意味着Zygote进程会将自己的Dalvik虚拟机也复制给应用程序进程
==>Android系统通过将ART运行时抽象成一个Java虚拟机,以及通过系统属性persist.sys.dalvik.vm.lib和一个适配层JniInvocation就可以无缝地将Dalvik虚拟机替换为ART运行
3.目录bionic==>系统底层库
针对Android系统定制的仿生C库、链接器等所在目录。Android并没有使用linux的glibc库,bionic C库针对嵌入式系统优化,添加了一些Android特定的函数API,同时大大减少库的体积,也避免了LGPL版权的问题
libc库 --> C库,如stdio、stdlib、string
libdl --> 动态链接库访问接口
libm --> 数学函数库,提供常见的数序运算和浮点运算
libstd --> 标准C++库
libthreaddb --> 线程调试库,可利用此库对多线程程序进行调试
linker --> 链接器
4.目录bootable==>启动引导相关
bootable目录下:
bootloader --> 引导
diskinstaller --> Android镜像打包器
recovery --> 系统恢复相关
recovery目录下:
1、恢复出厂设置
2、OTA升级
5.目录build==>编译Android系统、Android SDK、及相关文档
make、shell、Python;
build目录下:
core–>Build系统核心文件
定义了整个Build系统的框架
6.目录cts==>兼容性测试用例
手机制造商、运营商在Android打造、定制自己特有的手机操作系统==>添加/更改Android系统源码==>规范更改==>方便上层应用的移植
CTS:对手机的硬件、软件、接口、性能进行测试
通过CTS测试的Android手机系统,Google才会颁发许可,以保证不同厂商之间的Android系统的兼容
一系列Junit Test Suit==>配置xml文件+命令==>自动化测试
测试内容:
1、数据——>必须实现一种无线连接、速率达到200Kbit/s
2、Camera——>至少2M pixels
3、重力加速——>必须有,三维>50Hz
4、指南针——>必须有,三维>10Hz
5、GPS——>必须有
6、内存,Nand、MMS/SMS、AlarmClock
7、第二次启动一个应用的时间不能超过第一次启动时间
8、CTS测试——>必须通过最新的CTS
9、升级——>必须有一种方法升级系统(OTA、USB、SD卡)
CtsTestCaseList.mk——>cts模块组件的编译选项配置,对于自己添加的测试用例,需要添加进这里面的cts_test_package变量中
cts/tools/tradefed_host/README——>介绍如何配置cts环境以及使用的常用命令
7.目录dalvik==>一个应用对应一个单独的Dalvik虚拟机实例
Java虚拟机和Dalvik虚拟机的区别:
1.Dalvik虚拟机使用dex格式类文件,一个dex文件包含若干个类==>可以将各个类中重复的字符串,和其他常数只保存一次——>节省空间,适合在内存和处理器速度有限的手机系统中使用。
2. Java虚拟机使用class格式类文件,一个class文件包含一个类
3. Dalvik虚拟机使用的指令是基于寄存器的==>更多指令空间
4.Java虚拟机使用的指令是基于堆栈的==>更多指令
特性:
内存管理、垃圾收集、JIT、JNI、以及进程和线程管理
Dalvik目录下:
dexdump——>生成dex文件反编译查看工具
dexlist——>查看dex文件里所有类的方法的工具
dexopt——>生成dex优化工具
dx——>生成从Java字节码转换成dalvik机器码的工具
libdex——>生成主机和设备处理dex文件的库
tools——>保存编译/运行相关的工具
(*)vm——>保存虚拟机绝大部分代码,包括读取指令、执行指令等
hit——>生成显示堆栈/对象信息的工具
目录developers==>开发者目录
具体作用未知
目录development==>提供开发所需的工具、例程
工具:cmds/monkey、ide、sdk——>build/sdk.atree、ndk、pdk
例程:apps——>核心应用
samples——>API演示程序、NotePad等
external目录 (android使用的一些开源的模组)
目录简单功能参考:Android之external部分目录功能说明整理 当然不是很完整~
frameworks (核心框架——java及C++语言)
推荐一篇文章详细查看也方便以后的查看:android framework源码目录介绍
android包、API位置:
frameworks/base/core/java
frameworks/base/location/java
frameworks/base/graphics/java
frameworks/base/media/java
frameworks/baseopengl/java
frameworks/base/wifi/java
android资源包 资源文件:图片、多国语言字符串、布局文件、
位于frameworks/base/core/res
目录hardware==>硬件抽象层
描述对linux kernel中的相关驱动模块的具体操作,而在kernel中的驱动模块只拥有通用错左接口,比如设置寄存器值、IO拉高拉低、但是具体设置什么值,拉高拉低的时序都是在hardware层相应的module中,这是Google对硬件驱动的商业保护
./libhardware/hardware.c——>hardware机制核心所在,定义了相关规则,比如load打开modules编译生成的.so,抽象成一个module,向上层提供hw_get_module接口以及module配置宏
./libhardware/modules——>与kernel相对应module存放的地方,头文件存放在同级目录的include中,在其中定义了module结构、接口方法、以及唯一的moduleID
目录sdk、ndk、pdk
目录packages==>应用程序包
packages目录下:
app——>蓝牙、浏览器、计算器、日历、相机、联系人通讯录、桌面闹钟、拨号器、Email、相册、登录启动项(显示图片框架等图形界面、负责应用的调度)、音乐播放器、安装/卸载应用、设置、录音机等系统默认应用(出厂时安装应用)
inputmethods——>输入法
providers——>提供应用界面所需的数据、如日历、联系人等
services——>彩信、来电
wallpapers——>墙纸==>基础壁纸、动态壁纸等
目录platform_testing
目录prebuild==>预编译
目录system==>Android系统底层的文件系统、应用组件、包含一些系统库、以及启动的配置文件
Init.cpp、propery_service.cpp==>系统启动
Android启动过程
system目录下:
Vold——>磁盘挂载机器
linux下采用udev机制
参考文章:http://blog.csdn.net/wo_sxn/article/details/50532071
http://blog.csdn.net/fengliang191/article/details/40678731
参考:老罗Blog
Dalvik虚拟机的启动过程
Dalvik虚拟机的运行过程
JNI函数的注册过程
Java进程和线程的创建过程分析