拿到一份开源项目,快速定位感兴趣的功能代码

现在越来越多的开源项目了,令人收藏不暇,有时只是觉得对方的某个 feature 特别喜欢,但很多人可能打开了其代码找了半天找不到关键所在。其实,如果运用了 Android Studio 带给我们的一些查找功能,任何一份新的开源代码摆在我们眼前,我们都可以快速定位到感兴趣的功能代码。

所以,今天我来分享一下这个经验,造福人间2333,以两个例子做说明吧:

一、快速定位 BlackLight 的「收藏微博」功能代码

Snip20150425_1说明:BlackLight 是一个 Material Design 的微博客户,更多介绍可以看这个帖子:一个 Material Design 的微博客户 。我是前天拿到它的源代码的,我想把它微博信息页面中的收藏微博功能提取出来,做一个快捷收藏的功能……它的代码量不小,你不知道作者给这个页面取名叫什么 Activity,你也不知道你就算找到这个 Activity,再要定位到这个具体地方要多久(这个例子是针对 option menu,原本如果手动定位,也是比较简单的,但大部分没那么容易)。

关键点1:对于整个项目源代码进行「find in path」查找这个功能的字符串「收藏微博」四个字,如下:

Snip20150425_2

出来的结果是,找到了,并且找到的位置是在 strings.xml 文件中:

Snip20150425_4

关键点2:我们可以双击跳转到这个 strings.xml 文件中的「收藏微博」位置,然后把光标放在它的 name 上,右键鼠标(或者快捷键),出现「find usages」,结果就会显示它被使用的地方:

Snip20150425_6

哦。。。才知道这个名为「微博信息」页面,作者给它命名的是「SingleActivity」。。。如果不借助这两三下快速查找,你能想到?。。。然后,我们果断跳过去,跳过去到达 SingleActivity 之后就很直接了,这个功能明显是在 onOptionsItemSelected 这个方法内,于是我们很快可以找到:

Snip20150425_7

就是它了!

总结:关键点其实很简单,入手的时候,先全局搜索(find in path)你要的功能它的名称,一般是定位到 strings.xml,再对这条 Item 的 name 进行查找它的使用(find usages),定位到它被使用的地方,基本就很接近目标了。

如果大家还不明确,请看第二个例子……

一、快速定位 EhViewer 的 ripple 加载新页面功能:

说明:额,这个 EhViewer 嘛,是一个(hentai)绅士阅读器,我也是昨天晚上朋友说它 MD 做得不错才去看看它的代码的。发现它有一个「点击查看更多」的地方,点击了之后,会以 ripple 的动画效果展开一个新页面显示内容,很棒。于是想一探究竟……

Snip20150425_8

入手:仍然是对全局进行搜索,find in path <- “点击查看更多”,和上面一样,很快定位到 strings.xml 文件中的这一行:

<string name="click_more">点击查看更多</string>

右键点击这个 click_more,选择 find usages,很快又精准定位到了:

Snip20150425_9

看,定位到这个 Activity 是如此简单粗暴~

过去看一下,发现目标并不能直接关联这个动画功能的代码,只是显示这样:

mCommentMoreText.setText(R.string.click_more);

而且你会发现你对于这个 mCommentMoreText 找来找去(使用页面内的搜索,command + f)都没发现它的 setOnClickListener 是在哪,这时也不能放弃,因为我们知道,目标肯定很近了……想了一下,猜想,作者可能是对于这个 mCommentMoreText 的父容器布局进行绑定监听器,于是……

关键点:找到 findViewById 位置,跟踪跳转到 xml 布局文件

……于是我就页面内搜索(command + f)这个 mCommentMoreText,马上定位到它的findViewById:

mCommentMoreText = (TextView) findViewById(R.id.comment_more_text);

按住 command 点击这个 comment_more_text,可以跳到它的 xml 布局文件,发现它的父布局是一个 LinearLayout,并且 id 是 detail_comment,果断对这个 id 进行 find usages,会跳转到它的 Java 代码位置:

mDetailComment = (LinearLayout) findViewById(R.id.detail_comment);

再页面内搜索 mDetailComment,果然得到它绑定了 mDetailComment.setOnTouchListener(this); 那么接下来就非常直接了,顺藤摸瓜,我们马上去 onTouch 看看(虽然是 mDetailMore,可能是另一层父控件),目标 get!:

Snip20150425_10

总结:这一回合,我们关键还是在 find in path / find usages 的基础之上,更多的 command + F 页面内查找,一般基本定位后都难逃我们的掌心,方法其实都很简单,一回生二回熟,以后任何开源项目代码的任何功能,都能闭着眼睛,快速定位啦,哈哈哈。。。。

  1. 请问你一般收藏的开源项目是在哪找的,拜托你告诉我,是Github么…还有其他的么

  2. 能有靠谱的猜想(以往项目的经验,站在作者的角度想,我应该会这么实现)很关键啊,不然还是找不到不是?!

  3. Pingback: Payday loans

  4. Pingback: 源码阅读系列:源码阅读方法-SRE空间