很多时候为了解决一个问题必须先理解Android系统的运行原理,这时候就得阅读应用层框架的源码。学会阅读系统源码或者他人的代码,这是研发必备的技能之一,只有了解别人写的东西才能在他之上更好的行事,同时也能去学习和借鉴他人优秀的代码思想。
那么,如何阅读并分析Android源码呢?
这里我只讲一些初级的、基础的方法,很快就可以上手,不需要下载和编译系统源码。
我们下载Android SDK的时候一般都会下载相应版本的源码(sdk/sources目录下),在AS(Android Studio)上追踪系统代码时会自动打开源码文件,如果没有源码则会在右上角提示下载:
系统的源码一般多且复杂,虽然有不少注释,但如果纯靠阅读去理解会相当吃力,很难把握整体流程。我们需要结合实际使用场景,通过debug去分析代码的运行逻辑。那么SDK的版本有那么多,应该查看哪个版本的源码呢?这个根据需要,如果要查看最新7.0的源码就查看相应的。如果没有指定的版本,一般你打开的SDK自带的虚拟机的版本是多少就查看相应版本的代码。我们可以通过在项目build.gradle文件里面配置compileSdkVersion为指定的版本,这样在AS上追踪代码时跳转的即是对应版本的源码文件。(这里我强调的是自带的虚拟机,而不是真机或其他第三方的虚拟机。因为自带的虚拟机的rom可以保证代码是没有修改过的,跟官方源码的行数可以对得上。)
例如,一般情况下,我使用版本22的虚拟机:
接着把项目的compileSdkVersion配置为22:
android {
compileSdkVersion 22
buildToolsVersion "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模式。
————————————————
原文链接:https://blog.csdn.net/u012964944/article/details/80005268
喜欢 就关注吧,欢迎投稿!
本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/如何快速阅读并分析android源码/