ROM系统定制

来源:互联网 发布:mc建筑装饰 知乎 编辑:程序博客网 时间:2024/05/16 07:02
android编译系统中,产品编译项相关配置文件都在device/<厂商名>/目录下。厂商的产品列表由AndroidProducts.mk文件定义,目标产品信息由<产品名>.mk定义,目标设备信息由BoardConfig.mk和AndroidBoard.mk定义。创建新产品的编译项就是创建上述几个mk文件的过程。
1. 创建厂商目录
不同手机厂商对应device/下不同目录,在厂商目录下放置该厂商的产品相关信息,我们厂商定义为mycompany
$mkdir device/mycompany
2. 在厂商目录下创建设备目录
定义设备名为myphone
$mkdir device/mycompany/myphone
3. 添加新产品编译项配置文件,该配置文件在执行 source build/envsetup.sh时,被加载执行
$vim device/mycompany/myphone/vendorsetup.sh
在vendorsetup.sh文件时,添加下面一条指令,用于向编译系统添加编译项,新添加的产品名为:myproduct,编译类型为 eng
add_lunch_combo myproduct-eng
4. 创建产品列表配置文件AndroidProduct.mk
AndroidProduct.mk文件用于定义当前厂商所拥有的所有产品列表, 每个产品都对应一个配置文件:
$vim device/mycompany/myphone/AndroidProduct.mk
在产品列表配置文件中添加如下内容:
PRODUCT_MAKEFILES:=\
$( LOCAL_DIR )/full_product.mk
PRODUCT_MAKEFILES变量用于保存所有产品配置信息列表, $( LOCAL_DIR )表示当前目录,full_product.mk表示某一款产品的配置文件。
5. 配置full_product.mk文件,定义产品的配置信息,添加如下信息:
include build/target/product/languages_full.mk
include build/target/product/full.mk
 
# Discard inherited values and use our owninstead.
PRODUCT_NAME := myproduct
PRODUCT_DEVICE := myphone
产品配置也可以和java中的类一样被继承,通过include命令可以将指定的文件包含进来,然后在后面可以对里面的内容进行重写。一般而言不同的产品产品名和设备名都不一样,在full_product.mk中对继承的full.mk中的产品名和设备名进行重写:PRODUCT_NAME为myproduct, PRODUCT_DEVICE为myphone。
在 full_product.mk 文件中继承的language_full.mk内容如下:
@build/target/product/languages_full.mk
PRODUCT_LOCALES := en_US fr_FR it_IT es_ES de_DEnl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TRpt_PT pt_BR rm_CH sv_SE bg_BG ca_ES en_GB fi_FI hr_HR hu_HU in_ID iw_IL lt_LTlv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH
该配置文件里表示的是当前产品系统里默认支持的本地语言,由上述配置信息可知,它基本包含了Android所支持的所有语言包。
@build/target/product/full.mk
PRODUCT_PACKAGES := \
    OpenWnn \
   PinyinIME \
    VoiceDialer\
   libWnnEngDic \
   libWnnJpnDic \
   libwnndict
 
# Additional settings used in all AOSP builds
PRODUCT_PROPERTY_OVERRIDES := \
    keyguard.no_require_sim=true \
    ro.com.android.dateformat=MM-dd-yyyy \
    ro.com.android.dataroaming=true \
    ro.ril.hsxpa=1 \
    ro.ril.gprsclass=10
 
PRODUCT_COPY_FILES := \
    development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \
    development/data/etc/vold.conf:system/etc/vold.conf
 
# Pick up some sounds - stick with the shortlist to save space
# on smaller devices.
$(call inherit-product,frameworks/base/data/sounds/OriginalAudio.mk)
 
# Get the TTS language packs
$(call inherit-product-if-exists,external/svox/pico/lang/all_pico_languages.mk)
 
# Get a list of languages. We use the small listto save space
# on smaller devices.
$(call inherit-product,build/target/product/languages_small.mk)
 
