Android源码快速查找文件、搜索字符串和编译

android源码中有文件build/envsetup.sh,文件开头有如下内容:

Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- croot:   Changes directory to the top of the tree.
- m:       Makes from the top of the tree.
- mm:      Builds all of the modules in the current directory.
- mmm:     Builds all of the modules in the supplied directories.
- cgrep:   Greps on all local C/C++ files.
- jgrep:   Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir:   Go to the directory containing a file.

这些都是可以提高我们工作效率的命令,下面就看看怎么用这些命令。

先说查找文件和搜索字符串

在源码根目录先执行envsetup.sh脚本,运行结果如下:

harry@ubuntu:/host/android_codes/android2.3.6$ . build/envsetup.sh 
including device/htc/passion/vendorsetup.sh
including device/samsung/crespo4g/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh

运行完后,我们就可以直接使用啦。

1、godir

先看godir吧,以SurfaceFlinger.cpp为例。

倘若我们不用godir,且不知到SurfaceFlinger.cpp在哪个目录,只能用find命令了,如下:

find ./ -name SurfaceFlinger.cpp
然后就是漫长的等待啦,godir要比他快多啦,且看如何用他:

harry@ubuntu:/host/android_codes/android2.3.6$ godir SurfaceFlinger.cpp
Creating index... Done

harry@ubuntu:/host/android_codes/android2.3.6/frameworks/base/services/surfaceflinger$ 

第一次使用godir需要等待一会儿,需要建立index,第二次起就相当快啦。

这样我们就看到SurfaceFlinger.cpp是在frameworks/base/services/surfaceflinger了,并且我们已经直接进入这个目录了,这是因为整个工程只有一个SurfaceFlinger.cpp文件。如果有多个的话,会让我们选择,以Camera.java为例:

harry@ubuntu:/host/android_codes/android2.3.6/frameworks/base/services/surfaceflinger$ godir Camera.java
   [1] ./frameworks/base/core/java/android/hardware
   [2] ./frameworks/base/graphics/java/android/graphics
   [3] ./packages/apps/Camera/src/com/android/camera
   [4] ./packages/apps/Gallery3D/src/com/cooliris/media

Select one: 4
harry@ubuntu:/host/android_codes/android2.3.6/packages/apps/Gallery3D/src/com/cooliris/media$ 

2、croot

再来看看croot,我们一般执行编译命令都会在源码根目录,所以我们常常需要从好几层目录回到跟目录,比如:

harry@ubuntu:/host/android_codes/android2.3.6/packages/apps/Gallery3D/src/com/cooliris/media$ 

我们要回到根目录需要,用cd命令的话,得是这样cd ../../../......,运气比较好的话(上次目录正好是根目录),可以用cd -,但是croot相当好解决了该问题,使用如下:

harry@ubuntu:/host/android_codes/android2.3.6/packages/apps/Gallery3D/src/com/cooliris/media$ croot
harry@ubuntu:/host/android_codes/android2.3.6$ 

3、cgrep/jgrep/resgrep

他们都是grep命令的变种,针对性的简化了grep命令的使用方法。

我们一般用grep的话都得这样:

grep -rn str dir

如果只想grep某类文件的话,可能需要如下命令:

find ./ -name "*.java" | xargs grep str

与此对比,cgrep/jgrep/resgrep的用法就简单多啦,如下

harry@ubuntu:/host/android_codes/android2.3.6/packages/apps/Camera$ jgrep Camera
./src/com/android/camera/Camera.java:33:import android.hardware.Camera.CameraInfo;
./src/com/android/camera/Camera.java:34:import android.hardware.Camera.Parameters;
./src/com/android/camera/Camera.java:35:import android.hardware.Camera.PictureCallback;
./src/com/android/camera/Camera.java:36:import android.hardware.Camera.Size;
cgrep/resgrep也是同样的用法,都比简单grep简单多了。

再说编译

4、m/mm/mmm

编译命令make,使用方法:

1)全工程编译: make

2)模块编译:make 模块


m/mm/mmm使用方法:

这些m类命令,使用前都需要先用make命令执行过一次。

1)m = make (全编译)

2)mm/mmm = make 模块,举例说明:

make libsurfaceflinger
等同于
harry@ubuntu:/host/android_codes/android2.3.6/frameworks/base/services/surfaceflinger$: mm
等同于
harry@ubuntu:/host/android_codes/android2.3.6/$: mmm frameworks/base/services/surfaceflinger
强调两点:

1)重点提示“mm/mmm前一定要用make编译过”

2)mm和mmm都是编译指定目录内的所有mk文件,可能会比你预想的编译的东西要多

3)mm/mmm编译的当前目录,若引用了非当前目录编译的静态链接库,静态链接库的修改是不生效的,这时候还是用make吧。




你可能感兴趣的:(Android,Android,编译,查找,搜索字符串)