有研究android系统源码的博客吗
发布时间:2025-05-12 14:34:06 发布人:远客网络
一、有研究android系统源码的博客吗
我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径。根据前辈的经验,Android底层完全入门需要两年。
第零步,下载源码,我下的4.2的,框架层源码10G,内核2G多,ctags给框架层建的标签文件都有600M,当时让我有点震撼,用的vim+ctags+cscope来阅读,还算不错,架构挺清晰的。
第一步,我找到了一本好书《Android的设计与实现第一卷》它讲了Android框架层的启动,初始化,服务框架初始化,Binder,消息循环,PackageManagerService,ActivityManagerService。据作者说后面会出讲UI子系统的第二卷,拭目以待。其实这本书看了几十页我就发现需要第二步的知识,否则看不下去,于是跳去第二步。
第二步,学习Linux系统编程,在看《Android的设计与实现》的时候我发现,框架层的Native部分,全是Linux编程。为了掌握这部分知识,我花了4个月学习了《Linux系统编程手册》(TLPI)这本1000多页的书,我以前是搞WIndows文件系统这块的,所以C语言还比较熟,TLPI的习题很有意思,量也比较大,坚持下来还是收获很多。
第三步,花了4个月学习了一些Linux内核的知识,看了LKD,PLKA看了一半多。越学越没底,觉得不懂得越来越多,不过这个也正常,只有靠慢慢磨,估计以后要不断的磨这块。
第四步,回头看Android源码,这次一口气看完了《Android的设计与实现第一卷》,终于对框架层有了谱。同时真的数次把我看晕,前面看Linux内核源码都没这么晕,不断在Java层和Native层之间跳有点磨脑浆。其中我又觉得Java的基础没有打太牢,回去补了一个月的《Core Java》第八版。但是这书没有涉及UI子系统,于是又看了《Android内核剖析》
第五步,《Android内核剖析》(这本书实际上是讲框架层的,作者也是个搞嵌入式的,所以他在写框架层的时候文笔不太好,很罗嗦,不过还是有很多看点,到他后来写做ROM,玩开发板时估计是说到了他的本行,一下子遛起来了看得出还是挺有水平的,这本书知识有点旧毕竟讲的是2.3很多代码已经过时,但是作者很多点子很有参考价值)这本书讲UI子系统和按键/触摸消息处理系统还是很有分量的,尤其13章View绘制那里,结合源码研究很有收获。而后面他讲编译框架和ROM相关的东西都是挺宝贵的资料。
第六步,为了再补一下其他诸如电源管理模块等子系统的知识看了,《深入理解android》系列,个人认为这个系列看起来有点不太舒服,不过作为补充印证还是比较有价值。
第七步,《Android系统源代码情景分析》,罗升阳的源码分析大作,比《Android的设计与实现》分析得更细致,但缺点是涉及到模块比较少,选用的源码也比《Android的设计与实现》更旧一点。看完书后需要去研究作者的博客,东西挺多的,一定让你满意。
第八步,买块开发板自己玩。这步我还没走到,原因是我觉得我还差点准备知识。可能要再几个月,到时准备入块6410或者树莓派。
最后,由于我11年以前都是搞Windows这块的,所以对Linux知识不是很了解,不得已看了这么些书,如果是一直做Linux的人,很多步骤估计可以省掉了。直接上源码才是正道。
我本身做着移动GIS开发的工作,学框架层全是因为兴趣,但招聘平台Android框架层开发人员还是蛮有竞争力的有不少定制ROM,智能电视的工作都处于人才难求状态,毕竟有一定的门槛,现在各种ios培训,让奔着钱干开发的人纷纷涌入,而ios只能干sdk开发的缺点就暴露出来了,一堆新手老手,菜鸟大牛全挤在SDK开发这块,我觉得不太妙。反观Android这边,虽然入门菜鸟没有搞ios来钱,但是可持续性很好,从sdk-》框架》驱动》内核这样干下去。干着干着发现自己渐渐变成了Linux开发者/嵌入式开发者的人也不少,新人,老手,菜鸟大牛各居其位,层次性很好。
二、如何编译一个精简的Android系统
本次试验使用的android源码是4.2,编译的架构是mini-mips。
1、修改build/target/product/mini.mk,去掉一些不必要的模块(例如Phone、DownloadManager等)
2、修改SystemServer.java,屏蔽一些service,让系统能够启动起来(例如,Location Manager、Telephony Registry)
3、修改dalvik/vm/native/dalvik_system_Zygote.cpp,注释掉因为检查不到外部存储而导致dalvik abort的地方(这是googel的一个bug,在2013年1月份已解决,如果用这以后的代码不用修改此处)
4、修改WindowManagerService.java,把发送BOOT_TIMEOUT消息的时间改为0(之前为30秒)
二、系统优化后的效果(验证工作均在mips模拟器上进行)
1、节省运行内存,下面是全编译与mini编译的内存使用状态的对比
3、只启动home程序,其余的应用程序均被移除
1、adb,ddms,apkinstall等,都能正常工作
2、在eclipse中编写的android应用程序能够运行在该mini-android之上
本次测试使用Gallery.apk应用程序,修改其源码后可以实现随系统的启动而自动启动的功能。
三、怎样阅读Android系统源码
由于工作需要大量修改framework代码,在AOSP(Android Open Source Project)源码上花费了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用类的实现,在Android包管理器里把源码下载下来,随便一个IDE配好Source Code的path看就行.
但如果想深入的了解Android系统,那么可以看下我的一些简单的总结.
Java是AOSP的主要语言之一.没得说,必需熟练掌握.
Android基于Linux的,并且AOSP的推荐编译环境是Ubuntu 12.04.所以熟练的使用并了解Linux这个系统是必不可少的.如果你想了解偏底层的代码,那么必需了解基本的Linux环境下的程序开发.如果再深入到驱动层,那么Kernel相关的知识也要具备.
AOSP使用Make系统进行编译.了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.
AOSP使用git+repo进行源码管理.这应该是程序员必备技能吧.
Android系统的一些性能敏感模块及第三方库是用C++实现的,比如: Input系统, Chromium项目(WebView的底层实现).
AOSP代码下载需要你拥有一个流畅的国际网络.如果在下载代码这一步就失去耐心的话,那你肯定没有耐心去看那乱糟糟的AOSP代码.另外,好程序员应该都会需要一个流畅的Google.
如果只是阅读源码而不做太多修改的话,其实不需要太高的配置.
AOSP项目默认只支持Nexus系列设备.没有也没关系,你依然可以读代码.但如果你想在大牛之路走的更远,还是改改代码,然后刷机调试看看吧.
要刷机时线坏了,没有更窝心的事儿了.
注意不要用OpenJDK.这是个坑,官方文档虽然有写,但还是单独提一下.
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default
估计会有不少人吐槽,为什么要用这个老古董.其实原因很简单,合适.刚开始搞AOSP时,为了找到效率最优的工具,我尝试过Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags.最终结果还是Eclipse.主要优点有:
有语法分析(快速准确的类,方法跳转).
支持C++(IntelliJ的C++支持做的太慢了).
嵌入了DDMS, View Hierarchy等调试工具.
为了提高效率,花5分钟背下常用快捷键非常非常值得.
调整好你的classpath,不要导入无用的代码.因为AOSP项目代码实在是太多了.当你还不需要看C++代码时,不要为项目添加C++支持,建索引过程会让你崩溃.
开发App必备.当你要调试系统的某个功能是,常常需要迅速写出一个调试用App,这个时候老旧的Eclipse就不好用了. Itellij IDEA的xml自动补全非常给力.
这个一定要先读.项目介绍,代码下载,环境搭建,刷机方法, Eclipse配置都在这里.这是一切的基础.
这个其实是给App开发者看的.但是里面也有不少关于系统机制的介绍,值得细读.
此老罗非彼老罗.罗升阳老师的博客非常有营养,基本可以作为指引你开始阅读AOSP源码的教程.你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:
早期的博客是基于旧版本的Android;
大量的代码流程追踪.读文章时你一定要清楚你在看的东西在整个系统处于什么样的位置.
邓凡平老师也是为Android大牛,博客同样很有营养.但是不像罗升阳老师的那么系统.更多的是一些技术点的深入探讨.
Android官方Issue列表.我在开发过程中发现过一些奇怪的bug,最后发现这里基本都有记录.当然你可以提一些新的,有没有人改就是另外一回事了.
一定要能流畅的使用这个工具.大量的相关知识是没有人系统的总结的,你需要自己搞定.
AOSP的编译单元不是和git项目一一对应的,而是和Android.mk文件一一对应的.善用mmm命令进行模块编译将节省你大量的时间.
这是Android最基础的进程间通讯.在Application和System services之间大量使用.你不仅要知道AIDL如何使用,也要知道如何手写Binder接口.这对你理解Android的Application和System services如何交互有非常重要的作用. Binder如何实现的倒不必着急看.
除非你对硬件特别感兴趣或者想去方案公司上班,否则别花太多时间在这一层.
这是一个基于AOSP的第三方Rom.从这个项目的wiki里你能学到很多AOSP官方没有告诉你的东西.比如如何支持Nexus以外的设备.
这是一个Linux下画UML的工具,能够帮你梳理看过的代码.