$(call inherit-product,build/target/product/generic.mk)
 
# Overrides
PRODUCT_NAME := full
PRODUCT_BRAND := generic
PRODUCT_DEVICE := generic
PRODUCT_MODEL := Full Android
继承的full.mk文件内容比骄傲多,主要有如下一下变量:
点击这里点击这里点击这里变量名作用使用方式PRODUCT_PACKAGES系统预置的模块列表,不仅仅只是Android应用程序,还可以包含库,可执行程序等直接将系统中要安装的模块名以空格隔开列出PRODUCT_PROPERTY_OVERRIDES系统设置的属性值将所有预设的属性以空格隔开列出,属性格式为:key-valuePRODUCT_COPY_FILES要拷贝的文件将文件列表拷贝到文件系统中,文件格式为:源文件:目标文件PRODUCT_NAME产品名该产品名要和编译项中产品名一致PRODUCT_BRAND产品品牌 PRODUCT_DEVICE产品对应的设备名该名字要和产品设备主板配置文件(BoardConfig.mk)所在目录名一致PRODUCT_MODEL  
总结:我们自己定义的full_product产品继承了build/target/product/目录下的full.mk和languages_full.mk,full.mk文件是Android系统定义的通用产品,languages_full.mk文件是全部语言包配置文件,这样,自己的产品full_product就具有了通用产品的特点并且支持全部语言包。
6. 定义目标产品对应的设备配置文件AndroidBoard.mk和BoardConfig.mk
同样可以继承使用通用设备配置文件:build/target/board/generic/目录下的AndroidBoard.mk和BoardConfig.mk文件
(1)创建AndroidBoard.mk(device/mycompany/myphone/AndroidBoard.mk)
$touch AndroidBoard.mk BoardConfig.mk
为AndroidBoard.mk文件中添加内容;
include build/target/generic/AndroidBoard.mk
继承的这个文件的内容如下(device/target/generic/AndroidBoard.mk):
LOCAL_PATH := $(call my-dir)
 
file := $(TARGET_OUT_KEYLAYOUT)/tuttle2.kl           # Linux内核按键码布局文件
ALL_PREBUILT += $(file)
$(file) : $(LOCAL_PATH)/tuttle2.kl | $(ACP)
          $(transform-prebuilt-to-target)
 
include $(CLEAR_VARS)
LOCAL_SRC_FILES := tuttle2.kcm            # Android按键码映射文件
include $(BUILD_KEY_CHAR_MAP)
这个文件里只是拷贝了按键映射文件和默认系统属性文件,我们可以直接将其内容拷贝到device/mycompany/myphone/AndroidBoard.mk中。
(2)创建BoardConfig.mk((device/mycompany/myphone/BoardConfig.mk))
为BoardConfig.mk文件中添加内容
include bulid/target/board/generic/BoardConfig.mk
继承的/BoardConfig.mk的内容如下:
# config.mk
#
# Product-specific compile-time definitions.
#
 
# The generic product target doesn't have anyhardware-specific pieces.
TARGET_NO_BOOTLOADER := true                  # 当前设备是否没有Bootloader
TARGET_NO_KERNEL := true                            # 当前设备是否没有Linux内核
TARGET_CPU_ABI := armeabi                           # 当前设备支持的目标架构
HAVE_HTC_AUDIO_DRIVER := true                   # 是否使用HTC的音频驱动
BOARD_USES_GENERIC_AUDIO := true          # 是否使用通用音频技术
 
