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-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種的內容為
# 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文件解析
# 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腳本通常為
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))