博观而约取,厚积而薄发。这篇文章主要讲述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-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种的内容为
【Android编译系统产品线】
# Launcher, Camera and Gallery ifeq ($(BOARD_USES_LAUNCHER3),true) PRODUCT_PACKAGES +=Launcher3 endif #系统要预装的一系列程序 PRODUCT_PACKAGES +=Gallery2 # Live Wallpapers PRODUCT_PACKAGES +=HoloSpiralWallpaperLiveWallpapersLiveWallpapersPickerMagicSmokeWallpapersVisualizationWallpaperslibrs_jni #用于重载系统属性 #格式:key=value #这些属性最终会被存储在设备的 #/system/build.prop文件中 PRODUCT_PROPERTY_OVERRIDES :=net.dns1=8.8.8.8net.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_contextsservice_contextsapp.teboardinit.tebluetooth.tedevice.tedomain.tedrmserver.tegpsd.temediaserver.tesystem_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 158BACK key 230SOFT_RIGHT key 60SOFT_RIGHT key 107ENDCALL key 62ENDCALL key 229MENU key 139MENU key 59MENU key 127SEARCH key 217SEARCH key 228POUND key 227STAR key 231CALL key 61CALL key 232DPAD_CENTER key 108DPAD_DOWN key 103DPAD_UP key 102HOME key 105DPAD_LEFT key 106DPAD_RIGHT key 115VOLUME_UP key 114VOLUME_DOWN key 116POWER key 212CAMERA key 353DPAD_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]深入理解findViewById原理
- Android开发- Intent和Broadcast Receiver
- Excel表格之“照相机”技巧的运用_Excel专区
- excel图文详细教程之成组填充多张表格_Excel专区
- Excel表格之自制“专业符号”工具栏_Excel专区
- Excel表格之创建分类下拉下文填充项_Excel专区
- Excel表格之自动调整字号图文详细教程_Excel专区
- Excel表格之不同分类的单元格与区域的设置_Excel专区
- Powerpoint图文详细教程之插入可以运算与排序的表格_PowerPoint专区