通过《Lichee(二) 在sun4i_crane平台下的编译》介绍了编译lichee的基本情况,我们最终得到了编译后的结果如下:
out/
├── android
│   ├── bImage
│   ├── lib
│   ├── toolchain
│   ├── uImage
│   └── zImage
└── u-boot.bin

小贴士:
    几种linux内核文件的区别:

1、vmlinux  编译出来的最原始的内核文件,未压缩。

2、zImage   是vmlinux经过gzip压缩后的文件。

3、bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。

4、uImage   U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。

5、vmlinuz  是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。

6、initrd   是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态


我们可以清晰的看到,我们已经有了u-boot.bin uImage 已经lib目录下的modules,我们现在唯一缺少的就是根文件系统rootfs了,我们知道主流的cubieboard一开始可以使用主流的Linux操作系统各种发行版本,比如Ubuntu、Debian、Fedora、OpenSUSE、ArchLinux等等,详情请看《cubieboard开发板简介》一文,所以说,Lichee自动化编译的过程其实也包含了rootfs的编译,只是我们是基于Android的sun4i_crane平台的讨论,在《Lichee(二) 在sun4i_crane平台下的编译》一文中故意没有展开,首先本文还是沿着Lichee这条主线去探讨与Lichee相关的Android编译的过程,详细的Android编译的原理将在以后讨论!
让我们先看一下只有4句话的编译命令
source build/envsetup.sh
lunch 9
extract-bsp
make -j8
  • 一、 创建目标产品目录
   通常情况下,我们将自己的产品目录创建在device目录下,在较早的Android版本中,有时候将自己的目标产品放在vendor目录下,因为 Android有一套完备的方法和脚本让我们仅仅修改目标产品目录的文件,就可以对系统进行配置,这里的内容非常多,后面的文章我们将详细地一一分析,这里仅仅提到与编译相关的地方
device/
├── common
├── generic
├── google
├── sample
├── samsung
├── softwinner
└── ti
device目录下有各种平台的子目录,softwinner即代表全志的系列 common顾名思义即代表通用地
这里假定我们的产品名叫做mt7332,我们可以在device/softwinner中创建一个名为crane-mt7332的目录
device/softwinner/
├── common
├── crane-3g
├── crane-common
├── crane-m1003h6
├── crane-MID9742-sc3052
└── crane-mt7332 这就是我们自己创建的
首先,我们必须要创建一个名为 vendorsetup.sh的脚本文件,因为每个目标产品目录都有这个文件,这个脚本中只有一句话
add_lunch_combo crane_mt7332-eng
add_lunch_combo 是build/envsetup.sh中的一个脚本函数,可以理解为把你自己创建的目标产品注册到Android系统中去,否则将无法编译到目标产品
crane_mt7332-eng 就是对自己的目标产品的命名,eng是VARIANT其中的一种,代表编译的是工程机的类型,为了让Android系统指导你的目标机是eng、user、userdebug,这个名字必须是xxx-eng xxx-user xxx-userdebug等这种格式来命名,crane代表的是全志A10中的Android的项目

小贴士:
VARIANT 的官方解释
eng This is the default flavor. A plain make is the same as make eng.
*       Installs modules tagged with: eng, debug, user, and/or development.
*       Installs non-APK modules that have no tags specified.
*       Installs APKs according to the product definition files, in addition to tagged APKs.
*       ro.secure=0
*       ro.debuggable=1
*       ro.kernel.android.checkjni=1
*       adb is enabled by default.
*       Setupwizard is optional

user make user
This is the flavor intended to be the final release bits.
*       Installs modules tagged with user.
*       Installs non-APK modules that have no tags specified.
*       Installs APKs according to the product definition files; tags are ignored for APK modules.
*       ro.secure=1
*       ro.debuggable=0
*       adb is disabled by default.
*       Enable dex pre-optimization for all TARGET projects in default to speed up device first boot-up

