framework源码原码_android framework源码

hacker|
220

文章目录:

如何阅读android framework源码

由于工作需要大量修改framework代码,在AOSP(AndroidOpenSourceProject)源码上花费了不少功夫,Application端和Services端都看和改了不少.如果只是想看看一些常用类的实现,在Android包管理器里把源码下载下来,随便一个IDE配好SourceCode的path看就行.但如果想深入的了解Android系统,那么可以看下我的一些简单的总结.知识JavaJava是AOSP的主要语言之一.没得说,必需熟练掌握.熟练的AndroidApp开发LinuxAndroid基于Linux的,并且AOSP的推荐编译环境是Ubuntu12.04.所以熟练的使用并了解Linux这个系统是必不可少的.如果你想了解偏底层的代码,那么必需了解基本的Linux环境下的程序开发.如果再深入到驱动层,那么Kernel相关的知识也要具备.MakeAOSP使用Make系统进行编译.了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.GitAOSP使用git+repo进行源码管理.这应该是程序员必备技能吧.C++Android系统的一些性能敏感模块及第三方库是用C++实现的,比如:Input系统,Chromium项目(WebView的底层实现).硬件流畅的国际网络AOSP代码下载需要你拥有一个流畅的国际网络.如果在下载代码这一步就失去耐心的话,那你肯定没有耐心去看那乱糟糟的AOSP代码.另外,好程序员应该都会需要一个流畅的Google.一台运行Ubuntu12.04的PC.如果只是阅读源码而不做太多修改的话,其实不需要太高的配置.一台Nexus设备AOSP项目默认只支持Nexus系列设备.没有也没关系,你依然可以读代码.但如果你想在大牛之路走的更远,还是改改代码,然后刷机调试看看吧.高品质USB线要刷机时线坏了,没有更窝心的事儿了.软件Ubuntu12.04官方推荐,没得选.OracleJava1.6注意不要用OpenJDK.这是个坑,官方文档虽然有写,但还是单独提一下.安装:sudoapt-getinstallpython-software-propertiessudoadd-apt-repositoryppa:webupd8team/javasudoapt-getupdatesudoapt-getinstalloracle-java6-installersudoapt-getinstalloracle-java6-set-defaultEclipse估计会有不少人吐槽,为什么要用这个老古董.其实原因很简单,合适.刚开始搞AOSP时,为了找到效率最优的工具,我尝试过Eclipse,IntelliJIDEA,Vim+Ctags,SublimeText+Ctags.最终结果还是Eclipse.主要优点有:有语法分析(快速准确的类,方法跳转).支持C++(IntelliJ的C++支持做的太慢了).嵌入了DDMS,ViewHierarchy等调试工具.为了提高效率,花5分钟背下常用快捷键非常非常值得.调整好你的classpath,不要导入无用的代码.因为AOSP项目代码实在是太多了.当你还不需要看C++代码时,不要为项目添加C++支持,建索引过程会让你崩溃.IntellijIDEA开发App必备.当你要调试系统的某个功能是,常常需要迅速写出一个调试用App,这个时候老旧的Eclipse就不好用了.ItellijIDEA的xml自动补全非常给力.巨人的肩膀这个一定要先读.项目介绍,代码下载,环境搭建,刷机方法,Eclipse配置都在这里.这是一切的基础.这个其实是给App开发者看的.但是里面也有不少关于系统机制的介绍,值得细读.此老罗非彼老罗.罗升阳老师的博客非常有营养,基本可以作为指引你开始阅读AOSP源码的教程.你可以按照博客的时间顺序一篇篇挑需要的看.但这个系列的博客有些问题:早期的博客是基于旧版本的Android;大量的代码流程追踪.读文章时你一定要清楚你在看的东西在整个系统处于什么样的位置.邓凡平老师也是为Android大牛,博客同样很有营养.但是不像罗升阳老师的那么系统.的是一些技术点的深入探讨.Android官方Issue列表.我在开发过程中发现过一些奇怪的bug,最后发现这里基本都有记录.当然你可以提一些新的,有没有人改就是另外一回事了.一定要能流畅的使用这个工具.大量的相关知识是没有人系统的总结的,你需要自己搞定.其它代码组织AOSP的编译单元不是和git项目一一对应的,而是和Android.mk文件一一对应的.善用mmm命令进行模块编译将节省你大量的时间.Binder这是Android最基础的进程间通讯.在Application和Systemservices之间大量使用.你不仅要知道AIDL如何使用,也要知道如何手写Binder接口.这对你理解Android的Application和Systemservices如何交互有非常重要的作用.Binder如何实现的倒不必着急看.HAL除非你对硬件特别感兴趣或者想去方案公司上班,否则别花太多时间在这一层.CyanogenMod这是一个基于AOSP的第三方Rom.从这个项目的wiki里你能学到很多AOSP官方没有告诉你的东西.比如如何支持Nexus以外的设备.DIA这是一个Linux下画UML的工具,能够帮你梳理看过的代码.XDA这里有最新资讯和最有趣的论坛.想到了再补充.

