Android编译系统

原文:http://www.cnblogs.com/angeldevil/archive/2013/05/19/3086610.htmlAndroid编译系统一、Android编译步骤:  二、初始化编译环境--source build/envsetup.sh  在build/envsetup.sh中主要完成了三件事。    添加编译目标的代码如下:复制代码for f in `/bin/ls vendor*/vendorsetup.sh devicevendorsetup.sh 2> /dev/null`do echo "including $f" . $fdoneunset f复制代码三、选择编译目标--lunch  通过lunch选择编译目标,函数定义如下:复制代码function lunch(){ local answer    //如果调用lunch时带参数就表示手动指定编译目标,否则打印选择编译目标的菜单 if [ "$1" ] ; then answer=$1 else print_lunch_menu echo -n "Which would you like? [full-eng] " read answer fi local selection=  //如果没有编译目标默认为full-eng,否则如果answer是数字就将其转换为对应的字符串表示 if [ -z "$answer" ] then selection=full-eng elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] then selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} fi elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer fi  //如果表示编译目标的字符串是空的表示非法选择,错误返回 if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi export TARGET_BUILD_APPS= //检测选择的product是否合法(只要在相应目录新建vendorsetup.sh并add_lunch_combo就可在lunch menu中显示相应项,但如果不配置product相关信息就会Invalid)  local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi  //从selection解析出product,variant local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant if [ $? -ne 0 ] then echo echo "** Invalid variant: '$variant'" echo "** Must be one of ${VARIANT_CHOICES[@]}" variant= fi if [ -z "$product" -o -z "$variant" ] then echo return 1 fi  //导出TARGET_PRODECT,TARGET_BUILD_VARIANT与TARGET_BUILD_TYPE,比如若选择的是full-eng,那么TARGET_PRODUCT=full,TARGET_BUILD_VARIANT=eng export TARGET_PRODUCT=$product export TARGET_BUILD_VARIANT=$variant export TARGET_BUILD_TYPE=release echo set_stuff_for_environment printconfig}复制代码四、编译--make -j8  要make肯定有Makefile,Android根目录的Makefile只是简单地include进来了一个文件:1 ### DO NOT EDIT THIS FILE ### 2 include build/core/main.mk 3 ### DO NOT EDIT THIS FILE ###   而build/core/main.mk就比较复杂了,以下是main.mk的结构图:  在main.mk中首先定义了默认编译目标并做版本检查,然后include config.mk。  在config.mk中定义了在Android.mk中编译目标时会用到的常量复制代码CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mkBUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mkBUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mkBUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mkBUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mkBUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mkBUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mkBUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mkBUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mkBUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mkBUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mkBUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk复制代码  然后include进来了/build/core/envsetup.sh,在envsetup.sh中定义了HOST_OS,OUT_DIR 等环境变量,并通过include product_config.mk检索所有Product,并做有效性检查,然后根据lunch时选择的Product设置 TARGET_DEVICE。  然后在envsetup.sh中根据TARGET_DEVICE查找BoardConfig.mk文件进行Board相关配置,查找KERNEL_HEADER,配置编译工具链。  在definitions.mk中定义了all_makefiles_under等用来检索文件的函数。  根据TARGET_BUILD_VARIANT设置ro.secure等系统属性,设定tags_to_install等变量。  接下来通过subdir_makefiles := \ $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk) include $(subdir_makefiles)  找到所有子目录下的Android.mk文件并include进来,这样在Android.mk定义的LOCAL_PACKAGE_NAME与 include $(BUILD_PACKAGE)就可以将相应的Android.mk中定义的目标包含进编译模块中,在config.mk中有如下定义:BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk  而package.mk又包含base_rules.mk将LOCAL_MODULE添加到ALL_MODULES中。  post_clean.mk是跟Resource Overlay相关,使们们不需要修改framework中原来的资源文件就可以定义framework-res.apk中的资源。  接下来include build/core/Makefile文件,定义bootimage,systemimage等依赖目标,然后通过make编译droid(默认)目标就可以编译系统了。  Android采用检索所有子目录中的Android.mk将所有要编译的模块收集起来的方式编译系统,而不是进入到每个子目录执行make,这样就方便了我们添加自己的模块。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用 JavaScript 编写的杀死幽灵游戏(附源代码) 杀死鬼魂游戏是使用 Vanilla JavaScript、CSS 和 HTML 画布开发的简单项目。这款游戏很有趣。玩家必须触摸/杀死游荡的鬼魂才能得分。您必须将鼠标悬停在鬼魂上 - 尽量得分。鬼魂在眨眼间不断从一个地方移动到另一个地方。您必须在 1 分钟内尽可能多地杀死鬼魂。 游戏制作 这个游戏项目只是用 HTML 画布、CSS 和 JavaScript 编写的。说到这个游戏的特点,用户必须触摸/杀死游荡的幽灵才能得分。游戏会根据你杀死的幽灵数量来记录你的总分。你必须将鼠标悬停在幽灵上——尽量得分。你必须在 1 分钟内尽可能多地杀死幽灵。游戏还会显示最高排名分数,如果你成功击败它,该分数会在游戏结束屏幕上更新。 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值