userdebug make userdebug
The same as user, except:
*       Also installs modules tagged with debug.
*       ro.debuggable=1
*       adb is enabled by default.

  • 二、指定目标产品(target product)
source build/envsetup.sh
lunch

小贴士:
source的含义

source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。build/envsetup.sh脚本的工作最主要就是要设置环境变量,所以必须带source

编译Android之前,我们往往要执行这2条命令,让我们选择目标产品。这2条命令看似简单,其实蕴含着极大的智慧。它可以让Android独立于不同的架构、不同的处理器、不同的屏幕尺寸和朝向、不同的外设驱动等等,始终就是一套代码,所以编译Android之前必须要选择究竟编译的是哪一款目标产品。
build/envsetup.sh与编译有关的大致有以下function
function add_lunch_combo()            # 添加lunch项目
function print_lunch_menu()              # 打印lunch列表
function lunch()                    # 配置lunch,选择目标产品
function m()                   # Android根目录编译, 必须在lunch之后才能使用,用的较少,因为在根目录下编译一般使用make
function findmakefile()              # 查找makefile
function mm()                  # 编译当前目录下的Android.mk, 必须在lunch之后才能使用,用法示例 cd packages/apps/Music && mm
function mmm()                 # 编译指定目录下Android.mk, 必须在lunch之后才能使用 mmm packages/apps/Music 等用于 cd packages/apps/Music && mm
我们着重探讨一下lunch()
function lunch()
{local answer#如果你明确地知道lunch后的结果可以直接lunch $1  $1代表目标产品的编号 比如我通常就是使用lunch 9if [ "$1" ] ; thenanswer=$1else# 如果不知道是第几个,就调用print_lunch_menu,打印出所有的目标产品,然后read你的输入print_lunch_menuecho -n "Which would you like? [full-eng] "read answerfilocal selection=if [ -z "$answer" ]thenselection=full-eng#如果lunch后有输入,只接受前2个字符的数字,忽略后面的字符elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") thenif [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]thenselection=${LUNCH_MENU_CHOICES[$(($answer-1))]}fi
# 正则表达式 ^[^\-][^\-]*-[^\-][^\-]*$ 表示 字符串中间只能有一个字符'-' 例如 a-b符合条件, 而-a-b , a-b- a--b这些都不符合条件elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")thenselection=$answerfi#选择是无效字符if [ -z "$selection" ]thenechoecho "Invalid lunch combo: $answer"return 1fiexport TARGET_BUILD_APPS=# sed -e "s/-.*$//") 是将字符'-'后面的都去掉,剩下前面的内容, 示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了crane_mt7332local product=$(echo -n $selection | sed -e "s/-.*$//")check_product $productif [ $? -ne 0 ]thenechoecho "** Don't have a product spec for: '$product'"echo "** Do you have the right repo manifest?"product=fi# sed -e "s/^[^\-]*-// 表示将字符 '-'之前的内容都去掉,只剩下后面的编译版本,示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了englocal variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")check_variant $variantif [ $? -ne 0 ]thenechoecho "** Invalid variant: '$variant'"echo "** Must be one of ${VARIANT_CHOICES[@]}"variant=fiif [ -z "$product" -o -z "$variant" ]thenechoreturn 1fi# 将获取的目标产品,VARIANT和类型写入到环境变量export TARGET_PRODUCT=$productexport TARGET_BUILD_VARIANT=$variantexport TARGET_BUILD_TYPE=releaseechoset_stuff_for_environmentprintconfig
}
目标产品的选择就此完成

实际过程如下:

$ source build/envsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/tuna/vendorsetup.sh
including device/softwinner/common/vendorsetup.sh
including device/softwinner/crane-3g/vendorsetup.sh
including device/softwinner/crane-m1003h6/vendorsetup.sh
including device/softwinner/crane-MID9742-sc3052/vendorsetup.sh
including device/softwinner/crane-mt7332/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
$ lunch
You're building on Linux
Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_maguro-userdebug
     5. full_tuna-userdebug
     6. crane_3g-eng
     7. crane_m1003h6-eng
     8. crane_MID9742_sc3052-userdebug
     9. crane_mt7332-eng
     10. full_panda-eng