# no hardware camera
USE_CAMERA_STUB := true                    # 是否使用摄像头Stub
通过BoardConfig.mk的信息可知,其实该文件就是定义了一些设备硬件相关的变量,这些变量用来剪裁系统的功能,决定android系统可运行的体系结构。
7. 根据需要定义产品默认属性和键值信息
android系统的属性服务类类似与windows的注册表,记录这系统的一些设置信息,我们可以在新产品中豫定义一些属性值来设置自己产品。在android编译系统中,属性都保存在xxx.prop文件中,在build/target/board/generic/sysem.prop中定义了默认的属性,我们可以在他的基础上进行修改。复制属性文件
$cp build/target/board/generic/system.prop device/mycompany/myphone/
在android系统中,底层使用linux内核来接收来自按键硬件上报的键值信息,上层处理用户按键的是android的框架,二者之间通过两个键值布局文件来进行键值的映射。
@Keylayout文件:按键布局文件,以kl后缀命名,该文件用来定义按键驱动里上报的键值号(数字)和linux内核中通过event事件上报的键值(字符)之间的映射关系。kl文件要放在/system/usr/keylayout/目录下或/data/usr/keychars/目录下。
@KeyCharMap文件:键值字符映射文件,以kcm后缀命名,它用来将linux内核上报来的键值(字符)进行转换,转换成android系统里可以识别的键盘码或组合按键。kcm文件要放在/system/usr/keychars/目录下或/data/usr/keychars/目录下。
上述两个按键映射文件使用按键驱动名作为其文件名,如果没有驱动名对应的布局文件,则使用/system/usr/keylayout/qwerty.kl和/system/usr/keychars/qwerty.kcm作为默认的按键映射文件。这两个文件名都通过AndroidBoard.mk文件负责拷贝和安装。
如果要使用模拟器作为目标设备,只需要将源码build/target/board/generic/目录里的tuttlole2.kl和tuttle2.kcm拷贝到AndroidBoard.mk所在的目录即可。
$cp bulid/target/board/generic/tuttle2.kl device/mycompany/myphone/tuttle2.kl
$cp build/target/board/generic/tuttle2.kcm device/mycoompany/myphone/tuttle2.kcm
如果想要自定义系统的物理按键与android系统的按键映射关系,则需要在tuttle2.kl和tuttle2.kcm的基础上进行修改,然后再修改AndroidBoard.mk的内容:
$cp bulid/target/board/generic/tuttle2.kl device/mycompany/myphone/<按键驱动名>.kl
$cp build/target/board/generic/tuttle2.kcm device/mycoompany/myphone/<按键驱动名>.kcm
修改device/mycompany/myphone/AndroidBoard.mk文件:
LOCAL_PATH := $(call my-dir)
 
file := $(TARGET_OUT_KEYLAYOUT)/<按键驱动名>.kl           # Linux内核按键码布局文件
ALL_PREBUILT += $(file)
$(file) : $(LOCAL_PATH)/<按键驱动名>.kl | $(ACP)
          $(transform-prebuilt-to-target)
 
include $(CLEAR_VARS)
LOCAL_SRC_FILES := <按键驱动名>.kcm                  #  Android按键码映射文件
include $(BUILD_KEY_CHAR_MAP)
注意:kcm文件最终被编译系统的key_char_map.mk编译成xxx.kcm.bin的二进制形式,这是因为每个android应用程序都要加载该按键映射文件,为了加快读取速度刻意而为之的。
创建新产品编译项时创建的目录与文件结构如下:
device/mycompany/ #厂商目录
|--- vendorsetup.sh #添加编译项命令文件
|--- myphone/ #设备名目录
|--- AndroidBoard.mk #设备属性和键值映射配置文件
|--- AndroidProducts.mk #产品列表文件
|--- BoardConfig.mk #设备硬件配置及目标架构配置文件
|--- full_product.mk #目标产品配置文件
|--- system.prop #系统默认属性配置文件
|--- tuttle2.kcm #Android系统键值映射文件
|--- tuttle2.kl #linux内核按键布局文件
默认上述目录和文件创建没有问题了,执行android编译步骤: source build/envsetup.sh lunch 选择 myproduct-eng编译项
如果看到如下信息,则我们的产品配置成功:
————————————————————————————————————
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.6
TARGET_PRODUCT=myproduct
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=false
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRK39F
————————————————————————————————————



0 0
原创粉丝点击