Android源码快速查找文件、搜索字符串和编译
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.shincluding device/samsung/crespo4g/vendorsetup.shincluding 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.cppCreating index... Doneharry@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/mediaSelect one: 4harry@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$ crootharry@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之获取手机安装包里面的信息、获取目录空间的大小
- Android中pm命令用法
- Android 平台根目录文件
- Android SELinux开发入门指南之正确姿势解决访问data目录权限问
- 在android中通过java层程序调用命令行的一些备注
- Android Studio--增加assets目录、raw目录
- Android压缩文件(压缩目录)