Android开发,重点在kernel、bootloader、system等。每天有大量的代码要看,分散在很多目录下。
核心思路:
1. 使用数据库缓存,加速常用操作。2. 在vim中根据环境变量加载相应工程的各种符号数据库。
1,自定义shell命令,准备工程的环境变量。
本地有多个代码目录,需要切换工程,可将如下语句添加到.bashrc中,路径自定义,命令名称自定义。这些环境变量,主要是给vim准备的。
alias cdsyn="export PRJTOP=~/code1/share/MT_SYNC ; export TAGTOP=~/code1/share/MT_SYNC/tags ; cd ~/code1/share/MT_SYNC ; mkdir -p tags ; source build/envsetup.sh; source ~/.bashrc.loc"
.bashrc.loc只有一句话,自定义了一个快速查找文件的命令。
alias loc="locate -d $TAGTOP/.dirlocate.db"
2,为工程创建数据库
随便把脚本放到一个目录下,然后设置PATH。比如我放在~/code1/bin/下。
使用自定义cd命令(如cdsyn)进入到工程中。udb $(pwd)。完整的更新大概十几分钟就完成了。
我使用crontab -e,添加如下代码,让电脑每天凌晨时自动更新数据库。记得sudo service cron restart
0 0 * * * /home/liu/code1/bin/udb-repo /home/liu/code1/share/MT_SYNC
#!/bin/bash
if [ $# != 1 ]
then
echo "udb <path>"
exit -1
fi
PWD=$(pwd)
export PRJTOP=$1
export TAGTOP=$PRJTOP/tags
SRCLIST="build system kernel-3.10 device vendor bootable bionic external/libselinux"
cd $PRJTOP
mkdir -p $TAGTOP
#update locate db
echo "v" | sudo -S updatedb --prunepaths $PRJTOP/.repo -U $PRJTOP -o $TAGTOP/.dirlocate.db 2>/dev/null > $TAGTOP/log
#update ctags db
for src in $SRCLIST
do
cd $PRJTOP/$src
ctags -aR --tag-relative -f $TAGTOP/tags 2>/dev/null >> $TAGTOP/log
done
#update filelist
find $PRJTOP -wholename $PRJTOP/out -prune -o -wholename $PRJTOP/.repo -prune -o -type f 2>/dev/null > $TAGTOP/filelist
find $PRJTOP -name "*" -type d > $TAGTOP/dirlist
echo "!_TAG_FILE_SORTED 2 /2=foldcase/" > $TAGTOP/filenametags
for src in $SRCLIST
do
cd $PRJTOP/$src
find $PRJTOP/$src -type f -printf "%f\t%p\t1\n" 2>/dev/null | sort -f >> $TAGTOP/filenametags
done
#update cscope db
for src in $SRCLIST
do
cd $PRJTOP/$src
cscope -Rbqk -P $PRJTOP/$src 2>/dev/null >> $TAGTOP/log
done
cd $PWD
有的数据库是整个工程的,有的只索引部分目录。需要修改脚本,指定代码文件夹。
1)locate db。在工程的几十万个文件中中找一个文件,只需要几秒钟。配合.bashrc.loc用。比如loc factory_init.rc。
2)ctags db。vim中向下查函数和变量的代码。ctags和cscsope网上很多资料,不详细说了。
3)cscope db。vim中向上找谁掉了这个函数。
4)filelist。也是用来找文件的,但配合grep,可以更精细。比如这条命令,在sepolicy相关.te类型文件中找factory字符串。在selinux开发中,这个数据库帮了我大忙。
grep "sepolicy" tags/filelist | grep ".*.te$" | xargs grep factory
5)lookupfile db。在vim中找文件。http://easwy.com/blog/archives/advanced-vim-skills-lookupfile-plugin/
3. 配置vim的环境变量
如果你有在Android众多目录下频繁切换文件夹,为频繁设置tags路径烦恼,那么这段内容你一定很感兴趣。
核心点:在vimrc中可以使用shell的环境变量。你应该还记得,在cdsyn时,已经将工程环境变量导入到shell中了。
" ctags, 可以集中放在一个目录下。
set tags=$TAGTOP/tags
" cscope, 没办法,只能放在各自代码文件夹下,逐个添加。
:cs add $PRJTOP/kernel-3.10/cscope.out $PRJTOP/kernel-3.10
:cs add $PRJTOP/system/cscope.out $PRJTOP/system
:cs add $PRJTOP/vendor/cscope.out $PRJTOP/vendor
:cs add $PRJTOP/bootable/cscope.out $PRJTOP/bootable
:cs add $PRJTOP/device/cscope.out $PRJTOP/device
:cs add $PRJTOP/bionic/cscope.out $PRJTOP/bionic
" Lookup file的数据库路径
let g:LookupFile_TagExpr = printf('"%s/tags/filenametags"',$PRJTOP)