搭建Opengrok--阅读Android源码

环境

Ubuntu 16.04 LTS
Tomcat 8.5.38
universal-ctags
opengrok-1.2.2
Android 9.0.0_r30 源码(源码下载可以参考:Android源码下载与编译)

安装JDK 8或以及版本

通过java -version查看当前版本,如果未安装,执行以下命令安装OpenJDK 8

sudo apt-get install openjdk-8-jdk

安装Tomcat8

Apache Tomcat是一款Web应用服务器,网页后端开发者会比较了解。Opengrok生成的Web应用,部署在tomcat上后,就可以通过浏览器来访问。

官网下载压缩包Download Tomcat8
将压缩包解压后移动到/opt/tomcat8.5下(路径自定义):

tar zxvf apache-tomcat-8.5.38.tar.gz
sudo mv apache-tomcat-8.5.38 /opt/tomcat8.5

注意:
如果对Ubuntu的包管理策略不熟悉的话,不要使用sudo apt-get install tomcat8来安装Tomcat,因为系统会把文件安装到多个目录下,造成的问题就是Tomcat找不到自己的文件,需要配置各种环境变量,如下我遇到的错误:

a. 这个问题的根因是CATALINA_BASE不是/usr/share/tomcat8,而是/var/lib/tomcat8,catalina.out在/var/lib/tomcat8/logs下,所以找不到。

blues@android:/usr/share/tomcat8/bin$ ./startup.sh
Using CATALINA_BASE: /usr/share/tomcat8
Using CATALINA_HOME: /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
touch: cannot touch ‘/usr/share/tomcat8/logs/catalina.out’: No such file or directory
./catalina.sh: 401: ./catalina.sh: cannot create /usr/share/tomcat8/logs/catalina.out: Directory nonexistent

解决方案是配置CATALINA_BASE:

export CATALINA_BASE=/var/lib/tomcat8

但是这样配置之后还是会有其它莫名其妙的问题,所以还是选择压缩包的安装方式比较好。

配置Tomcat
/opt/tomcat8.5/bin目录下新建setenv.sh文件,输入以下内容,保存退出即可。因为Tomcat在启动时会自动加载该文件,主要作用就是配置JVM 最大堆内存为8g,根据机器的实际内存进行调整(我的机器是16G)。如果不设置,在用户在检索Android源码时,很可能会报OutOfMemoryError

JAVA_OPTS="$JAVA_OPTS -d64 -server"
JAVA_OPTS="$JAVA_OPTS -Xmx8g"

开启Tomcat

扫描二维码关注公众号,回复: 5310722 查看本文章
blues@android:~$ /opt/tomcat8.5/bin/startup.sh 
Using CATALINA_BASE:   /opt/tomcat8.5
Using CATALINA_HOME:   /opt/tomcat8.5
Using CATALINA_TMPDIR: /opt/tomcat8.5/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/tomcat8.5/bin/bootstrap.jar:/opt/tomcat8.5/bin/tomcat-juli.jar
Tomcat started.

关闭Tomcat

blues@android:~$ /opt/tomcat8.5/bin/shutdown.sh 
Using CATALINA_BASE:   /opt/tomcat8.5
Using CATALINA_HOME:   /opt/tomcat8.5
Using CATALINA_TMPDIR: /opt/tomcat8.5/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/tomcat8.5/bin/bootstrap.jar:/opt/tomcat8.5/bin/tomcat-juli.jar

安装universal-ctags

不要再使用 Exuberant ctags,因为已经不再维护更新,对于新版本的Opengrok支持度不好,所以先卸载掉:

sudo apt-get remove --purge exuberant-ctags

下载universal-ctags源码
需要源码编译安装,执行以下命令下载源码:

git clone https://github.com/universal-ctags/ctags.git

下载完成后,进入ctags文件夹,依次执行以下命令,完成编译和安装:

./autogen.sh
./configure
make
sudo make install

这个过程中,如果出现有些包未安装的话,直接 sudo apt-get install 装一下就可以了,如下可能出现的情况:
+ type pkg-config
pkg-config: not found
+ exit 1

使用ctags -version查看版本信息:

blues@android:~/universal_tmp/ctags$ ctags --version
Universal Ctags 0.0.0(11ee721), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert

使用which ctags查看安装路径,因为后面建立索引时会用到:

blues@android:~/universal_tmp/ctags$ which ctags
/usr/local/bin/ctags

安装配置OpenGrok

下载路径:OpenGrok Releases,下载tar.gz压缩包。

