Android编译系统(一)
Android编译系统
介绍:
Android使用一个自定义的编译系统生成工具,程序,和文档。这篇文档提供了
Android编译系统一览和简单编译指令。
Android编译系统是基于make的,要求GNU Make的最新版本(注意Android使用GNU Make的高级特性,可能在GNU Make网站上还没有)。在编译之前,检查下你make版本,运行 make –v.如果你没有3.8及以上的版本,就需要升级你的make.
了解Android编译系统
了解makefile
一个makefile定义怎样编译程序。Makefile一般包含下列元素:
1.名字: 编译名称(LOCAL_MODULE := <build_name>)
2. 本地变量: 清除本地变量用CLEAR_VARS (include $(CLEAR_VARS)).
3. 文件:决定你的程序需要哪些文件:(LOCAL_SRC_FILES := main.c).
4. 标记:定义一些标记(LOCAL_MODULE_TAGS := eng development)
5. 库:
定义是否链接到其他库
(LOCAL_SHARED_LIBRARIES := cutils)
6. 模版文件:
包含让make工具生成特定目标的模版文件。(include $(BUILD_EXECUTABLE)).
下面的片断演示了一个典型的makefile
LOCAL_PATH := $(my-dir)include $(CLEAR_VARS)LOCAL_MODULE := <buil_name>LOCAL_SRC_FILES := main.cLOCAL_MODULE_TAGS := eng developmentLOCAL_SHARED_LIBRARIES := cutilsinclude $(BUILD_EXECUTABLE)(HOST_)EXECUTABLE, (HOST_)JAVA_LIBRARY, (HOST_)PREBUILT, (HOST_)SHARED_LIBRARY,
(HOST_)STATIC_LIBRARY, PACKAGE, JAVADOC, RAW_EXECUTABLE, RAW_STATIC_LIBRARY,
COPY_HEADERS, KEY_CHAR_MAP
上面的片断为了容易看清楚,人为地加上了换行符。
层
编译层次包含了下表描述的抽象层。
每一层都与一个或多个层相关联。例如,一个arch有多个board,每个board有多个device。
你可以在一个层中定义一个元素,以达到排除复制,简化维护的目的。
Layer
Example
Description
Product
myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk
产品层定义完整的移植产品的语法。
定义要编译哪些模块,怎么配置。基于区域或者基于特性,比如照相机,你可能要提供几个不同的版本。
Device
myDevice, myDevice_eu, myDevice_eu_lite
设备层代表设备的物理层。例如,北美设备可能包含QWERTY键盘,而在法国售卖的设备可能包含AZERTY键盘。外围设备一般与设备层连接。
Board
sardine, trout, goldfish
电路板层代表产品的原始图。可能还有外围设备连接到这一层。
Arch
arm (arm5te) (arm6), x86, 68k
体系层描述了在电路版上运行的处理器。
产品定义文件
产品定义文件定义产品专用变量。一个产品定义文件可以从别的产品定义文件继承,可以减少复制和简化维护。
在产品定义文件中维护的变量包括:
·
PRODUCT_DEVICE
·
LOCALES
·
BRANDING_PARTNER
·
PROPERTY_OVERRIDES
下面的片断演示了一个典型的产品定义文件:
//device/target/product/core.mkPRODUCT_PACKAGES := Home SettingsProvider ...//device/target/product/generic.mkPRODUCT_PACKAGES := Calendar Camera SyncProvider ...$(call inherit-product, target/product/core.mk)PRODUCT_NAME := generic//device/partner/google/products/core.mkPRODUCT_PACKAGES := Maps GoogleAppsProvider ...$(call inherit-product, target/product/core.mk)//device/partner/google/products/generic.mkPRODUCT_PACKAGES := Gmail GmailProvider ...$(call inherit-product, partner/google/products/core.mk)$(call inherit-product, target/product/generic.mk)PRODUCT_NAME := google_generic
编译Android平台
这一节描述了怎样编译Android默认的版本,一旦你顺利地编译了通用版本,你就可以开始为你的目标设备修改Android.
设备代码
下面两个选项,第一个产生更稳定的结果。
选项1:
创建buildspec.mk的本地版本。最容易的方法是进入你的设备目录,
执行下列指令:
% cp buildspec.mk.default buildspec.mk ; chmod u=rw buildspec.mk
默认的buildspec.mk.文件,所有的选项都是被注释的,为了建立个性化的配置环境,可以编辑buildspec.mk.
一旦你建立了你配置文件,你就能够通过执行make编译设备代码,在你第一次执行这个命令的时候,会花费很长时间,在双核机器上,考虑使用’-j2’(甚至’j4’)以加速编译。
% make -j2
选项2:
做一个通用的版本,
执行
source //device/envsetup.sh, 这个文件包含了必要的变量和函数定义,下面有描述:
% cd $TOP % . envsetup.sh % partner_setup generic
//select generic as the product % make -j4 PRODUCT-generic-user
你也可以用eng替换user, 生成一个调式版。
% make -j4 PRODUCT-generic-eng