Android系统源码

来源:互联网 发布:数据缺失的解决方案 编辑:程序博客网 时间:2024/06/05 11:03
作者:王宇龙
链接:https://www.zhihu.com/question/19759722/answer/29213925
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

由于工作需要大量修改framework代码, 在AOSP(Android Open Source Project)源码上花费了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用类的实现, 在Android包管理器里把源码下载下来, 随便一个IDE配好Source Code的path看就行.
但如果想深入的了解Android系统, 那么可以看下我的一些简单的总结.

  • 知识
    • Java
      • Java是AOSP的主要语言之一. 没得说, 必需熟练掌握.
    • 熟练的Android App开发
    • Linux
      • Android基于Linux的, 并且AOSP的推荐编译环境是Ubuntu 12.04. 所以熟练的使用并了解Linux这个系统是必不可少的. 如果你想了解偏底层的代码, 那么必需了解基本的Linux环境下的程序开发. 如果再深入到驱动层, 那么Kernel相关的知识也要具备.
    • Make
      • AOSP使用Make系统进行编译. 了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.
    • Git
      • AOSP使用git+repo进行源码管理. 这应该是程序员必备技能吧.
    • C++
      • Android系统的一些性能敏感模块及第三方库是用C++实现的, 比如: Input系统, Chromium项目(WebView的底层实现).

  • 硬件
    • 流畅的国际网络
      • AOSP代码下载需要你拥有一个流畅的国际网络. 如果在下载代码这一步就失去耐心的话, 那你肯定没有耐心去看那乱糟糟的AOSP代码. 另外, 好程序员应该都会需要一个流畅的Google.
    • 一台运行Ubuntu 12.04的PC.
      • 如果只是阅读源码而不做太多修改的话, 其实不需要太高的配置.
    • 一台Nexus设备
      • AOSP项目默认只支持Nexus系列设备. 没有也没关系, 你依然可以读代码. 但如果你想在大牛之路走的更远, 还是改改代码, 然后刷机调试看看吧.
    • 高品质USB线
      • 要刷机时线坏了, 没有更窝心的事儿了.
  • 软件
    • Ubuntu 12.04
      • 官方推荐, 没得选.
    • Oracle Java 1.6
      • 注意不要用OpenJDK. 这是个坑, 官方文档虽然有写, 但还是单独提一下.
      • 安装:
        sudo apt-get install python-software-propertiessudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java6-installersudo apt-get install oracle-java6-set-default

    • Eclipse
      • 估计会有不少人吐槽, 为什么要用这个老古董. 其实原因很简单, 合适. 刚开始搞AOSP时, 为了找到效率最优的工具, 我尝试过Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最终结果还是Eclipse. 主要优点有:
        • 有语法分析 (快速准确的类, 方法跳转).
        • 支持C++ (IntelliJ的C++支持做的太慢了).
        • 嵌入了DDMS, View Hierarchy等调试工具.
      • 为了提高效率, 花5分钟背下常用快捷键非常非常值得.
      • 调整好你的classpath, 不要导入无用的代码. 因为AOSP项目代码实在是太多了. 当你还不需要看C++代码时, 不要为项目添加C++支持, 建索引过程会让你崩溃.
    • Intellij IDEA
      • 开发App必备. 当你要调试系统的某个功能是, 常常需要迅速写出一个调试用App, 这个时候老旧的Eclipse就不好用了. Itellij IDEA的xml自动补全非常给力.
  • 巨人的肩膀
    • AOSP项目官方: source.android.com/sour
      • 这个一定要先读. 项目介绍, 代码下载, 环境搭建, 刷机方法, Eclipse配置都在这里. 这是一切的基础.
    • Android官方Training: developer.android.com/t
      • 这个其实是给App开发者看的. 但是里面也有不少关于系统机制的介绍, 值得细读.
    • 老罗的Android之旅: blog.csdn.net/luoshengy
      • 此老罗非彼老罗. 罗升阳老师的博客非常有营养, 基本可以作为指引你开始阅读AOSP源码的教程. 你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:
        • 早期的博客是基于旧版本的Android;
        • 大量的代码流程追踪. 读文章时你一定要清楚你在看的东西在整个系统处于什么样的位置.
    • Innost的专栏: blog.csdn.net/innost
      • 邓凡平老师也是为Android大牛, 博客同样很有营养. 但是不像罗升阳老师的那么系统. 更多的是一些技术点的深入探讨.
    • Android Issues: code.google.com/p/andro
      • Android官方Issue列表. 我在开发过程中发现过一些奇怪的bug, 最后发现这里基本都有记录. 当然你可以提一些新的, 有没有人改就是另外一回事了.
    • Google: google.com
      • 一定要能流畅的使用这个工具. 大量的相关知识是没有人系统的总结的, 你需要自己搞定.
  • 其它
    • 代码组织
      • AOSP的编译单元不是和git项目一一对应的, 而是和Android.mk文件一一对应的. 善用mmm命令进行模块编译将节省你大量的时间.
    • Binder
      • 这是Android最基础的进程间通讯. 在Application和System services之间大量使用. 你不仅要知道AIDL如何使用, 也要知道如何手写Binder接口. 这对你理解Android的Application和System services如何交互有非常重要的作用. Binder如何实现的倒不必着急看.
    • HAL
      • 除非你对硬件特别感兴趣或者想去方案公司上班, 否则别花太多时间在这一层.
    • CyanogenMod
      • 这是一个基于AOSP的第三方Rom. 从这个项目的wiki里你能学到很多AOSP官方没有告诉你的东西. 比如如何支持Nexus以外的设备.
    • DIA
      • 这是一个Linux下画UML的工具, 能够帮你梳理看过的代码.
    • XDA
      • xda-developers.com/
      • 这里有最新资讯和最有趣的论坛.
    • 想到了再补充.

