首页 > 代码库 > Android编译系统产品线

Android编译系统产品线

1.Android源码中的产品线解析

通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品。这就引入了产品线的概念。Android系统源码中,产品相关的文件通常保存在 device/company/product目录下其目录的组织结构为

技术分享

在tiny4412 android 5.0中如下图所示:

技术分享

 (1)vendorsetup.sh中的内容如下

#调用add_lunch_combo函数将full_tiny4412-userdebug#和full_tiny4412-eng添加到系统相关变量中,后续#lunch提供的菜单就是根据这些变量产生的#envsetup.sh末尾通过一个for循环来扫描工程中#所有可用的vendorsetup.sh并执行它们#默认会扫面/vendor和/device目录add_lunch_combo full_tiny4412-userdebugadd_lunch_combo full_tiny4412-eng

(2)AndroidProducts.mk中内容为

#当运行了lunch函数选择了编译的产品后#编译系统会在产品所在的目录下寻找#AndroidProducts.mk文件,这里记录#着该产品的一些具体的属性,但是#通常我们在这个文件中做一个转向PRODUCT_MAKEFILES :=     $(LOCAL_DIR)/aosp_tiny4412.mk     $(LOCAL_DIR)/full_tiny4412.mk

其中full_tiny4412.mk种的内容为

 

# Launcher, Camera and Galleryifeq ($(BOARD_USES_LAUNCHER3),true)PRODUCT_PACKAGES +=     Launcher3endif#系统要预装的一系列程序PRODUCT_PACKAGES +=     Gallery2# Live WallpapersPRODUCT_PACKAGES +=     HoloSpiralWallpaper     LiveWallpapers     LiveWallpapersPicker     MagicSmokeWallpapers     VisualizationWallpapers     librs_jni#用于重载系统属性#格式:key=value#这些属性最终会被存储在设备的#/system/build.prop文件中PRODUCT_PROPERTY_OVERRIDES :=     net.dns1=8.8.8.8     net.dns2=8.8.4.4# Inherit from those products. Most specific first.#继承 aosp_base_telephony.mk 和device/friendly-arm/tiny4412/device.mk#文件中的定义$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)$(call inherit-product, device/friendly-arm/tiny4412/device.mk)#覆盖继承上面两个文件定义的如下几个变量# Discard inherited values and use our own instead.#产品名称,最终会显示在系统设置中的#"关于设备的选项中"PRODUCT_NAME := full_tiny4412#设备名称PRODUCT_DEVICE := tiny4412产品生产商PRODUCT_MANUFACTURER := FriendlyARM (www.arm9.net)#产品所属品牌PRODUCT_BRAND := Android#产品型号PRODUCT_MODEL := Full Android on TINY4412

 

(3)BoardConfig.mk文件解析

# BoardConfig.mk## Product-specific compile-time definitions.## Use the non-open-source parts, if theyre present-include vendor/friendly-arm/tiny4412/BoardConfigVendor.mk#引入BoardConfigCommon.mk# Use the parts that are common between all Exynos4412sinclude device/friendly-arm/tiny4412/BoardConfigCommon.mk#用来配置SELINUX,SELINUX是android上面的一种安全机制#我们可以通过配置SELINUX的相关policy,来定制自己的手#机的一些权限,比如,我们可以完全让root用户没有任何的#权限和user一样#配置SELINUX,需要linux内核首先是支持selinux的,#另外需要android的selinux的配置文件sepolicy里面的内容#然后就是修改BoardConfig.mk#首先会包含厂商定制的sepolicy的文件夹:BOARD_SEPOLICY_DIRS#然后将规则添加到了sepolicy中:BOARD_SEPOLICY_DIRSBOARD_SEPOLICY_DIRS :=     device/friendly-arm/tiny4412/sepolicy#配置SELINUXBOARD_SEPOLICY_UNION :=     file_contexts     service_contexts     app.te     boardinit.te     bluetooth.te     device.te     domain.te     drmserver.te     gpsd.te     mediaserver.te     system_server.te

接下来分析引入的BoardConfigCommon.mk

