一般產品廠商在拿到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
# 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
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
(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
#將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 | 複製文件到設備系統的指定目錄 |
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))