Android編譯系統產品線

1.Android源碼中的產品線解析

一般產品廠商在拿到Android源碼後會在Android源碼基礎上進行定製修改,以匹配適應本身的產品。這就引入了產品線的概念。Android系統源碼中,產品相關的文件一般保存在 device/company/product目錄下其目錄的組織結構爲linux

在tiny4412 android 5.0中以下圖所示:android

 (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-userdebug
add_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種的內容爲app

 

# Launcher, Camera and Gallery
ifeq ($(BOARD_USES_LAUNCHER3),true)
PRODUCT_PACKAGES += \
    Launcher3
endif
#系統要預裝的一系列程序
PRODUCT_PACKAGES += \
    Gallery2
# Live Wallpapers
PRODUCT_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文件解析dom

# 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 Exynos4412s
include 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_DIRS
BOARD_SEPOLICY_DIRS := \
    device/friendly-arm/tiny4412/sepolicy
#配置SELINUX
BOARD_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 options
TARGET_CPU_ABI := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_CPU_SMP := true
TARGET_ARCH := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_ARCH_VARIANT_CPU := cortex-a9
TARGET_CPU_VARIANT := cortex-a9
ARCH_ARM_HAVE_NEON := true
ARCH_ARM_HAVE_TLS_REGISTER := true
TARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_NO_RADIOIMAGE := true
TARGET_BOOTLOADER_BOARD_NAME := tiny4412
TARGET_PROVIDES_INIT_RC := true
TARGET_PROVIDES_INIT_TARGET_RC := true
# Exynos4 support
EXYNOS4X12_ENHANCEMENTS := true
EXYNOS4_ENHANCEMENTS := true
ifeq ($(EXYNOS4X12_ENHANCEMENTS),true)
COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS=1
COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS=1
endif
# Launcher
BOARD_USES_LAUNCHER3 := true
# Audio
BOARD_USES_GENERIC_AUDIO := false
BOARD_USES_I2S_AUDIO := true
BOARD_USES_PCM_AUDIO := false
BOARD_USES_SPDIF_AUDIO := false
# ULP, ALP 
BOARD_USE_ULP_AUDIO := false
BOARD_USE_ALP_AUDIO := true
#背光配置
# Backlight
BOARD_USES_PWMLIGHTS := false
#藍牙配置
# Bluetooth
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_CSR := true
BOARD_HAVE_BLUETOOTH_BCM := false
BOARD_HAVE_SAMSUNG_BLUETOOTH := false
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/friendly-arm/tiny4412/bluetooth
#Wi-Fi配置
# Connectivity - Wi-Fi
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_fawext
BOARD_WLAN_DEVICE := fawext
#文件系統配置
# Filesystem
TARGET_USERIMAGES_USE_EXT4 := true
BOARD_SYSTEMIMAGE_PARTITION_SIZE   := 629145600  # 600MB
BOARD_USERDATAIMAGE_PARTITION_SIZE := 830472192  # 792MB
BOARD_CACHEIMAGE_PARTITION_SIZE    := 536870912  # 512MB
BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_FLASH_BLOCK_SIZE := 4096
#圖形配置
# Graphics
BOARD_USES_HGL := true
BOARD_EGL_CFG := device/friendly-arm/tiny4412/conf/egl.cfg
USE_OPENGL_RENDERER := true
IGN_EGL_BUFFERCOUNT := true
NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
SCREEN_WIDTH := 800
SCREEN_HEIGHT := 1280
DEFAULT_FB_NUM := 2
# FIMG Acceleration
BOARD_USES_FIMGAPI := true
BOARD_USES_SKIA_FIMGAPI := true
BOARD_USES_SKIAHWJPEG := true
COMMON_GLOBAL_CFLAGS += -DSEC_HWJPEG_G2D -DFORCE_SCREENSHOT_CPU_PATH
# HWComposer
BOARD_USES_HWCOMPOSER := true
BOARD_USE_SYSFS_VSYNC_NOTIFICATION := true
# TVOut & HDMI
# BOARD_USE_SECTVOUT := true
# BOARD_USES_SKTEXTBOX := true
BOARD_USES_HDMI_SUBTITLES := false
BOARD_USES_HDMI := true
BOARD_HDMI_STD := STD_1080P
BOARD_HDMI_DDC_CH := DDC_CH_I2C_7
BOARD_HDMI_ROTATE := false
#Camera配置
# Camera
BOARD_CAMERA_HAVE_ISO := true
COMMON_GLOBAL_CFLAGS += -DHAVE_ISO
COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARE
COMMON_GLOBAL_CFLAGS += -DSAMSUNG_DVFS
BOARD_USES_PROPRIETARY_LIBFIMC := true
# SEC Camera
USE_SEC_CAMERA := false
CAMERA_USE_DIGITALZOOM := true
# BOARD_USE_S5K3H2 := true
#OMX配置
# OMX
BOARD_USE_SAMSUNG_COLORFORMAT := true
BOARD_NONBLOCK_MODE_PROCESS := true
BOARD_USE_STOREMETADATA := true
BOARD_USE_METADATABUFFERTYPE := true
BOARD_USE_S3D_SUPPORT := true
BOARD_USE_DRM := true
BOARD_USE_CSC_FIMC := false
BOARD_USES_MFC_FPS := true
BOARD_USES_FFMPEG := false
#V4L2配置
# V4L2 & ION
BOARD_USE_V4L2 := false
BOARD_USE_V4L2_ION := false
BOARD_NO_OVERLAY := false
#中興無線模塊配置
# ZTE WIRELESS MODEM
BOARD_HAVE_MODEM :=true
BOARD_MODEM_VENDOR :=ZTE
BOARD_MODEM_ID :=MF210
BOARD_MODEM_HAVE_DATA_DEVICE :=true
BOARD_WITH_CALL_FUNCTION:=false
(4)system.prop 
用來配置手機的屬性
# system.prop for tiny4412
#rild.libpath=/system/lib/libreference-ril.so
#rild.libargs=-d /dev/ttyS1
ro.sf.auto_lcd_density=yes
# hdmi support
persist.demo.hdmirotationlock=1
# disable strict mode
persist.sys.strictmode.disable=1
# captive portal server
ro.net.captive_server=112.124.9.243
# WCDMA Preferred
ro.telephony.default_network=0
telephony.lteOnCdmaDevice=0
ro.product.locale.language=zh
ro.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   BACK
key 230   SOFT_RIGHT
key 60    SOFT_RIGHT
key 107   ENDCALL
key 62    ENDCALL
key 229   MENU
key 139   MENU
key 59    MENU
key 127   SEARCH
key 217   SEARCH
key 228   POUND
key 227   STAR
key 231   CALL
key 61    CALL
key 232   DPAD_CENTER
key 108   DPAD_DOWN
key 103   DPAD_UP
key 102   HOME
key 105   DPAD_LEFT
key 106   DPAD_RIGHT
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 116   POWER
key 212   CAMERA
key 353   DPAD_CENTER

2.Android源碼中添加產品線

(1)在device目錄下添加一個以公司名命名的文件夾,而後再在這個文件夾下爲各產品分別創建對應的子文件夾。和此產品相關的全部特定文件都應該優先放置在這裏。佈局

(2)在產品目錄下創建一個vendorsetup.sh腳本一般爲ui

add_lunch_combo full_xxx_userdebug(或eng)

使得產品能夠正確的被添加到編譯系統中this

(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)) 
相關文章
相關標籤/搜索