Android编译系统详解(一)——build/envsetup.sh

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

准备好编译环境后,编译Rom的第一步是 source build/envsetup.sh,该步骤把envsetup.sh里的函数声明为当前会话终端可用的命令。这些命令能让我们切换目录,提交代码,编译Rom更方便。如果记不住所有命令,只要你记住hmm就可以了,也可通过hmm命令看到支持的命令列表。

1. 命令分类:

1.1 编译用的命令

命令名称 使用方式 说明
breakfast
别名bib

breakfast [product]

示例:

breakfast i9100

breakfast
cm_i9100-userdebug

选择产品
product格式: device 或者 device-build_variant

先从网上下载cm支持的产品列表

product是用户要编译的目标产品,例如find5或者i9100

如果选择device-build_variant,并且是cm支持的device,一般会以cm_开头,比如cm_i9100

如果未选择编译产品,那么会弹出许多product,让用户选择

这里的product列表仅包含从网上下载的产品,不包含只有本地支持的产品

lunch

lunch [product]

示例:

lunch cm_i9100-userdebug

选择产品

product格式: build-build_variant

不再从网上下载产品列表,

如果[product]为空,意味着未选择编译产品,也会弹出许多product,让用户选择,

这里的product列表是用户在执行source
build/envsetup.sh时,including了一些shell脚本,从而添加至产品列表的

brunch

brunch [product]

选择产品并编译
product格式: device 或者 device-build_variant

调用breakfast选择编译产品

然后调用mka bacon编译

m

m [targetlist]

编译选中目标
示例:m otatools bacon

并没有调用schedtool 充分利用所有核编译

mm

mm [mka]
[targetlist]

示例:

mm mka

编译选中目标或者当前目录所在项目

若有mka,会调用mka进行编译

如果当前目录在顶层目录,会编译指定的所有目标

如果不在顶层目录,会编译当前目录所在的工程

mmm

mmm [directory:[modulist]]
-arglist

编译指定目录下的模块

directory可以为以下特殊目标:

snod dist mka
showcommands

若指定了mka,将利用mka进行编译

示例:

mmm
bootable/recovery: recovery

或者

mmm
bootable/recovery

mka

mka [targetlist]

编译指定目标列表

将利用SCHED_BATCH编译指定所有目标,这样能充分利用所有CPU

eat

eat

刷机
在/cahce/recovery/command文件写上如下命令–sideload,重启设备至recovery,等待设备进入sideload状态,调用adb sideload进行刷机

omnom

omnmon [product]

编译ROM并刷ROM至设备
tapas

tapas [<App1>
<App2> ...] [arm|x86|mips] [eng|userdebug|user]

Configures the
build to build unbundled apps

cmka

cmka [targetlist]

Cleans and builds
using mka

installboot installboot

安装boot

