如何快速查阅、定位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怎么安装网上很多,这里不多说了)
安装Tomcat
注意tomcat的版本对java版本是有要求的。我这里用的是apache-tomcat-7.0.73,对应的java1.7,如果系统上面有不止一个jdk,可能需要指定合适的jdk,这个后面会详细说。
1)在apache官网上面下载linux的tomcat
2) 解压
如上图,我这里新建了一个openGrok文件夹,把tomcat的压缩包放在这里,解压。
3) 启动tomcat
changhao@platform:~/openGrok$ cd apache-tomcat-7.0.73/bin
changhao@platform:~/openGrok/apache-tomcat-7.0.73/bin$./startup.sh
如果没有报错就说明安装成功了
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文件中的 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/目录,如下图 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,如下图 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,可能会出现如下错误: changhao@platform:~/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脚本 这个脚本执行的是更新代码,删除旧的索引和生成新索引: 如果想深入了解openGrok的话,可以参考 https://www.zhihu.com/search?type=content&q=openGrok 公众号:itest_forever CSDN:http://blog.csdn.NET/itest_2016 QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)