【转】Android编译系统详解(一)——build/envsetup.sh
出处 http://www.cloudchou.com/android/post-134.html
本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接
准备好编译环境后,编译Rom的第一步是 source build/envsetup.sh,该步骤把e\nvsetup.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 |
VARIANT_CHOICES=(user userdebug eng),# TARGET_BUILD_VARIANT变量的可能值 |
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提示
【转】Android编译系统详解(一)——build/envsetup.sh的更多相关文章
- Android编译系统详解(一)
++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...
- 【转】Android编译系统详解(三)——编译流程详解
原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Androi ...
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...
- Android编译详解之lunch命令 【转】
本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和 ...
- 【整理修订】Android.mk详解
Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Android签名详解(debug和release)
Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...
- Android ConstraintLayout详解(from jianshu)
Android ConstraintLayout详解 https://www.jianshu.com/p/a8b49ff64cd3 1. 概述 在本篇文章中,你会学习到有关Constraint ...
随机推荐
- [NLP] 语义网络与知识图谱入门(二)
语义网络与知识图谱入门(二) OWL 本体声明 owl用owl:Ontology来声明一个本体.rdf:about属性为本体提供一个名称或引用.根据标准,当rdf:about属性的值为"&q ...
- leetcode-easy-string- 38 Count and Say
mycode 91.28% 思路:题意实在太难理解了,尤其是英文又不好,只能参看下别人的资料,理解下规则.终于理解,题意是n=1时输出字符串1:n=2时,数上次字符串中的数值个数,因为上次字符串有 ...
- linux (一)
一.文件目录 cd 目录进出 pwd 查看路径 ls:ll 查看目录 mkdir : mkdir -p app/test 创建目录 touch 创建文件 rm :rm -r 递归 -f 强制 mv ...
- IFB
本文翻译自Linux官方IFB文档 IFB(中介功能块设备)是IMQ(中介队列设备)的继任者,IMQ从来没有被集成过,IFB拥有IMQ的优点,在SMP上更加清晰明了,并且代码量缩减了非常多,旧的中介设 ...
- Reactjs之静态路由、动态路由以及Get传值以及获取
1.新增知识点 /* react路由的配置: 1.找到官方文档 https://reacttraining.com/react-router/web/example/basic 2.安装 cnpm i ...
- ABAP开发常用函数
1. LAST_DAY_OF_MONTHS——用于获取某月的最后一天. 例如输日今天的日期2013/10/16,系统将回执成2013年10月的最后一天,也就是2013/10/30 2. CONVE ...
- 磁盘的分区和挂载(mount)
一.挂载问题的引入 我们大多数人用惯了windos系统,对linux系统中磁盘的管理就先入为主,不太好理解挂载这一动作.在linux系统中添加一块新磁盘后,要进行分区.格式化(分配文件系统).挂载.当 ...
- word2vec原理浅析
1.word2vec简介 word2vec,即词向量,就是一个词用一个向量来表示.是2013年Google提出的.word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型( ...
- 【VS开发】【智能语音处理】特定人语音识别算法—DTW算法
DTW(动态时间弯折)算法原理:基于动态规划(DP)的思想,解决发音长短不一的模板匹配问题.相比HMM模型算法,DTW算法的训练几乎不需要额外的计算.所以在孤立词语音识别中,DTW算法仍得到广泛的应用 ...
- python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...