android 怎么看framework层源码

查看函数的调用树,变量的数据流。第二种是借助 debug 工具或者 log 日志在代码动态执行的过程中查看程序的执行情况。

在 android studio 中使用 alt + f7,可以快速查看某个符号被使用的位置,包括函数名、字段名、变量名等等,还可以快速查看到该函数的调用树,变量的数据流

如果代码执行逻辑我们自己可控制,在我们可以控制的地方添加 log 打印,可以很快检测该分支逻辑执行情况;如果代码不是我们自己可以控制的,就只能使用 debug 调试查看代码分支的执行起情况了

在 debug 的时候使用跳转到函数的内部,可以追踪到 framework 层源码的执行逻辑

在 debug 的时候可以看到函数的调用栈,能够一下子就明白在这种场景下,该函数在

怎么调试安卓framework的源码

一、修改Android Studio(以下简称AS)的内存配置

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。

二、配置AS的JDK、SDK

在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件

并将其作为要使用的SDK的Java SDK。如下图

三、生成导入AS所需配置文件(*.ipr)

①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)

②检查out/host/linux-x86/framework/目录下是否有idegen.jar

如果idegen.jar不存在,执行:

mmm development/tools/idegen/

在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。

我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。

③执行

development/tools/idegen/idegen.sh

等待出现类似下面的结果:

Read excludes: 5ms

Traversed tree: 44078ms

这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件

Tips:

AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:

excludeFolder url="" /

excludeFolder url="" /

excludeFolder url="" /

删除掉所有不需要的module-library项 PS:感谢 @dezng 的建议

这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.

④在AS中打开源码根目录下新生成的android.ipr

四、解决源码中跳转错误问题

①为当前工程设置正确的SDK和JDK

②设置'Modules'的依赖

先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.

如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)

点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:

其它版本的代码在添加frameworks时可能会显示成:

没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.

如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.

五、DEBUG源码

我们可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便我们调试代码.

可以按照上图中'1'和'2'来添加Android Framework支持.

在代码中加断点,然后选择'Run'-'Attach debugger to Android process'或者直接点击下图所示的图标

在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.

六、其它

代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将我们的工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.

我们只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。

也可以考虑使用build.gradle来解决该问题

2条大神的评论

  • avatar
    访客 2022-07-01 上午 05:24:55

    好用了.ItellijIDEA的xml自动补全非常给力.巨人的肩膀这个一定要先读.项目介绍,代码下载,环境搭建,刷机方法,Eclipse配置都在这里.这是一切的基础.这个其实是给App开发者看的.但是里面也有不少关于系统机制的介绍,值得细读.此老罗非彼老罗

  • avatar
    访客 2022-07-01 下午 03:12:29

    Make系统进行编译.了解基本的Makefile编写会让你更清晰了解AOSP这个庞大的项目是如何构建起来的.GitAOSP使用git+repo进行源码管理.这应该是程序员必备技能吧.C++Android系统的一些性能敏感模块及第三方库是用C++

发表评论