作者:知乎用户
链接:https://www.zhihu.com/question/19759722/answer/17019083
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在Android系统源码上摸索4年,说说我的看法:
显然Eclipse不是阅读Android源码的好工具,不流畅,搜索低效,继承性关系/调用关系都无法有效查看。推荐Source Insight,在这个工具帮助下,你才可以驾驭巨大数量的Android 源码,你可以从容在Java,C++,C代码间遨游,你可以很快找到你需要的继承和调用关系。
顺便,现在东家是Linux+Samba+Windows的工作模式,Linux+Samba用于代码的同步/编译/管理,Windows做代码编辑。
你需要先理解下这个图:Application层就是一个个应用程序,很好理解。Framework提供一个java的运行环境以及对功能实现的封装,简单点说,你家装修总要留很多水电之类的接口吧!Runtime/ART是一个java虚拟机,因为Android上层不是java吗,需要再编译一次成为低级一点的语言识别。从Libraries那些名字也可以看出来,这里有很多高端大气库,它是功能实现区,多媒体编解码,浏览器渲染啊,数据库实现啦,很多很多。Kernel部分负责陪硬件大哥玩,你那些功能实现的区域最终都要调硬件吧,Kernel这家伙已经和硬件很熟了,你就直接通过它来和冷冰冰硬件大哥打交道吧!
<img src="https://pic1.zhimg.com/ffa1356b43c947758c41c8eac0ea4898_b.jpg" data-rawwidth="640" data-rawheight="459" class="origin_image zh-lightbox-thumb" width="640" data-original="https://pic1.zhimg.com/ffa1356b43c947758c41c8eac0ea4898_r.jpg">

好了,上面这些内容很好理解对不对,现在的问题是:当你拿到一份几G的源码,该从哪里开始呢?经过上面的前言的洗礼,你应该能够很好理解下面这部分了
-------------------------------------------------------------------------------------------------------------------
1.宏观上看,Android源码分为功能实现上的纵向,和功能拓展上的横向。在阅读源码时需要把握好着两个思路。
譬如你需要研究音频系统的实现原理,纵向:你需要从一个音乐的开始播放追踪,一路下来,你发现解码库的调用,共享内存的创建和使用,路由的切换,音频输入设备的开启,音频流的开始。
譬如你要看音频系统包括哪些内容,横向:通过Framework的接口,你会发现,音频系统主要包括:放音,录音,路由切换,音效处理等。

2.Android的功能模块绝大部分是C/S架构
你心里一定需要有这个层级关系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城,上面的libraries是不是很亲切的样子?看完它长成啥样后,然后你才能发现HAL和Kernel一层层地剥离。
很多研究源码的同学兜兜转转,始终在JAVA层上,这是不科学的,要知道libraries才是它的精髓啊。
3.Android的底层是Linux Kernel
在理解1,2后,还是需要对Kernel部分有个简单的理解,起码你要熟悉kernel的基础协议吧!你要能看懂电路图吧!你要熟悉设备的开启和关闭吧!你要熟悉调寄存器了吧!这方面的书太多了,我建议根据实例去阅读,它并不复杂,不需要一本本厚书来铺垫。
在libraries和kernel间,可能还会有个HAL的东东,其实它是对kernel层的封装,方便各个硬件的接口统一。这样,如果我换个硬件,不用跑了长得很复杂的libraries里面改了,kernel调试好了后,改改HAL就好了。
--------------------------------------------------------------------------------------------------------------------

好了,你现在是不是跃跃欲试准备去找个突破口准备进攻了,但是好像每个宝库的入口都挺难找了
我大概在三个月前阅读完Android UI系统的源码,这是Android最复杂的部分,我要简单说下过程。

