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吧。