Which would you like? [full-eng] 9
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=crane_mt7332
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76D
============================================
  • 三、 extract-bsp

extract-bsp是一个脚本函数,在device/softwinner/common/vendorsetup.sh 他也是在lunch的时候被执行的,也就是说如果先不执行lunch ,extract-bsp是无效的

让我们来看看extract-bsp

function lunch()
{local answer#如果你明确地知道lunch后的结果可以直接lunch $1  $1代表目标产品的编号 比如我通常就是使用lunch 9if [ "$1" ] ; thenanswer=$1else# 如果不知道是第几个,就调用print_lunch_menu,打印出所有的目标产品,然后read你的输入print_lunch_menuecho -n "Which would you like? [full-eng] "read answerfilocal selection=if [ -z "$answer" ]thenselection=full-eng#如果lunch后有输入,只接受前2个字符的数字,忽略后面的字符elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") thenif [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ]thenselection=${LUNCH_MENU_CHOICES[$(($answer-1))]}fi
# 正则表达式 ^[^\-][^\-]*-[^\-][^\-]*$ 表示 字符串中间只能有一个字符'-' 例如 a-b符合条件, 而-a-b , a-b- a--b这些都不符合条件elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$")thenselection=$answerfi#选择是无效字符if [ -z "$selection" ]thenechoecho "Invalid lunch combo: $answer"return 1fiexport TARGET_BUILD_APPS=# sed -e "s/-.*$//") 是将字符'-'后面的都去掉,剩下前面的内容, 示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了crane_mt7332local product=$(echo -n $selection | sed -e "s/-.*$//")check_product $productif [ $? -ne 0 ]thenechoecho "** Don't have a product spec for: '$product'"echo "** Do you have the right repo manifest?"product=fi# sed -e "s/^[^\-]*-// 表示将字符 '-'之前的内容都去掉,只剩下后面的编译版本,示例:crane_mt7332-eng 通过 sed -e "s/-.*$//"后,变成了englocal variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")check_variant $variantif [ $? -ne 0 ]thenechoecho "** Invalid variant: '$variant'"echo "** Must be one of ${VARIANT_CHOICES[@]}"variant=fiif [ -z "$product" -o -z "$variant" ]thenechoreturn 1fi# 将获取的目标产品,VARIANT和类型写入到环境变量export TARGET_PRODUCT=$productexport TARGET_BUILD_VARIANT=$variantexport TARGET_BUILD_TYPE=releaseechoset_stuff_for_environmentprintconfig
}

总的来说,经行分析extract-bsp脚本发现,其实就是将lichee编译的结果输出到device/softwinner/vendor目录下,其实这个过程是为了android的编译在做准备。而Android的编译过程非常复杂,因为我们是要沿着Lichee这条主线继续走下去,但是不对Android的编译过程以及目标产品的概念进行简单地分析,又不能充分了解到function extract-bsp()这个函数的用处,实际上本文的真正用意就是要了解extract-bsp的过程和背景,这个函数也是联系Lichee和Android之间的纽带。本文在这个系列中第一次提到了Android BSP相关的知识,可能理解起来就有点困难了,Android的BSP是后面的重中之重,到时候可能还会花大力气分析本文已经提到的一些内容(比如目标目录的创建),这里也就简单带过了。

