首页 > 代码库 > 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 they‘re 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编译系统产品线
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。