# BoardConfigCommon.mk## Product-specific compile-time definitions.#芯片平台TARGET_BOARD_PLATFORM := exynos4#芯片类型TARGET_SOC := exynos4x12#CPU配置选项# CPU optionsTARGET_CPU_ABI := armeabi-v7aTARGET_CPU_ABI2 := armeabiTARGET_CPU_SMP := trueTARGET_ARCH := armTARGET_ARCH_VARIANT := armv7-a-neonTARGET_ARCH_VARIANT_CPU := cortex-a9TARGET_CPU_VARIANT := cortex-a9ARCH_ARM_HAVE_NEON := trueARCH_ARM_HAVE_TLS_REGISTER := trueTARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfpTARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfpTARGET_NO_BOOTLOADER := trueTARGET_NO_KERNEL := trueTARGET_NO_RADIOIMAGE := trueTARGET_BOOTLOADER_BOARD_NAME := tiny4412TARGET_PROVIDES_INIT_RC := trueTARGET_PROVIDES_INIT_TARGET_RC := true# Exynos4 supportEXYNOS4X12_ENHANCEMENTS := trueEXYNOS4_ENHANCEMENTS := trueifeq ($(EXYNOS4X12_ENHANCEMENTS),true)COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS=1COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS=1endif# LauncherBOARD_USES_LAUNCHER3 := true# AudioBOARD_USES_GENERIC_AUDIO := falseBOARD_USES_I2S_AUDIO := trueBOARD_USES_PCM_AUDIO := falseBOARD_USES_SPDIF_AUDIO := false# ULP, ALP BOARD_USE_ULP_AUDIO := falseBOARD_USE_ALP_AUDIO := true#背光配置# BacklightBOARD_USES_PWMLIGHTS := false#蓝牙配置# BluetoothBOARD_HAVE_BLUETOOTH := trueBOARD_HAVE_BLUETOOTH_CSR := trueBOARD_HAVE_BLUETOOTH_BCM := falseBOARD_HAVE_SAMSUNG_BLUETOOTH := falseBOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/friendly-arm/tiny4412/bluetooth#Wi-Fi配置# Connectivity - Wi-FiWPA_SUPPLICANT_VERSION := VER_0_8_XBOARD_WPA_SUPPLICANT_DRIVER := WEXTBOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_fawextBOARD_WLAN_DEVICE := fawext#文件系统配置# FilesystemTARGET_USERIMAGES_USE_EXT4 := trueBOARD_SYSTEMIMAGE_PARTITION_SIZE   := 629145600  # 600MBBOARD_USERDATAIMAGE_PARTITION_SIZE := 830472192  # 792MBBOARD_CACHEIMAGE_PARTITION_SIZE    := 536870912  # 512MBBOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4BOARD_FLASH_BLOCK_SIZE := 4096#图形配置# GraphicsBOARD_USES_HGL := trueBOARD_EGL_CFG := device/friendly-arm/tiny4412/conf/egl.cfgUSE_OPENGL_RENDERER := trueIGN_EGL_BUFFERCOUNT := trueNUM_FRAMEBUFFER_SURFACE_BUFFERS := 3SCREEN_WIDTH := 800SCREEN_HEIGHT := 1280DEFAULT_FB_NUM := 2# FIMG AccelerationBOARD_USES_FIMGAPI := trueBOARD_USES_SKIA_FIMGAPI := trueBOARD_USES_SKIAHWJPEG := trueCOMMON_GLOBAL_CFLAGS += -DSEC_HWJPEG_G2D -DFORCE_SCREENSHOT_CPU_PATH# HWComposerBOARD_USES_HWCOMPOSER := trueBOARD_USE_SYSFS_VSYNC_NOTIFICATION := true# TVOut & HDMI# BOARD_USE_SECTVOUT := true# BOARD_USES_SKTEXTBOX := trueBOARD_USES_HDMI_SUBTITLES := falseBOARD_USES_HDMI := trueBOARD_HDMI_STD := STD_1080PBOARD_HDMI_DDC_CH := DDC_CH_I2C_7BOARD_HDMI_ROTATE := false#Camera配置# CameraBOARD_CAMERA_HAVE_ISO := trueCOMMON_GLOBAL_CFLAGS += -DHAVE_ISOCOMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARECOMMON_GLOBAL_CFLAGS += -DSAMSUNG_DVFSBOARD_USES_PROPRIETARY_LIBFIMC := true# SEC CameraUSE_SEC_CAMERA := falseCAMERA_USE_DIGITALZOOM := true# BOARD_USE_S5K3H2 := true#OMX配置# OMXBOARD_USE_SAMSUNG_COLORFORMAT := trueBOARD_NONBLOCK_MODE_PROCESS := trueBOARD_USE_STOREMETADATA := trueBOARD_USE_METADATABUFFERTYPE := trueBOARD_USE_S3D_SUPPORT := trueBOARD_USE_DRM := trueBOARD_USE_CSC_FIMC := falseBOARD_USES_MFC_FPS := trueBOARD_USES_FFMPEG := false#V4L2配置# V4L2 & IONBOARD_USE_V4L2 := falseBOARD_USE_V4L2_ION := falseBOARD_NO_OVERLAY := false#中兴无线模块配置# ZTE WIRELESS MODEMBOARD_HAVE_MODEM :=trueBOARD_MODEM_VENDOR :=ZTEBOARD_MODEM_ID :=MF210BOARD_MODEM_HAVE_DATA_DEVICE :=trueBOARD_WITH_CALL_FUNCTION:=false
(4)system.prop 
用来配置手机的属性
# system.prop for tiny4412#rild.libpath=/system/lib/libreference-ril.so#rild.libargs=-d /dev/ttyS1ro.sf.auto_lcd_density=yes# hdmi supportpersist.demo.hdmirotationlock=1# disable strict modepersist.sys.strictmode.disable=1# captive portal serverro.net.captive_server=112.124.9.243# WCDMA Preferredro.telephony.default_network=0telephony.lteOnCdmaDevice=0ro.product.locale.language=zhro.product.locale.region=CN# ro.use_data_netmgrd=true# persist.data_netmgrd_nint=8# ro.ril.def.agps.mode=0# keyguard.no_require_sim=true 
(5)tiny4412-key.kl文件
android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件
key 158   BACKkey 230   SOFT_RIGHTkey 60    SOFT_RIGHTkey 107   ENDCALLkey 62    ENDCALLkey 229   MENUkey 139   MENUkey 59    MENUkey 127   SEARCHkey 217   SEARCHkey 228   POUNDkey 227   STARkey 231   CALLkey 61    CALLkey 232   DPAD_CENTERkey 108   DPAD_DOWNkey 103   DPAD_UPkey 102   HOMEkey 105   DPAD_LEFTkey 106   DPAD_RIGHTkey 115   VOLUME_UPkey 114   VOLUME_DOWNkey 116   POWERkey 212   CAMERAkey 353   DPAD_CENTER