因为Opengrok下会存放Android源码以及生成索引文件,至少需要预留150G的空间(如果索引out的话,至少需要250G),所以要先确认磁盘空间,选择一个大点的位置解压Opengrok,使用df -h确认磁盘空间分配:

blues@android:~/android/aosp$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  9.6M  1.6G   1% /run
/dev/sda6        46G  5.9G   38G  14% /
tmpfs           7.8G   17M  7.8G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda9       998G  123G  825G  13% /home
/dev/sda8       922M  137M  722M  16% /boot
tmpfs           1.6G   60K  1.6G   1% /run/user/1000

由于sda6只有46G,所以Opengrok不能像Tomcat一样解压到/opt下,只能选择998G的sda9,即/home目录。

我第一次就是因为选择解压到 /opt 下,结果出现IOException异常:
java.io.IOException: No space left on device

解压到用户家目录:

tar zxvf opengrok-1.2.2.tar.gz -C ~

-C:指定解压位置

配置

a. 为了便于管理,在opengrok目下新建srcdataetc三个目录,后面会用到:

cd ~/opengrok-1.2.2/
mkdir src data etc
# src:源代码目录
# data:存放opengrok索引文件目录
# etc:放置configuration.xml的目录,xml文件由opengrok生成,我们只需要配置路径。

b. 指定android源码位置
原本需要把源码放到src下,因为我的android源代码放在了~/android/aosp下,没必要把它整个移动到src下,所以在src下建了个9.0.0的软连接指向它:

cd src
ln -s ~/android/aosp 9.0.0

c. 复制source.war到tomcat中:(不用解压,会自动解压)

cp ~/opengrok-1.2.2/lib/source.war /opt/tomcat8.5/webapps/

d. 配置CONFIGURATION
在web.xml中修改configuration.xml的路径,

vi /opt/tomcat8.5/webapps/source/WEB-INF/web.xml
 12         <param-name>CONFIGURATION</param-name>
 13         <param-value>~/opengrok-1.2.2/etc/configuration.xml</param-value>

e. 重启Tomcat,在浏览器中输入 http://IP地址:8080/source,已经可以看到Opengrok的雏形,不过会有一个错误,是因为还未建立索引,所以configuration.xml还没生成,先不用关注:
在这里插入图片描述

建立索引

执行以下命令建立索引,注意这是一整条命令,\表示换行,后面不能有空格,每一行前面不能有tab字符,但可以有空格,否则命令会被拆分截断,也可以把该命令调整为一行,只不过不好看罢了。

java -Xmx8g \
    -jar ~/opengrok-1.2.2/lib/opengrok.jar \
    -c /usr/local/bin/ctags \
    -s ~/opengrok-1.2.2/src -d /opt/opengrok-1.2.2/data -H -P -S -G -v \
    -W ~/opengrok-1.2.2/etc/configuration.xml -U http://localhost:8080/source \
    -m 256

-Xmx8g:配置Java 最大堆内存为8g,防止内存溢出。
-jar:指定opengrok.jar包。
-c:指定universal-ctags的路径,可以使用which ctags确认具体路径。
-s:指定源码路径,就是上面的新建的src。
-d:指定索引文件存放路径,就是上面新建的data。
-W:指定configuration.xml的路径,就是上面新建的etc。
-m:指定opengrok索引时的缓存大小,默认只有16M。

更多参数可以使用java -jar /opt/opengrok-1.2.2/lib/opengrok.jar -h查看。

:还有其它多种索引和部署的方式,但是需要安装Opengrok tools,如下是Opengrok tools提供的工具(安装请参考: opengrok tools):
opengrok-config-merge
opengrok-deploy
opengrok-groups
opengrok
opengrok-indexer
opengrok-java
opengrok-mirror
opengrok-projadm
opengrok-reindex-project
opengrok-sync

由于Android源码较大,所以索引过程会有些慢,不用担心,只要程序不自己停止,就耐心等待完成。

重启Tomcat

先关闭然后再启动Tomcat,过一会儿就可以正常使用Opengrok了。浏览器中输入:http://ip:8080/source即可,不清楚ip地址的话,使用ifconfig查看。
opengrok
另外:
推荐一个公开的查看各版本Android源码的Opengrok网站:androidxref

参考

Opengrok的安装及配置
How-to-setup-OpenGrok
Tuning-for-large-code-bases
opengrok-tools

猜你喜欢

转载自blog.csdn.net/JerkSpan/article/details/87861289