使用Cscope跳转Android源码函数调用(包含内核)

前言:

通常情况下,使用SourceInsight跳转源码函数调用比较方便,但有的时候用到vim,vim功能很强大,但却不能进行函数跳转,需要借助cscope或者ctags。

安装ctags和cscopes:

sudo apt install ctags
sudo apt install cscope

生成数据库文件:

ctags执行选项:

ctags -R --c++-kinds=+px --fields=+iaS --extra=+q --exclude=pattern

–c++-kinds: 用于指定C++语言的tags记录类型, –c-kinds用于指定c语言的, 通用格式是 –{language}

–fileds: 用于指定每条标记的扩展字段域

–extra: 选项用于增加额外的条目: f表示为每个文件增加一个条目, q为每个类增加一个条目

–exclude: 在创建ctags的时候排除某些目录

vim ctag_cscope_db.sh

#! /bin/bash

echo "正在生成tags文件"
/usr/bin/ctags -R --fields=+lS .
if [[ $? == 0 ]]; then
    echo "生成tags文件成功"
    echo "$(readlink -f tags)"
else
echo "生成tags文件失败"
fi

echo "正在生成cscope.out"
find . \
    -name "out" -prune \
    -o -iname "*.s" -o -iname "*.h" \
    -o -iname "*.c" -o -name "*.cc" \
    -o -iname "*.cpp" -o -iname "*.cxx" \
    | sed -n "s%^\.%$PWD%p" \
    > cscope.files

/usr/bin/cscope -Rbq
if [[ $? == 0 ]]; then
       echo "生成cscope.out成功"
    echo "$(readlink -f cscope.out)"
else    
    echo "生成cscope.out失败"
fi

在Android源码顶层目录执行后生成cscope.files、 cscope.in.out、 cscope.out、 cscope.po.out、 tags

Ctrl+] //跳转到所有调用此函数的地方,以及定义的地方

Ctrl+t //回退
1

配置/etc/vim/vimrc:

  1. 第一个命令里的分号是必不可少的,这个命令让vim首先在当前目录里寻找tags文件,如果没有找到tags文件,
    就到父目录中查找,一直向上递归。

  2. 因为tags文件中记录的路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。

    set tags=tags;
    set autochdir
  3. 子目录使用cscope跳转

    function! LoadCscope()
      let db = findfile("cscope.out", ".;")
      if (!empty(db))
        let path = strpart(db, 0, match(db, "/cscope.out$"))
        set nocscopeverbose " suppress 'duplicate connection' error
        exe "cs add " . db . " " . path
        set cscopeverbose
          " else add the database pointed to by environment variable 
      elseif $CSCOPE_DB != "" 
        cs add $CSCOPE_DB
      endif
    endfunction
    au BufEnter /* call LoadCscope()
  4. 如果想要使用Taglist。(选配)

    1

    1. 安装taglist

    2. https://sourceforge.net/projects/vim-taglist/files/下载taglist安装包。

    3. 进入/etc/vim/目录,将taglist安装包解压,将解压后的/doc和/plugin目录复制到该目录下

    4. vim vimrc(下面的单引号表示注释,如果想改变配置,将相应”去掉)

      "设置taglist打开关闭的快捷键F8
      nnoremap <silent> <F8> :TlistToggle<CR>
      
      filetype plugin indent on
      let Tlist_Inc_Winwidth = 1
      let Tlist_Auto_Highlight_Tag = 1
      let Tlist_Highlight_Tag_On_BufEnter = 1
      
      "设置ctags路径
      let Tlist_Ctags_Cmd = '/usr/bin/ctags'
      
      "启动vim后自动打开taglist窗口
      let Tlist_Auto_Open = 1
      
      "不同时显示多个文件的tag,仅显示一个
      let Tlist_Show_One_File = 0
      
      "taglist为最后一个窗口时,退出vim
      let Tlist_Exit_OnlyWindow = 1
      
      "taglist窗口显示在右侧,缺省为左侧
      "let Tlist_Use_Right_Window =1
      
      "设置taglist窗口大小
      "let Tlist_WinHeight = 100
      "let Tlist_WinWidth = 40
      
      "设置taglist打开关闭的快捷键F8
      noremap <F8> :TlistToggle<CR>
      
      "更新ctags标签文件快捷键设置
      noremap <F6> :!ctags -R<CR>
5. vim一般配置(选配)

        :set nocompatible "VIM而不是VI
        :set history=50 "历史记录50条
        :set fenc=utf-8 "设置默认语言为8位unicode
        :set hls "查找文本高亮
        :set ruler "显示当前位置
        :set autoindent "自动缩进
        :set smartindent "智能缩进
        :set cindent "缩进
        :set tabstop=4 "硬TAB
        :set softtabstop=4 "软TAB
        :set shiftwidth=4 "缩进空格数
        :set expandtab "空格替换TAB
        :set smarttab "智能TAB
        :set showmatch "显示匹配
        :set matchtime=5 "1/10秒延迟
        :set hlsearch "高亮搜索
        :set incsearch "搜索中匹配
        :set tags=tags; "ctags
        :set autochdir "ctags
        filetype on "打开文件类型检测
        colorscheme delek "主题
        "colorscheme evening "主题
        syntax on "语法高亮

转载请注明出处:http://www.wolfnx.com/2018/12/19/AndroidSourceUseCscope

作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com

Click Me