Android编译系统详解(一)——build/envsetup.sh
来源:互联网 发布:java软件开发简历范文 编辑:程序博客网 时间:2024/05/16 06:53
Android编译系统详解(一)——build/envsetup.sh
http://www.cloudchou.com/android/post-134.html
准备好编译环境后,编译Rom的第一步是 source build/envsetup.sh,该步骤把envsetup.sh里的函数声明为当前会话终端可用的命令。这些命令能让我们切换目录,提交代码,编译Rom更方便。如果记不住所有命令,只要你记住hmm就可以了,也可通过hmm命令看到支持的命令列表。
1. 命令分类:
1.1 编译用的命令
别名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 installbootinstallboot 安装boot
利用$OUT/recovery/root/etc/recovery.fstab找到boot所在分区以及分区类型,找到分区后,先将boot.img上传至/cache下,需要将内核需要加载的模块$OUT/system/lib/modules/*上传至/system/lib/modules/,然后如果是mtd分区就利用flash_image刷至相应的分区,否则利用dd刷至相应的分区 installrecoveryinstallrecovery 安装recovery
与安装boot类似
1.2 查看代码时的辅助命令
调用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_varget_abs_build_var 获取某个编译变量的值,
是绝对路径 findmakefile 打印当前目录所在工程的Android.mk的文件路径 printconfig 打印各种编译变量的值 print_lunch_menu 打印lunch可选择的各种product godir 切换至用户输入的文件所在的目录 repodiff 调用git进行diff,查看当前修改的东西
1.3 辅助函数
示例:
add_lunch_combo full_galaxys2att-engcheck_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=10set_stuff_for_environment 设置PROMPT_COMMAND变量,java_home,PATH目录,set_sequence_number settitle 如果STAY_OFF_MY_LAWN为空,设置PROMPT_COMMAND变量,会改变SecureCrt终端窗口显示的名字
1.4 调试相关
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 提交代码相关命令
2. source build/envsetup.sh 执行流程
envsetup.sh 定义了很多函数,除此之外还执行了其它操作,代码如下:
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编译系统详解(一)——build/envsetup.sh
- Android编译系统详解(一)——build/envsetup.sh
- Android编译系统详解(一)——build/envsetup.sh
- Android编译系统详解(一)——build/envsetup.sh
- Android编译系统详解(一)——build/envsetup.sh
- Android编译系统——build/envsetup.sh
- 编译——source build/envsetup.sh
- build/envsetup.sh简记Android系统编译分析
- android编译系统分析一:source build/envsetup.sh与lunch
- Android 编译系统 - envsetup.sh
- Android 编译系统(二):envsetup.sh学习
- Android 编译系统(二):envsetup.sh学习
- Android 4.03 编译系统------envsetup.sh
- Android 编译系统理解:envsetup.sh学习
- Android 编译系统(二):envsetup.sh学习
- android编译系统分析(一)source build/envsetup.sh与lunch
- build/envsetup.sh简记Android
- Masonry+FDTemplateLayoutCell 实现Cell自动布局
- com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2929e5e9 -- APPARENT DEADLOCK!!!
- Hadoop:MapReduce模型
- 【数字信号处理】十大经典软件滤波算法
- Collection与Collections的区别
- Android编译系统详解(一)——build/envsetup.sh
- 十年一覺程設夢[完整版]
- const 指针与指向const的指针
- MPI和MapReduce对比
- 【codeforces】Uncowed Forces
- MongoDB从不懂到装懂其四(数据备份、恢复、导入、导出)
- <<More Effective C++>>读书笔记2: 运算符
- day2 HDU 2141 Can you find it?
- [李景山php]每天laravel-20160921|Redis Database.php