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=
COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS=
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 := # 600MB
BOARD_USERDATAIMAGE_PARTITION_SIZE := # 792MB
BOARD_CACHEIMAGE_PARTITION_SIZE := # 512MB
BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_FLASH_BLOCK_SIZE :=
#图形配置
# 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 :=
SCREEN_WIDTH :=
SCREEN_HEIGHT :=
DEFAULT_FB_NUM :=
# 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=
# disable strict mode
persist.sys.strictmode.disable=
# captive portal server
ro.net.captive_server=112.124.9.243
# WCDMA Preferred
ro.telephony.default_network=
telephony.lteOnCdmaDevice=
ro.product.locale.language=zh
ro.product.locale.region=CN
# ro.use_data_netmgrd=true
# persist.data_netmgrd_nint=
# ro.ril.def.agps.mode=
# keyguard.no_require_sim=true
(5)tiny4412-key.kl文件
android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件
key    BACK
key SOFT_RIGHT
key SOFT_RIGHT
key ENDCALL
key ENDCALL
key MENU
key MENU
key MENU
key SEARCH
key SEARCH
key POUND
key STAR
key CALL
key CALL
key DPAD_CENTER
key DPAD_DOWN
key DPAD_UP
key HOME
key DPAD_LEFT
key DPAD_RIGHT
key VOLUME_UP
key VOLUME_DOWN
key POWER
key CAMERA
key 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编译系统产品线的更多相关文章

  1. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  2. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  3. 【转】Android编译系统详解(三)——编译流程详解

    原文网址:http://www.cloudchou.com/android/post-276.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 1.概述 编译Androi ...

  4. Android编译系统(Android.mk文件详解)

    [Android-NDK(Native Development Kit)  docs文档] NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成a ...

  5. Android 编译系统的组成

    Android 和 Linux 的编译系统都是通过 Makefile 工具来组织编译源代码的. Makefile 工具用来解释和执行 Makefile 文件,在 Makefile 文件里定义好工程源代 ...

  6. Android编译系统入门(一)

    做过Android平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的 ...

  7. Android编译系统简要介绍【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/18466779 在Android源码环境中,我们开发好一个模块后,再写一个Androi ...

  8. 上海游侠电动汽车团队招募。iOS,Android,产品经理以及 SEVER 端工程师 - V2EX

    上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师 - V2EX 上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师

  9. ESRI ArcGIS 产品线资源网站大集合

    友情提示:国外网站国内访问速度较慢,可以配合VPN等进行加速访问. 首先给出官方网站,以下所有链接均可在官方找到. http://www.esri.com 紧接着是产品线: http://www.es ...

随机推荐

  1. 在java中public void与public static void区别

    static 方法可以被main方法直接调用,而非static方法不可以.因为static方法是属于类的,是类方法.可以通过类名.方法名直接调用.而非static方法必须等对象被new出来以后才能使用 ...

  2. ps常用键

    @updata 2016-7-31 切图 界面设置 视图 --显示 ---智能参考线       72 标尺  ctrl + r 窗口  ----信息 字符  历史记录 颜色 选RGB   信息图选项 ...

  3. js获取当前url的参数

    可以用正则表达式获取当前url参数,例如: var t={ getQueryString:function(name){ var reg = new RegExp("(^|&)&qu ...

  4. phalcon: 开启模板缓存和缓存路径

    /** * 设置view */ $di->set('view', function () use ($config) { $view = new \Phalcon\Mvc\View(); $vi ...

  5. unity监测按下键的键值并输出+unity键值

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  6. 双十字路口交通仿真程序(VS2010+MFC)

    这个程序是我上研二上学期时下一届师弟师妹们的面向对象课程大作业,当时我正好看过两三本 C++ 书籍,虽然忙着项目,但还是忙里偷闲检验了下自己.从设计到实现,耗时一周左右,完成于 2013 年年底. 虽 ...

  7. BW 转换字符空格问题

    早上忙了我一早上,以前写的一个季度判断的问题, 首先是调试,不断的调试DTP.让我头晕眼花. 首先关于空格问题,我自我批评,愚蠢的定义成STRING 类型,然后相互加减出现问题.应该定义成内部的日期格 ...

  8. Linux-Crontab服务

    1.安装并检查Crontab服务 检查cron服务: 检查Crontab工具是否安装:crontab -l 检查crond服务是否启动:service crond status 安装cron: yum ...

  9. uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)

    用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...

  10. The Great Mixing

    Sasha and Kolya decided to get drunk with Coke, again. This time they have k types of Coke. i-th typ ...