Lichee(三) Android4.0的目标产品目录与Lichee的纽带---extract-bsp相关推荐

  1. Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp

    由<Lichee() 在sun4i_crane平台下的编译>介绍了编译lichee的基本情况,我们终于得到了编译后的结果例如以下: out/ ├── android │   ├── bIm ...

  2. Android4.0源码目录结构详解

    Android4.0源码目录结构详解 Android4.0与2.1目录差不多 alsa这块,注意external/tinyalsa下有: include/tinyalsa/asoundlib.h mi ...

  3. 有没有安卓4.0的java模拟器_电脑端安装Android4.0模拟器使用教程

    如今说到什么智能手机最火,那很多人肯定会说android系统的手机.如果你还没有Android手机,又想买一部试试,可是价格都不便宜,买来不适合自己怎么办?那么可以先在电脑上安装一个Android模拟 ...

  4. android 4.0电脑,电脑端安装Android4.0系统使用教程

    如今说到什么智能手机最火,那很多人肯定会说android系统的手机.如果你还没有Android手机,又想买一部试试,可是价格都不便宜,买来不适合自己怎么办?那么可以先在电脑上安装一个Android模拟 ...

  5. android4.0.3源码之硬件gps简单移植

    [转]我和菜鸟一起学android4.0.3源码之硬件gps简单移植 2013-7-5阅读94 评论0 关于android定位方式 android 定位一般有四种方法,这四种方式分别是GPS定位.WI ...

  6. Android4.2.2源码目录结构分析

    撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897277#t17 导读: 关于的Android目录分析,网上有很多资料,在此不 ...

  7. ubuntu编译android4.0

    其实,android 4.0发布之后的几天就想编译出来体验一下ICS,事情多得一直拖到今天,另外一些误导人的传闻越来越凶,说什么编译环境最低要求memory为16G. 今天就拿实验室的机器跑了一通,编 ...

  8. Android4.0源码编译方法以及错误解决方案

    from:http://blog.csdn.net/wanjun8659/article/details/8095664 历时一个星期,终于将android4.0源码编译成功,中间经历了各种曲折,非常 ...

  9. A10+Android4.0 音频驱动

    A10+Android4.0 音频驱动 linux-3.0目录 make ARCH=arm menuconfig 进到内核配置界面,可以看到   知道我们的配置项名字,然后进 目录 :\lichee\ ...

最新文章

  1. 第五届合肥工业大学宣城校区程序设计大赛题解
  2. C++实现 找出10000以内的完数
  3. Starting MySQL.... ERROR! The server quit without updating PID file
  4. 手把手带你搭建redis集群
  5. 集体智慧编程 - 优化
  6. Qt——P10 自定义的信号和槽
  7. 绿色版Tomcat的配置
  8. 自动量程万用表的实现原理_万用表的工作原理是怎样的?看完终于懂了
  9. Win7 64位系统下Auto CAD 2010注册激活,出现警告:Make sure you can write to current directory...
  10. AI语音交互机器人,揭秘你不知道的隐藏功能
  11. 用js屏蔽脚本加载的广告
  12. 《Linux就该这么学》培训笔记_ch00_认识Linux系统和红帽认证
  13. java 分析内存_Java 内存查看与分析
  14. SQL数据库常用约束及建表、插入数据时注意事项
  15. 【干货收藏】 IGBT 的国产替代
  16. PuTTY的使用技巧 (转)
  17. 广和通5G模组FM150-AE在Win11下的短信和通话演示
  18. 【总结】云集各大高校 — 数学建模经验分享(万字总结)
  19. 总结html上有什么会影响搜索引擎seo(更新1.1)
  20. 教你一招,能解决90%的机房问题

热门文章

  1. 【目标检测 论文精读】……YOLO-V2 YOLO9000 ……(YOLO9000: Better, Faster, Stronger)
  2. 【转】ASCII码十进制、十六进制对照表
  3. 表示条件:10 x 100或x 0的c语言表达式是,西安培华学院c语言期未考试A.doc
  4. 项目>点餐系统 总结概述
  5. android自动化测试案例全过程详解,Robot Framework+adb实现Android设备自动化测试案例①——项目介绍...
  6. 全国首个海洋大数据交易服务平台交易额破百万
  7. 2020-07-04
  8. 如何用计算机制作探测器,自制自制金属探测器
  9. 紧随小米2:LG Optimus G也用高通四核APQ8064
  10. APK安装失败:[INSTALL_FAILED_VERIFICATION_FAILURE]