爱测未来移动-Android源码阅读利器之openGrok

如何快速查阅、定位android源码,这里推荐工具openGrok。


阅读Android源码工具很多,有sourceinsight, vim+ctags+taglist+cscrop,android studio 等,都各有优缺点。这里选择openGrok的原因如下:

  • 基于web

在服务器上运行,在本地用浏览器直接查看。

  • 简单易上手

相比其他工具,openGrok更加简单,不需要记快捷键:

点击函数名跳转到定义,点击函数定义跳转到搜索。点击“Navigate”显示类定义的函数和变量。

  • 支持中文显示

    能显示注释里的中文,不会是乱码

  • 可以配合git使用

    点击“History”可以显示文件提交的commit log,点击“Annotate”可以显示文件每行的commit id。


如果只是想学习Android官方原生源码的话,可以直接访问:http://www.androidxref.com/


现在做的是车载Android系统的定制项目,在android原生代码上做了许多修改,所以我们现在需要自己搭建一套。下面就介绍一下安装和配置:

 

安装与配置

环境:Ubuntu, java (Java怎么安装网上很多,这里不多说了)

 

  1.     安装Tomcat


注意tomcat的版本对java版本是有要求的。我这里用的是apache-tomcat-7.0.73,对应的java1.7,如果系统上面有不止一个jdk,可能需要指定合适的jdk,这个后面会详细说。


1)在apache官网上面下载linux的tomcat


2) 解压

爱测未来移动-Android源码阅读利器之openGrok

如上图,我这里新建了一个openGrok文件夹,把tomcat的压缩包放在这里,解压。


3) 启动tomcat

[email protected]:~/openGrok$ cd apache-tomcat-7.0.73/bin

[email protected]:~/openGrok/apache-tomcat-7.0.73/bin$./startup.sh

爱测未来移动-Android源码阅读利器之openGrok

如果没有报错就说明安装成功了


4) 打开浏览器试一下

默认端口号是8080

如果是本地:http://localhost:8080

如果不是本地:http://[server_ip]:8080

举个栗子:我在服务器上配置的tomcat,到本地就应该访问http://192.168.XX.XX:8080

如果出现了欢迎页说明配置成功


5) 如果没有出现欢迎页怎么办呢?

查看一下tomcat的log,位置在apache-tomcat-7.0.73/logs/catalina.out,然后具体问题具体分析。


注意,如果是在服务器配置的,服务器的时间可能和北京时间有差异,所以log的时间可能对不上你在本地操作的时间。


如果是端口号被占用导致的,可以修改端口号:修改apache-tomcat-7.0.73/conf/server.xml文件中的<Connector port="8080" ,替换成8000或者其他端口号。


2.    安装Ctags


openGrok的搜索也是基于Ctags的,所以要先安装ctags

$ sudo apt-get install ctags

如果不行,用下面的命令

$ sudo apt-get install exuberant-ctags


3.    安装openGrok


1)   下载

我下载的是opengrok-0.12.1

http://java.NET/projects/opengrok/downloads/download/opengrok-0.12.1.tar.gz


2) 解压


3) 部署

$ cd opengrok-0.12.1/bin

$ ./OpenGrok deploy

会自动把source.war复制到apache-tomcat-7.0.73/webapp/目录下,如果没有的话,手动复制一下也可以。

然后会自动生成apache-tomcat-7.0.73/webapp/source/目录,如下图

爱测未来移动-Android源码阅读利器之openGrok


4) 打开浏览器试一下

如果是本地:http://localhost:8080/source

如果不是本地:http://[server_ip]:8080/source

显示了openGrok的搜索页表示成功。

如果发现访问不了,先看一下tomcat的log,然后具体问题具体解决。


我这里遇到了404错误

这是因为上面提到的服务器安装了两个java导致的,当然404的错误不都是这个原因导致的,要看具体的错误log。

我的log显示

 INFO: JSR 356 WebSocket (Java WebSocket 1.1) support is not available when running on Java 6. To suppress this message, run Tomcat on Java 7, remove the WebSocket JARs from $CATALINA_HOME_/shdb or add the WebSocket JARs to the tomcat.util.scan.DefaultJarScanner.jarsToSkip property in $CATALINA_BASE/conf/catalina.properties. Note that the deprecated Tomcat 7 WebSocket API will be available 


说明tomcat找到了java1.6,但是需要java1.7

解决方法:在 apache-tomcat-7.0.37/bin下修改 catinlna.sh脚本,添加 JAVA_HOME,如下图

爱测未来移动-Android源码阅读利器之openGrok


5) 添加代码索引

$ cd opengrok-0.12.1/bin

$ sudo./OpenGrok index [your source code dir]

Android所有源码生成索引时间较长,大概1个多小时。

索引默认的目录是/var/opengrok/data/


 

索引完成后,就可以用openGrok搜索了,速度是杠杠的!


6) 配置openGrok

OpenGrok github的地址: https://github.com/OpenGrok

上面有详细的配置说明。


7) 更新索引

删除之前的索引: rm -rf /var/opengrok/data

生成新的索引: ~/openGrok/opengrok-0.12.1/bin$ ./OpenGrokindex ~/workspace/repo_code/


如果不删除/var/opengrok/data,可能会出现如下错误:

[email protected]:~/openGrok/opengrok-0.12.1/bin$ ./OpenGrok index ~/workspace/repo_code/

Loading the default instance configuration ...

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/opensolaris/opengrok/index/Indexer : Unsupported major.minor version 51.0

        at java.lang.ClassLoader.defineClass1(Native Method)

        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)

        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)

        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)

        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Could not find the main class: org.opensolaris.opengrok.index.Indexer. Program will exit.


4.    设置Ubuntu定时任务——定时sync代码,定时更新索引


这个是针对开发会不断提交代码,所以我们需要经常更新代码和索引。

$ crontab –e

上面的注释是使用说明

我写的是:每周一,周四 23:59执行syncAndReindex.sh脚本


爱测未来移动-Android源码阅读利器之openGrok


这个脚本执行的是更新代码,删除旧的索引和生成新索引:


爱测未来移动-Android源码阅读利器之openGrok

 


 

如果想深入了解openGrok的话,可以参考

https://www.zhihu.com/search?type=content&q=openGrok


公众号:itest_forever

爱测未来移动-Android源码阅读利器之openGrok

CSDN:http://blog.csdn.NET/itest_2016

QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)