很多时候为了解决一个问题必须先理解Android系统的运行原理,这时候就得阅读应用层框架的源码。学会阅读系统源码或者他人的代码,这是研发必备的技能之一,只有了解别人写的东西才能在他之上更好的行事,同时也能去学习和借鉴他人优秀的代码思想。

那么,如何阅读并分析Android源码呢?

这里我只讲一些初级的、基础的方法,很快就可以上手,不需要下载和编译系统源码。

我们下载Android SDK的时候一般都会下载相应版本的源码(sdk/sources目录下),在AS(Android Studio)上追踪系统代码时会自动打开源码文件,如果没有源码则会在右上角提示下载:

系统的源码一般多且复杂,虽然有不少注释,但如果纯靠阅读去理解会相当吃力,很难把握整体流程。我们需要结合实际使用场景,通过debug去分析代码的运行逻辑。那么SDK的版本有那么多,应该查看哪个版本的源码呢?这个根据需要,如果要查看最新7.0的源码就查看相应的。如果没有指定的版本,一般你打开的SDK自带的虚拟机的版本是多少就查看相应版本的代码。我们可以通过在项目build.gradle文件里面配置compileSdkVersion为指定的版本,这样在AS上追踪代码时跳转的即是对应版本的源码文件。(这里我强调的是自带的虚拟机,而不是真机或其他第三方的虚拟机。因为自带的虚拟机的rom可以保证代码是没有修改过的,跟官方源码的行数可以对得上。)

例如,一般情况下,我使用版本22的虚拟机:

接着把项目的compileSdkVersion配置为22:

android {compileSdkVersion 22buildToolsVersion "22.0.0"...
}

然后在AS上追踪系统代码,或者通过双击shift键,输入需要查找的系统类:

我们可以看到这时候的源码版本都是android-22。

接下来我们就要根据使用场景,寻找一个入口的地方,打一个断点,同时在其他觉得可疑的关键地方也打入断点,进入debug模式,这样逻辑就会在断点的地方停止,这时候就可以查看代码的运行逻辑,借助AS强大的debug功能分析代码。debug一定要有耐心,而且要多尝试设置可疑断点,让代码在关键地方停止。多运用几次就可以快速阅读和分析系统源码,明白其中的代码逻辑。

这里给个建议,一开始只需要把握某一个功能的整体代码逻辑,设置几个关键断点,通过断点阅读代码,不要深入细节无法自拔。等理解了整体逻辑之后,再考虑从细节地方入手,一句句代码debug下去。

最后,我们通过一个实际场景运用上面的方法去分析"View的OnClickListener.onClick()方法是怎样被触发的"。

首先新建一个项目,build.gradle里的配置如下:

android {compileSdkVersion 22...
}

创建一个页面,里面存在一个按钮,设置了OnClickListener,启动自带的api版本为22的虚拟机,运行项目,效果如下:

那么接下来debug从哪里入手呢?我们并不知道OnClickListener在哪里被回调,因此并不能预先在系统代码里打断点。这里我们可以观察调用view.setOnClickListener()的代码,然后查看OnClickListener对象保存在哪,什么时候调用,然后在关键地方打入断点。但其实还有更简单的方法,我们采用逆向思维,直接在OnClikcListener.onClick()方法里面打入断点:

进入debug模式:

点击按钮,然后代码会执行到断点的地方,这个时候我们查看左下角调用栈:

可以看到onClick方法是被View.performClick()方法调用,继续下查看调用栈发现performClick方法又是在PerformClick对象中执行:

PerformClick对象实现了Runnable,run()方法是在主线程消息队列执行的,所以接下来我们需要在View的源码里追踪代码,借助AS强大的功能查看PerformClick对象哪里被创建和被调用:

从上面可以看出关键地方,PerformClick在View.onTouchEvent()方法被调用。想必接下来要分析"View的OnClickListener.onClick()方法是怎样被触发的"这个问题就知道如何下手了,比如我们可以在View.onTouchEvent()打入断点,一步步代码查看具体的代码逻辑:

整个的过程大概就这样,当然不同问题要灵活处理,重要的是多实践多操作,就会得出一套自己解决问题的方法。

不要怕啰嗦,最后再重复一下分析源码的步骤:

  • 1. 下载 Android 源码。如果没有下载,当点击查看源码的时候 AndroidStudio 的右上角会有提示,点击下载即可。
  • 2. 创建虚拟机,且虚拟机的 Android 版本和项目的 compileSdkVersion 保持一致。
  • 3. 在相应的代码出标记断点。
  • 4. 运行代码,进入debug模式。

如何快速阅读并分析Android源码相关推荐

  1. 读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路,名师指路不如自己去悟,自己去悟不如分析android源码深处...

    首先,作为一个已经学习android 一年多的人来说,如何选择android书籍,如何学习android 的app的开发,心中或多或少都有一些眉目,看了这本书的试读章节,真心感觉挺不错的.值得推荐,自 ...

  2. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  3. 红橙Darren视频笔记 从AIDL Demo分析Android源码走向

    一 AIDL demo 1.1 服务端搭建 新建AIDL文件 // IUserCalc.aidl package com.example.aidlserver;// Declare any non-d ...

  4. android stk 源代码分析,Android源码分析--STK

    文件:StkAppService.java 函数:onCreate() STK的APP程序启动后执行的第一个函数,会调用方法: com.android.internal.telephony.gsm.s ...

  5. adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级

    一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...

  6. Android源码分析工具及方法

    转载自:http://bbs.pediy.com/showthread.php?t=183278 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01 ...

  7. Android 源码分析工具

    2019独角兽企业重金招聘Python工程师标准>>> 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01-02,09:32:35 ...

  8. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  9. 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译

    本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...

最新文章

  1. 【OpenCV 4开发详解】图像金字塔
  2. mysql 区分大小写(大小写敏感)配置
  3. java打印sql表_java程序获得SqlServer数据表的表结构
  4. 【Android开发】消息处理类(Handler)与消息类(Message)介绍
  5. 记一次短信验证码的“梅开五度”
  6. 优先队列详解(转载)
  7. Android之如何实现通讯录的搜索并且让匹配到的数据变颜色
  8. 今天的种到地下的cadfans2012
  9. kinect 手势识别的原理?
  10. Android开发技巧——PagerAdapter再简单的包
  11. laravel8-使用jwt
  12. 阅读不懂,图书之过——《大话设计模式》创作历程
  13. pythonbmi代码_用python写一个BMI体制指数测试
  14. Solaris加载ISO虚拟光驱文件
  15. 一元夺宝--夺宝模块 开发笔记(一)
  16. Android手机添加BusyBox超级终端打造linux工具箱
  17. 微服务与SOA以及服务间通讯协议
  18. 2-1. Python 数据类型、运算
  19. CSI Tool的安装
  20. 供应链结构、信用与融资

热门文章

  1. numpy之 警告VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
  2. IID 与 Non-IID
  3. 男人婚前婚后的两张脸
  4. 收集中的HTML代码
  5. SpringBoot项目中集成第三方登录功能
  6. 闪电邮新建html模板,非常靠谱之网易智能版闪电邮6大新功能评测
  7. [转载]近半年的读书总结
  8. 了解这些后,再去决定要不要买mac
  9. Word控件Spire.Doc 【书签】教程(3): 使用 HTML 代码编辑/替换 Word 书签的内容
  10. 从此甩掉光驱nbsp;U盘安装系统最详攻略