我需要先找宝库入口,我要研究UI,首先要找什么和UI有亲戚关系吧!
View大神跳出来了,沿着它往下找找看,发现它在贴图在画各种形状,但是它在哪里画呢,马良也要纸吧?
很明显它就是某个宝藏,但是世人只是向我们描述了它有多美,却无人知在哪里?我们需要找一张地图罗。
开发Android的同学逃不掉Activity吧!它有个setcontentview的方法,从这个名字看好像它是把view和activity结合的地方。赶紧看它的实现和被调用。,然后我们就发现了Window,ViewRoot和WindowManager的身影,沿着WM和WMS我们就惊喜会发现了Surface,以及draw的函数,它居然在一个DeCorView上画东西哈。借助Source Insight, UI Java层的横向静态图呼之欲出了。

完成这个静态UML,我觉得我可以开始功能实现上追踪了,这部分主要是C++的代码(这也是我坚定劝阻的放弃Eclipse的原因),我沿着draw函数,看到了各个层级的关系,SurfaceSession的控制和事务处理,SharedBuffer读写控制,彪悍的SurfaceFlinger主宰一切,OpenGL ES的神笔马良。FrameBuffer和FrameBufferDevice的图像输出,LCD设备打开后,开始接收FBD发过来的一帧帧图像,神奇吧。

好吧,就这样,再往底层我爱莫能助了!


作者:小湿妹
链接:https://www.zhihu.com/question/19759722/answer/29156462
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

零、准备工作:
开发环境:建议在ubuntu(32/64位均可)下进行开发。
开发板:推荐cubieboardpcduino
(资料开放,连相应的android源码以及硬件配置文件都有提供。
不推荐所谓的开源硬件Raspberry-Pi,毕竟Raspberry-Pi并不是真正的开源硬件。)
其他:串口线

强烈不推荐windows环境下搞Android底层开发!!!
一个及格的Android工程师,就应该熟练在Linux环境下进行开发工作。
如果你不会“优雅”地使用Linux,不得不在windows下编辑代码,
恳请你记得设置编码utf-8!!!!!!!!!!
(怨念:每次编译固件看见乱码警告就各种强迫症啊摔ヽ(≧Д≦)ノ!尽管大多情况下不影响编译结果。)

一、编译器的选择:
阅读/编译代码:eclipse (Java)、vim+ctags+cscope(C/C++)
搜索代码:shell
例如命令1:grep "Telephoney" -rn ./*
例如命令2:find -name Telephoney*
等等等

不会用eclipse,请不要说他不好用!
eclipse是阅读framework代码以及系统应用的居家旅行杀人必备神器
正确使用eclipse阅读Android源码
1.复制eclipse的classpath到Android源码根目录
cp ~/android/development/ide/eclipse/.classpath ~/android
2.修改eclipse缓存设置
把eclipse.ini文件的3个值改为下面的值(不要盲目参考,需要根据自己机器情况来定):
-Xms128m
-Xmx768m
-XX:MaxPermSize=512m
(mac路径:eclipse/Eclipse.app/Contents/MacOS/eclipse.ini)
3.导入eclipse代码风格
把android-formatting.xml和android.importorder导入Eclipse
~/android/development/ide/eclipse/android-formatting.xml
~/android/development/ide/eclipse/android.importorder
4.导入Android源码
新建Java Project(不是Android project),选择从已存在的工程导入,定位到Android源码的目录进行导入即可。
PS:eclipse只是阅读/编辑代码的工具,编译源码还是需要通过make命令在终端编译的。

二、知识储备:
编程语言什么的没什么好说。
着重提一个:设计模式
由于Android源代码用到各种各样的设计模式,如果不会设计模式,将会大大降低你的阅读理解速度。

三、网站资料:
source.android.com/devi
android官方文档,很详细描述各模块的设计思路。
理解这个链接的内容,看个十遍八遍,一边看一边分析代码。
PS:由于比较笨(-’๏_๏’-),所以我当年是一边看一边翻译出来,大家也可以参考我这种方法,容易加深理解、印象

四、书刊资料:
邓凡平大神的《深入理解Android》系列
《深入理解Android:卷I/卷II》 [Kindle电子书] ~ 邓凡平
链接:amazon.cn/dp/B00K6Y5OEM
作者Blog:blog.csdn.net/Innost/

五、学习方法:
要一下子把所有模仿都理解透,是件比较困难的事情。
可以分模块学习:
Telephoney
Audio & media
webkit & Browser
Wi-Fi & wpa supplicant
Dalvik
Display & Surface flinger
Camera
等等等

先吃饭,看心情再补(*´・v・)。。。

工具:Android Studio
查看源码方法: http://androidperformance.com/2015/01/16/view-android-source-code-with-androidstudio.html
看那一部分:
Framework/base
Package/apps
art
external


操作系统:推荐Linux,可以随时编译Android源码
测试机:推荐Nexus系列手机,编译源码后push进去可以随时验证。

原创粉丝点击