Anroid源码入门.docx
- 文档编号:2463706
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:9
- 大小:50.62KB
Anroid源码入门.docx
《Anroid源码入门.docx》由会员分享,可在线阅读,更多相关《Anroid源码入门.docx(9页珍藏版)》请在冰豆网上搜索。
Anroid源码入门
Anroid源码入门
因为项目的原因,本文以android-x86-1.6源码为目标讲解。
如果是android源码或者android-x86其它版本的源码,某些模块和本文会有差异,但是整体结构上(目前)是一致的。
一,获得Android源码
二,初始Android源码
Android-x86-1.6(下面以android简称)的源码顶层目录如下:
bionicbootablebuilddalvikdevelopmentexternalframeworkshardwareMakefilepackagesprebuiltsystemvendor
Bionic:
bionic本意是仿生学的意思。
在Android中,bionic目录存放的是基本的C库的源码。
Bionic库是Google为Android开发的c库,作为glibc的替代品,相对于glibc,bionic有3优势:
License:
glibc使用的是LGPL,而bionic使用的BSD
Andoird的源码大多采用了ASL和BSD,至于为什么没有采用GPL,可以参考下面的文章。
//cq- 大小: 显然bionic要小,毕竟android是正对嵌入式平台,flash可不像硬盘动辄几百G。 运行速度: 同样,ArmCPU的运行速度对这种底层的C库提出了更高的要求。 而且作为专门针对android开发的底层库,google可以在bionic中内建某些android特性的支持。 总的来说,bionic相对于glic更轻量级,更适合android,且没有传染性。 这个目录在我们的开发只能算个路人,一般不会去修改里面的代码,甚至都不需要去打开他。 Build: Build目录存放的是buildandroid源码过程中需要用到的各种脚本和工具。 这个目录对我们来说还是比较的重要的,虽然不一定会经常修改里面的代码,但是里面的Makefile对于弄清楚android的编译流程是很有帮助的。 此目录的结构如下: buildspec.mk.defaultcleanspec.mkcoreenvsetup.shhistorylibstargettools 请记住core这个子目录,里面的一大堆Makefile在接下会接触到。 不夸张的说,看明白了core,就弄明白了android的这一大堆的源码是如何一一被编译并生成最后的目标文件。 Target目录存放的是一些通用的编译目标,如generic,emulator等。 如果我们在编译时不指定特殊的目标,则会编译这些通用的目标。 Dalvik: 此目录存放JAVA虚拟机的相关代码,无视。 Development: 这个目录存放的是android开发时需要的各种模板以及仿真工具,对于portingandroid来说,意义不大。 External: 进去到这个目录,可以发现里面存放着很多tool和lib,如bison,bluez,bzip2等,这些tool和lib经过编译之后会放到目标镜像中。 如果我们需要在Android系统中加入一些额外的tool或者lib,可以选择在external目录下增加子目录。 Frameworks: 此目录存放应用程序的框架层代码。 一般将Android从架构上分为4个层次,自下而上一次是: LinuxKernel,Librariesandruntime,Applicationframework,application。 那么本目录对应其中的applicationframework层。 进入此文件夹,里面的源码大多都是java源码。 因为applicationframework的下层已经提供了javaruntime,这一层次的代码已能直接运行java程序。 如果要修改Android的界面,有可能涉及到此目录的源码。 Hardware: 存放硬件相关的lib。 这一部分的代码相对较少,且是C语言写成,有兴趣可以进入研究一下。 Kernel: 毫无疑问,这个目录放的是linuxkernel,android-1.6-x86有两个kernel版本可以选择,2.6.29和2.6.32,默认kernel是2.6.29,如果要使用2.6.32,需要在kernel目录下执行命令: Gitcheckout–bandroid-2.6.32x86/android-2.6.32 关于kernel的编译,需要注意以下几点: 1,编译的目录并不在kernel本身的目录,而在out/vendor/product/obj/kernel目录下。 2,正因为1,所以如果在编译kernel时,需要链接某个现成的lib,需要将该lib拷贝到out/vendor/product/obj/kernel的对应位置 对于android的kernel的特性,直接引用android官方的描述: TheAndroidLinuxkernelincludesenhancementstotheLinux2.6kernelthatprovideadditionaldriverstosupporttheAndroidplatform,including: ∙Binder: anOpenBinder-baseddrivertofacilitateinter-processcommunication(IPC)intheAndroidplatform. ∙AndroidPowerManagement: alightweightpowermanagementdriverbuiltontopofstandardLinuxpowermanagementbutoptimizedforembeddedsystems. ∙LowMemoryKiller: Basedonhintsfromtheuserspace,thelowmemorykillercankilloffprocessestofreeupmemoryasnecessary.ItisdesignedtoprovidemoreflexibilitythantheOutOfMemory(OOM)killerinthestandardkernel. ∙Logger: Alightweightloggingdeviceusedtocapturesystem,radio,logdata,etc. ∙USBGadget: UsestheUSBfunctionframework. ∙Android/PMEM: ThePMEM(physicalmemory)driverisusedtoprovidecontiguousphysicalmemoryregionstouserspacelibrariesthatinteractwiththedigitalsignalprocessor(DSP)andotherhardwarethatcannotcopewithscatter-gather. ∙AndroidAlarm: Adriverwhichprovidestimersthatcanwakethedeviceupfromsleepandamonotonictimebasethatrunswhilethedeviceisasleep. LookforAndroid-specificenhancementsinthefollowingdirectories: ∙/drivers/android ∙/drivers/misc ∙/include/linux Packages: 之前说frameworks对应了四层架构中的applicationframework层,那么本目录则对应了application层。 里面都是各种上层application的java源码。 如果想在android系统中添加上层应用程序,应该在本文件夹中的apps子目录添加。 Out: 此目录在为编译之前是不会出现的,在经过一次编译之后才会出现。 如果在编译时加入了TARGET_PRODUCT=eeepc的参数,那么、/vendor/asus/eeepc/目录下的编译规则会被采用,同时会生成/out/target/product/eeepc/的目录,如果编译成功,该目录下的文件列表应如下: clean_steps.mkgrubinstallerkernelprevious_build_config.mkrootsystemusb_boot eeepc_usb.imginitrd.imginstall.imgobjramdisk.imgsymbolssystem.sfsusb_tmp.img 其中eeepc_usb.img是最终镜像;usb_temp.img是未安装grub的中间镜像,usb_boot目录则是usb_temp.img对应的目录;kernel,initrd.img,install.img,ramdisk.img,system.sfs是更早的中间产物,grub,installer,root,system则是对应的未打包的目录;obj是最初期的中间产物,可以看成是编译目录,比如kernel的编译并不会在/kernel目录中生成任何obj文件,全部都在obj目录中。 之所以在out目录上费了较多的笔墨,是因为弄清楚out目录中的结构可以更好的了解android的编译流程,另外我们也可以在编译过程中,通过对out目录的操作,去改变最终镜像里的内容。 比如我们在system目录中加入一些tool和lib,则会在最终镜像中体现出来。 当然这种更改方式只是一种暂时性的,可以作为调试手段,不能正式发布。 Prebuild: 各种平台下的预编译脚本,无视。 System; 存放Anroid系统的底层库和tool。 System目录和external目录中的代码构成了android四层架构中的library和runtime层。 Vendor: 此目录存放了特定硬件平台的编译配置。 Android-1.6-x86的release源码默认提供了eeepc和q1u两款设备的编译配置。 如果我们需要增加新的硬件平台,则需要在此目录中增加内容。 Makefile: 前面介绍的都是目录,Makefile是android顶层目录中唯一的一个文件,也许是太寂寞的原因,Makefile里面只有三行的文字: ###DONOTEDITTHISFILE### includebuild/core/main.mk ###DONOTEDITTHISFILE### 而其中真正干活的只有中间的一行,谁能想到android这么庞大的代码群的顶层Makefile会如此的简单。 实际上这个Makefile只是个介绍人,他将带着我们去认识真正的顶层Makefile----build/core/main.mk。 三,剖析Makefile 上一章介绍完了android的代码结构,并留了一个介绍人,以便我们进入android的Makefile世界。 现在我们就随着这个介绍人去一探究竟。 Makefile
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Anroid 源码 入门