如何快速阅读并分析Android源码
很多时候为了解决一个问题必须先理解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源码相关推荐
- 读万卷书不如行万里路,行万里路不如阅人无数,阅人无数不如名师指路,名师指路不如自己去悟,自己去悟不如分析android源码深处...
首先,作为一个已经学习android 一年多的人来说,如何选择android书籍,如何学习android 的app的开发,心中或多或少都有一些眉目,看了这本书的试读章节,真心感觉挺不错的.值得推荐,自 ...
- 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )
文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...
- 红橙Darren视频笔记 从AIDL Demo分析Android源码走向
一 AIDL demo 1.1 服务端搭建 新建AIDL文件 // IUserCalc.aidl package com.example.aidlserver;// Declare any non-d ...
- android stk 源代码分析,Android源码分析--STK
文件:StkAppService.java 函数:onCreate() STK的APP程序启动后执行的第一个函数,会调用方法: com.android.internal.telephony.gsm.s ...
- adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- Android源码分析工具及方法
转载自:http://bbs.pediy.com/showthread.php?t=183278 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01 ...
- Android 源码分析工具
2019独角兽企业重金招聘Python工程师标准>>> 标 题: [原创]Android源码分析工具及方法 作 者: MindMac 时 间: 2014-01-02,09:32:35 ...
- 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译
本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...
最新文章
- 【OpenCV 4开发详解】图像金字塔
- mysql 区分大小写(大小写敏感)配置
- java打印sql表_java程序获得SqlServer数据表的表结构
- 【Android开发】消息处理类(Handler)与消息类(Message)介绍
- 记一次短信验证码的“梅开五度”
- 优先队列详解(转载)
- Android之如何实现通讯录的搜索并且让匹配到的数据变颜色
- 今天的种到地下的cadfans2012
- kinect 手势识别的原理?
- Android开发技巧——PagerAdapter再简单的包
- laravel8-使用jwt
- 阅读不懂,图书之过——《大话设计模式》创作历程
- pythonbmi代码_用python写一个BMI体制指数测试
- Solaris加载ISO虚拟光驱文件
- 一元夺宝--夺宝模块 开发笔记(一)
- Android手机添加BusyBox超级终端打造linux工具箱
- 微服务与SOA以及服务间通讯协议
- 2-1. Python 数据类型、运算
- CSI Tool的安装
- 供应链结构、信用与融资
热门文章
- numpy之 警告VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
- IID 与 Non-IID
- 男人婚前婚后的两张脸
- 收集中的HTML代码
- SpringBoot项目中集成第三方登录功能
- 闪电邮新建html模板,非常靠谱之网易智能版闪电邮6大新功能评测
- [转载]近半年的读书总结
- 了解这些后,再去决定要不要买mac
- Word控件Spire.Doc 【书签】教程(3): 使用 HTML 代码编辑/替换 Word 书签的内容
- 从此甩掉光驱nbsp;U盘安装系统最详攻略