根据Android源码学习(4)在Ubuntu11.04上编译Android所示步骤,我们已经成功编译了Android源码、并通过模拟器成功运行了Android。接下来,将开始漫长的的源码学习之旅。但是,面对如此庞大的项目(将近2G的源码),我们该从如何入手呢?几年的程序员经验让我觉得,每当面对一个全新项目时,从项目的编译系统入手,对于理解项目的功能,代码组织结构起到至关重要的作用。
Android通过Git对源码进行版本管理。目前Android一共包含一百多个项目,编译系统就是其中最为重要的一个项目。它的所有脚本位于Android源码根目录的build目录下。
Android通过Git对源码进行版本管理。目前Android一共包含一百多个项目,编译系统就是其中最为重要的一个项目。它的所有脚本位于Android源码根目录的build目录下。
![](https://i-blog.csdnimg.cn/blog_migrate/f66ee742fa439cdca35c813eb3a1ad90.png)
回想Android源码学习(4)在Ubuntu11.04上编译Android所提到的源码编译的第一步,即执行envsetup.sh脚本,初始化环境变量。可见envsetup.sh在整个Android编译系统所扮演的重要角色。
脚本envsetup.sh的主要作用是添加编译系统所需的环境变量以及一些方便Android开发的shell命令到当前shell。在执行envsetup.sh脚本后,可以通过如下命令来查看新加的变量及命令:
在Android源码目录下,也可以通过如下命令查看新添加的shell命令:
下面将比较常用的shell命令逐一解释:
如上所示,当前共有5种编译目标类型可供选择。其中generic-eng和simulator属于系统默认的编译目标类型,后面三种则是从vendor/*/vendorsetup.sh、vendor/*/build/vendorsetup.sh和device/*/*/vendorsetup.sh的文件中读取的。
编译目标类型由两部分构成,中间以"-"分隔。前半部分称之为编译名字,后半部分称之为编译类型。
目前Android一共包含3种编译类型,可以通过如下命令查看:
脚本envsetup.sh的主要作用是添加编译系统所需的环境变量以及一些方便Android开发的shell命令到当前shell。在执行envsetup.sh脚本后,可以通过如下命令来查看新加的变量及命令:
- ~/android/source/build$ . envsetup.sh
- ~/android/source/build$ set |less
- ~/android/source$ help
- 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.
-
- Look at the source to view more functions. The complete list is:
- add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var getbugreports get_build_var getprebuilt gettop godir help isviewserverstarted jgrep lunch m mm mmm pid printconfig print_lunch_menu resgrep runhat runtest set_java_home setpaths set_sequence_number set_stuff_for_environment settitle smoketest startviewserver stopviewserver systemstack tapas tracedmdump
- croot
改变当前路径到Android源码的根目录
- m
编译整个Android项目
- mm
编译当前目录下所有的模块
- mmm
编译通过参数指定的模块,例如mmm dalvik/dexdump
- cgrep
查询当前目录及子目录下所有符合查询条件的C文件(*.c, *.cc, *.cpp, *.h)
- jgrep
查询当前目录及子目录下所有符合查询条件的JAVA文件(*.java)
- resgrep
查询当前目录及子目录下所有资源相关的文件(*.xml)
- lunch
选择编译的目标 - printconfig
输出类似如下格式的当前配置
- ============================================
- PLATFORM_VERSION_CODENAME=REL
- PLATFORM_VERSION=2.3.5
- TARGET_PRODUCT=generic
- TARGET_BUILD_VARIANT=eng
- TARGET_SIMULATOR=
- TARGET_BUILD_TYPE=release
- TARGET_BUILD_APPS=
- TARGET_ARCH=arm
- HOST_ARCH=x86
- HOST_OS=linux
- HOST_BUILD_TYPE=release
- BUILD_ID=GINGERBREAD
- ============================================
- ~/android/source$ lunch
-
- You're building on Linux
-
- Lunch menu... pick a combo:
- 1. generic-eng
- 2. simulator
- 3. full_passion-userdebug
- 4. full_crespo4g-userdebug
- 5. full_crespo-userdebug
-
- Which would you like? [generic-eng]
编译目标类型由两部分构成,中间以"-"分隔。前半部分称之为编译名字,后半部分称之为编译类型。
目前Android一共包含3种编译类型,可以通过如下命令查看:
- ~/android/source/build$ set |grep “VARIANT_CHOICES=”
- VARIANT_CHOICES=([0]="user" [1]="userdebug" [2]="eng")
- eng
应该是engineering的缩写,属于适合开发的编译类型。
安装所有标记eng,user,debug或者development的模块
安装所有没有标记的非APK模块
按照产品定义文件安装APK模块
ro.secure=0
ro.debuggable=1
ro.kernel.android.checkjni=1
激活adb
- user
编译适合用户使用的最终版本。
安装标记为user的模块
安装所有没有标记的非APK模块
按照产品定义文件安装APK模块
ro.secure=1
ro.debuggable=0
禁止adb
- userdebug
除了以下几点,其他和user一样
安装标记为debug的模块
ro.debuggable=1
激活adb