2.Android源码中添加产品线

(1)在device目录下添加一个以公司名命名的文件夹,然后再在这个文件夹下为各产品分别建立对应的子文件夹。和此产品相关的所有特定文件都应该优先放置在这里。

(2)在产品目录下建立一个vendorsetup.sh脚本通常为

add_lunch_combo full_xxx_userdebug(或eng)

使得产品可以正确的被添加到编译系统中

(3)在产品目录下添加AndroidProducts.mk文件,用来做产品具体属性配置文件的一个转向。例如

PRODUCT_MAKEFILES :=         $(LOCAL_DIR)/aosp_tiny4412.mk         $(LOCAL_DIR)/full_tiny4412.mk
(4)实现上一步跳转的文件,用来配置产品的一些具体的属性。可以充分利用编译系统已有的全局变量或者函数,来完成任何需要的功能。
例如,指定编译结束后需要复制到设备系统中的各种文件、设置系统属性(系统属性最终会写入到/system/build/prop文件中)等。
#将bcmdhd.cal复制到产品系统的system/etc/wifi目录下PRODUCT_COPY_FILES =+     device/samsung/toro/bcmdhd.cal:system/etc/wifi/bcmdhd.cal
变量描述
PRODUCT_NAME产品名称,最终会显示在系统设置中的"关于设备"选项中
PRODUCT_DEVICE设备名称
PRODUCT_BRAND产品所属品牌
PRODUCT_MANUFACTURER产品生产商
PRODUCT_MODULE产品型号
PRODUCT_PACKAGES产品需要预装的一系列程序,如APKs
PRODUCT_LOCALES所支持的国家语言。格式如下
[两个字节语言码]-[两个字节国家码]
如en_GB de_DE
各语言间以空格分隔
PRODUCT_POLICY本产品遵循的"策略",如
android.policy_phone
android.policy_mid
PRODUCT_TAGS一系列以空格分隔的产品描述标签
PRODUCT_PROPERTY_OVERRIDES用于重载系统属性
格式:key=value
示例:ro.product.firmware=v0.4rc1
这些属性最终会保存在设备系统/system/build.prop文件中
PRODUCT_COPY_FILES复制文件到设备系统的指定目录

 

(5)在产品目录下添加BoardConfig.mk,用于描述目标架构、硬件设备属性、编译器的条件标志、分区布局、boot地址、ramdisk大小等一系列参数
我们可以先复制一份(最好选择架构、主芯片相同的然后再根据产品的具体需求进行修改
(6添加Android.mk文件
LOCAL_PATH := $(call my-dir)# if some modules are built directly from this directory (not subdirectories),# their rules should be written here.include $(call all-makefiles-under,$(LOCAL_PATH)) 

 

Android编译系统产品线