Android编译过程中首先运行的是build/envsetup.sh脚本,那么它的作用是什么呢?我在这里简单描述一下!
1.初始化参数设置(比如一些环境变量)
进入Android源码根目录,执行source build/envsetup.sh(如下图所示),这是我的系统执行envsetup.sh的所including出的其他.sh文件。
envsetup.sh脚本会配置安卓编译的相关环境变量。用vim打开envsetup.sh,发现其主要功能是将lunch,mm,mmm等这些指令添加到当前终端环境变量中,以备后面使用。
这些.sh文件中定义了很多相关bash函数,感兴趣的朋友可以研究下,这里就不做解释了。
2.选择lunch并读取目标配置和平台信息
执行lunch命令(这就是上面脚本加载进来的指令),我的系统选择的是5,这些都可通过上面.sh进行配置,详细可去看里面的代码。
对于1-7不同的分支是可以在代码中添加 /修改/删除的,分支存在的意义就是:
(1).当我们为手机更换硬件(如换了更好的LED屏幕,更好的音响设备),我们可以在这里添加对应的分支,方便系统版本管理。
(2).当我们的客户针对某些版本软软件上做了的不同需求修改后(如开机画面修改,某些预置软件添加/删除),我们也可以在这里添加对应的分支,方便系统版本管理。
3.到此,你可以在Terminal中输入env命令,发现终端环境变量中增加了很多,这些都是上面几个步骤生成的,也是编译Android所必备的!
xiaoma-pedro@xiaomapedro-Lenovo-G470:~/proj/r970$ env
ARM_EABI_TOOLCHAIN=/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin
ANDROID_DEV_SCRIPTS=/home/xiaoma-pedro/proj/r970/development/scripts:/home/xiaoma-pedro/proj/r970/prebuilts/devtools/tools
XDG_VTNR=7
LC_PAPER=zh_CN.UTF-8
NDK=/home/xiaoma-pedro/xiaoma-pedro/Tool_Chains/android-ndk-r14b
LC_ADDRESS=zh_CN.UTF-8
XDG_SESSION_ID=c2
ANDROID_PRE_BUILD_PATHS=/usr/lib/jvm/jdk1.6.0_45/bin:
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xiaoma-pedro
SELINUX_INIT=YES
LC_MONETARY=zh_CN.UTF-8
CLUTTER_IM_MODULE=xim
ANDROID_PRODUCT_OUT=/home/xiaoma-pedro/proj/r970/out/target/product/rk3288
ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/jdk1.6.0_45/bin
ANDROID_BUILD_TOP=/home/xiaoma-pedro/proj/r970
GPG_AGENT_INFO=/run/user/1000/keyring-Xl9NIx/gpg:0:1
TERM=xterm
VTE_VERSION=3409
SHELL=/bin/bash
WINDOWID=85983244
LC_NUMERIC=zh_CN.UTF-8
OUT=/home/xiaoma-pedro/proj/r970/out/target/product/rk3288
OLDPWD=/home/xiaoma-pedro/proj/r970/external
UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/2195
GNOME_KEYRING_CONTROL=/run/user/1000/keyring-Xl9NIx
GTK_MODULES=overlay-scrollbar:unity-gtk-module
TARGET_BUILD_VARIANT=eng
NO_PROXY=localhost,127.0.0.0/8,::1
JRE_HOME=/usr/lib/jvm/jdk1.6.0_45/jre
http_proxy=http://127.0.0.1:40085/
USER=xiaoma-pedro
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
LC_TELEPHONE=zh_CN.UTF-8
BUILD_ENV_SEQUENCE_NUMBER=10
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
ANDROID_BUILD_PATHS=/home/xiaoma-pedro/proj/r970/out/host/linux-x86/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin:/home/xiaoma-pedro/proj/r970/development/emulator/qtools:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/xiaoma-pedro/proj/r970/development/scripts:/home/xiaoma-pedro/proj/r970/prebuilts/devtools/tools:
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
ANDROID_QTOOLS=/home/xiaoma-pedro/proj/r970/development/emulator/qtools
SSH_AUTH_SOCK=/run/user/1000/keyring-Xl9NIx/ssh
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
TARGET_BUILD_APPS=
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
TARGET_BUILD_TYPE=release
DESKTOP_SESSION=ubuntu
PATH=/usr/lib/jvm/jdk1.6.0_45/bin:/home/xiaoma-pedro/proj/r970/out/host/linux-x86/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin:/home/xiaoma-pedro/proj/r970/development/emulator/qtools:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/xiaoma-pedro/proj/r970/development/scripts:/home/xiaoma-pedro/proj/r970/prebuilts/devtools/tools:/usr/lib/jvm/jdk1.6.0_45/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/xiaoma-pedro/xiaoma-pedro/Tool_Chains/android-ndk-r14b
QT_IM_MODULE=xim
QT_QPA_PLATFORMTHEME=appmenu-qt5
LC_IDENTIFICATION=zh_CN.UTF-8
PWD=/home/xiaoma-pedro/proj/r970
JOB=gnome-session
JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
XMODIFIERS=@im=fcitx
GNOME_KEYRING_PID=2193
LANG=en_US.UTF-8
ANDROID_TOOLCHAIN=/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin
GDM_LANG=en_US
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
LC_MEASUREMENT=zh_CN.UTF-8
COMPIZ_CONFIG_PROFILE=ubuntu
IM_CONFIG_PHASE=1
https_proxy=http://127.0.0.1:40085/
GDMSESSION=ubuntu
HTTPS_PROXY=http://127.0.0.1:40085/
SESSIONTYPE=gnome-session
SHLVL=1
HOME=/home/xiaoma-pedro
XDG_SEAT=seat0
LANGUAGE=en_US
no_proxy=localhost,127.0.0.0/8,::1
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
ANDROID_EABI_TOOLCHAIN=/home/xiaoma-pedro/proj/r970/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin
HTTP_PROXY=http://127.0.0.1:40085/
UPSTART_INSTANCE=
UPSTART_EVENTS=started starting
LOGNAME=xiaoma-pedro
CLASSPATH=.:/usr/lib/jvm/jdk1.6.0_45/lib:/usr/lib/jvm/jdk1.6.0_45/jre/lib
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-PER3HdjxMw
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
QT4_IM_MODULE=fcitx
OPROFILE_EVENTS_DIR=/home/xiaoma-pedro/proj/r970/external/oprofile/events
TARGET_GCC_VERSION=4.7
LESSOPEN=| /usr/bin/lesspipe %s
PROMPT_COMMAND=echo -ne "\033]0;[arm-rk3288-eng] xiaoma-pedro@xiaomapedro-Lenovo-G470: /home/xiaoma-pedro/proj/r970\007"
INSTANCE=Unity
TEXTDOMAIN=im-config
UPSTART_JOB=unity-settings-daemon
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=:0
ANDROID_HOST_OUT=/home/xiaoma-pedro/proj/r970/out/host/linux-x86
TARGET_PRODUCT=rk3288
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=fcitx
LESSCLOSE=/usr/bin/lesspipe %s %s
LC_TIME=zh_CN.UTF-8
TEXTDOMAINDIR=/usr/share/locale/
LC_NAME=zh_CN.UTF-8
XAUTHORITY=/home/xiaoma-pedro/.Xauthority
COLORTERM=gnome-terminal
_=/usr/bin/env
4.可用mmm/mm命令单独编译独立模块。
比如在×/external/目录下有个libyuv,他应该是用来编译出某个库文件的源码。
(1)可通过指令mmm libyuv,可以看到此模块单独进行了编译,并把输出结果输出到out目录对应目录下(out/target/product/rk3288/obj/STATIC_LIBRARIES/libyuv_static_intermediates/libyuv_static.a)。
(2)还可以通过mm命令,但是要注意的是mm命令执行的前提是要先进入到external/libyuv目录中,执行mm命令即可。(因为我刚才执行了mmm命令,所以执行mm命令时提示Nothing to be done for `all_modules')
但是值得注意的是,我在没有完整编译(make -j8)的前提下直接用mm命令单独编译模块总是提示错误。因为没有完整编译系统的前提下,out目录下缺少某些相关库或文件所导致。(这个是我亲测的,具体原因还在研究,等有结果再补充)
下图就是一个在我没有完整编译系统(make -j8)的前提下,运行mm报错的情况:
所以到此为止我们可以简单了解到build/envsetup.sh脚本所引发的作用了。