利用$OUT/recovery/root/etc/recovery.fstab找到boot所在分区以及分区类型,找到分区后,先将boot.img
上传至/cache下,需要将内核需要加载的模块$OUT/system/lib/modules/*上传至/system/lib/modules/,
然后如果是mtd分区就利用flash_image刷至相应的分区,否则利用dd刷至相应的分区

installrecovery

installrecovery

安装recovery

与安装boot类似

1.2 查看代码时的辅助命令

命令名称 使用方式 说明
cgrep

cgrep keyword

在C,C++代码中搜索指定关键字

调用find查找C/C++代码文件(包括头文件),并且排除了不用的文件夹,在找到的文件中用grep搜索关键字

jgrep

jgrep keyword

在java代码中搜索指定关键字

调用find查找java代码文件,并且排除了不用的文件夹,在找到的文件中用grep搜索关键字

resgrep

resgrep
keyword

在资源xml文件中搜索指定关键字

调用find在当前文件夹查找下res子目录里找xml文件,并且排除了不用的文件夹,在找到的文件中用grep搜索关键字

croot

croot

切换至Android根目录

cout

cout

切换至prodcut的out目录

cproj

cproj

从某个工程的非常深的子目录,可迅速切换至工程的根目录

get_build_var

get_build_var
build_var

获取某个编译变量的值,

一般是路径

get_abs_build_var

get_abs_build_var

获取某个编译变量的值,

是绝对路径

findmakefile

打印当前目录所在工程的Android.mk的文件路径

printconfig

打印各种编译变量的值

print_lunch_menu

打印lunch可选择的各种product

godir

切换至用户输入的文件所在的目录

repodiff

调用git进行diff,查看当前修改的东西

1.3 辅助函数

命令名称 使用方式 说明
add_lunch_combo 增加调用lunch命令时的选择项

示例:

add_lunch_combo
full_galaxys2att-eng

check_product

检查产品看CM是否能支持编译

check_variant

检查TARGET_BUILD_VARIANT,看其值是否有效,可能的值只能为user,userdebug,eng

choosecombo

调用choosetype,chooseproduct,choosevariant等函数,确定TARGET_PRODUCT,TARGET_BUILD_TYPE,TARGET_BUILD_VARIANT

chooseproduct

让用户输入一个product的名字,默认为full,最终确定TARGET_PRODUCT,

choosetype

选择编译类型即TARGET_BUILD_TYPE,可能的值为debug,release

choosevariant

让用户选择编译变量TARGET_BUILD_VARIANT,可能的值为user,userdebug,eng

dopush

alias mmp=’dopush mm’

alias mmmp=’dopush mmm’

alias mkap=’dopush mka’

alias cmkap=’dopush cmka’

fixup_common_out_dir

建立$(OUT_DIR)/target/common目录

getprebuilt

得到prebuilt的路径

getsdcardpath

获取Sd卡路径

gettargetarch

获取TARGET_ARCH的值

gettop

获取Android源码根目录

set_java_home

设置java的主目录

setpaths

将编译要用到的一些路径添加到环境变量PATH里

set_sequence_number

export BUILD_ENV_SEQUENCE_NUMBER=10

set_stuff_for_environment

设置PROMPT_COMMAND变量,java_home,PATH目录,set_sequence_number

settitle

如果STAY_OFF_MY_LAWN为空,设置PROMPT_COMMAND变量,会改变SecureCrt终端窗口显示的名字

1.4 调试相关

命令名称 使用方式 说明
gdbclient

gdbclient
exename (progname|pid)

gdb调试

pid

pid exename

查看某个可执行程序对应的进程id

getbugreports

将bug报告从设备上拉到本地,bug报告存放于目录/sdcard/bugreports,

getlastscreenshot

获取最后一张截图

getscreenshotpath

获取屏幕截图的路径

isviewserverstarted

判断viewserver是否已启动

adb shell service call window 3

key_back

模拟按返回键

key_home

模拟按Home键

key_menu

模拟按菜单键

runtest

调用development/testrunner/runtest.py,进行测试

smoketest

利用SmokeTestApp.apk,SmokeTest.apk对系统进行一个smoke test

startviewserver

adb shell service call window 1 i32 $port

stopviewserver

adb shell
service call window 2

systemstack

dump the current stack trace of all
threads in the system process to the usual ANR traces file

tracedmdump

调用q2dm将系统堆栈导出来,并利用dmtracedump将其转为可读的html文件

1.5 提交代码相关命令

命令名称 使用方式 说明
aospremote

Add git remote
for matching AOSP repository

cmgerrit

从CM拉源代码,或者将源代码提交到gerrit给比人审核,直接敲这个命令可得到该命令的使用帮助,最终调用Git完成命令功能

cmrebase

和git的rebase 衍合类似,我们不做代码提交,故此没必要

cmremote

Add git remote for CM Gerrit Review

makerecipe

将本地代码推送至git仓库

repopick

Utility to fetch changes from Gerrit,可选项有–ignore-missing,–start-branch,–abandon-first,–auto-branch

reposync

Parallel repo
sync using ionice and SCHED_BATCH

2. source build/envsetup.sh 执行流程

envsetup.sh 定义了很多函数,除此之外还执行了其它操作,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
VARIANT_CHOICES=(user userdebug eng),# TARGET_BUILD_VARIANT变量的可能值
#LUNCH_MENU_CHOICES是供用户选择的prodcut列表,
#每次source build/envsetup.sh时需重置变量LUNCH_MENU_CHOICES
#不然后续的include vendor/cm/vendorsetup.sh时会继续添加产品至变量LUNCH_MENU_CHOICES里,
#导致出现很多重复产品
unset LUNCH_MENU_CHOICES
add_lunch_combo full-eng #默认添加full-eng,full_mips-eng等4个产品
add_lunch_combo full_x86-eng
add_lunch_combo vbox_x86-eng
add_lunch_combo full_mips-eng
alias bib=breakfast#给breakfast起别名
complete -F _lunch lunch #给lunch添加tab提示
case `uname -s` in #定义sgrep函数 在所有工程类型代码里搜索
    Darwin)
        function sgrep()
        {
            find -E . -name .repo -prune -o -name .git -prune -o  -type f                  -iregex ‘.*\.(c|h|cpp|S|java|xml|sh|mk)‘ -print0                  | xargs -0 grep --color -n "[email protected]"
        }
        ;;
    *)
        function sgrep()
        {
            find . -name .repo -prune -o -name .git -prune -o  -type f                  -iregex ‘.*\.\(c\|h\|cpp\|S\|java\|xml\|sh\|mk\)‘ -print0 \
                 | xargs -0 grep --color -n "[email protected]"
        }
        ;;
esac
export -f cmremote
export -f aospremote
alias mmp=‘dopush mm‘ #定义更多编译后push到设备的函数的操作
alias mmmp=‘dopush mmm‘
alias mkap=‘dopush mka‘
alias cmkap=‘dopush cmka‘
if [ "x$SHELL" != "x/bin/bash" ]; then #只支持Bash终端
    case `ps -o command -p $$` in
        *bash*)
            ;;
        *)
            echo "WARNING: Only bash is supported,"                   "use of other shell would lead to erroneous results"
            ;;
    esac
fi
#Execute the contents of any vendorsetup.sh files we can find.
#source vendor和device下能找到的所有vendorsetup.sh
for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`
do
    echo "including $f"
    . $f
done
unset f
#source目录 sdk/bash_completion vendor/cm/bash_completion下的bash脚本,
#能提供tab提示
addcompletions
export ANDROID_BUILD_TOP=$(gettop)

2.1 执行的vendorsetup.sh有:

在envsetup.sh里将执行vendor和device目录及各自子目录下所有的vendorsetup.sh,这些vendorsetup.sh做的事情是调用add_lunch_combo将它们各自的产品添加到 LUNCH_MENU_CHOICES 变量里

#执行cm的vendorsetup.sh将从网上下载cm支持的产品列表,并添加至LUNCH_MENU_CHOICES

vendor/cm/vendorsetup.sh

#将添加mini_armv7a_neon产品 add_lunch_combo mini_armv7a_neon-userdebug

device/generic/armv7-a-neon/vendorsetup.sh

#add_lunch_combo mini_armv7a-userdebug

device/generic/armv7-a/vendorsetup.sh

#add_lunch_combo mini_mips-userdebug

device/generic/mips/vendorsetup.sh

#add_lunch_combo mini_x86-userdebug

device/generic/x86/vendorsetup.sh

#add_lunch_combo cm_jflteatt-eng

device/samsung/jflteatt/vendorsetup.sh

# add_lunch_combo full_panda-userdebug

device/ti/panda/vendorsetup.sh

# add_lunch_combo zte_blade-eng

#add_lunch_combo zte_blade-userdebug

device/zte/blade/vendorsetup.sh

2.2 执行的completion bash有:

在envsetup.sh里将执行sdk/bash_completion和vendor/cm/bash_completion目录下的bash 脚本,这些bash脚本主要是为命令提供tab支持,有了这些tab支持,输入命令后如果某个选项忘记了,只需要敲tab键,就能获得提示,使用命令更加 方便

including sdk/bash_completion/adb.bash

including vendor/cm/bash_completion/git.bash

including vendor/cm/bash_completion/repo.bash

分别对应adb,git,repo的tab提示

时间: 2024-08-28 20:25:15

Android编译系统详解(一)——build/envsetup.sh的相关文章

Android编译系统详解(一)

++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/article/details/7539978 ++++++++++++++++++++++++++++++++++++++++++ Android编译系统详解(一):http://blog.csdn.net/mr_raptor/article/details/7539978 Android编译系统详解(

【转】Android编译系统详解(三)——编译流程详解

原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Android的第三步是使用mka命令进行编译,当然我们也可以使用make –j4,但是推荐使用mka命令.因为mka将自动计算-j选项的数字,让我们不用纠结这个数字到底是多少(这个数字其实就是所有cpu的核心数).在编译时我们可以带上我们需要编译的目标,假设你想生成recovery,那么使用mka recov

编译android源码报错:build/envsetup.sh: 1: Syntax error:

编译android源码时报错: build/envsetup.sh: 1: Syntax error: "(" unexpected 解决方法: 执行$sudo dpkg-reconfigure dash命令,并选择"否" 编译android源码报错:build/envsetup.sh: 1: Syntax error:

【转】Android source build/envsetup.sh学习笔记

原文网址:http://blog.csdn.net/mliubing2532/article/details/7567164 如果你只需要修改某一个模块的内容,但是却每次都要执行make, 最后等待很长时间.使用模块编译,那只需要在你所在的模块的目录或者其子目录,执行mm,便可以编译出一个单独的apk,这样岂不快哉! build/envsetup.sh提供了几个有用的shell命令,使用$.build/envsetup.sh(注意点号)或者$sourcebuild/envsetup.sh 可以引

Android编译详解之lunch命令 【转】

本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程. 如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站:http://source

android WebView详解,常见漏洞详解和安全源码(下)

上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http://blog.csdn.net/self_study/article/details/55046348 对技术感兴趣的同鞋加群 544645972 一起交流. WebView 常见漏洞 WebView 的漏洞也是不少,列举一些常见的漏洞,实时更新,如果有其他的常见漏洞,知会一下我-- WebView

android WebView详解,常见漏洞详解和安全源码

这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析. 由于博客内容长度,这次将分为上下两篇,上篇详解 WebView 的使用,下篇讲述 WebView 的漏洞和坑,以及修复源码的解析. 下篇:android WebView详解,常见漏洞详解和安全源码(下) 转载请注明出处:http://blog.csdn.net/self_study/article/details/54928371. 对技术感兴趣的同鞋加群 54

使用Ant打包Android应用详解——Ant使用解析

上篇<使用Ant打包Android应用详解>描述了使用Ant打包的流程,但很多步骤并没有说明如此做的原因,本篇将从Ant方面来理解,下一篇从APK生成的流程来说明. APK包的生成是一系列操作的结果,而Ant则是将这一系列操作流程化,提供出定制化的接口,以及可配置的参数供修改,而这些都是通过指定的构建文件来实现.我们就从Ant的打包流程来理解Ant的一些基本用法.当在命令行中执行ant,默认会去解析当前目录的build.xml作为构建文件.下面是个删除部分注视的版本: <project

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.