Android4.2添加自己的产品分支及video的拷贝方法

1、rk3168_v4.2\frameworks\base\data\videos下面的mp4的拷贝方法!

a、其实在我们的原始情况下这个目录的东西并没有拷贝到xxx/system/media/video下面,但是看到sounds目录却有拷贝为啥~

sounds目录下有个AllAudio.mk,这个文件是怎么调用的呢?

我在建产品分支的时候无意发现,加载其实很简单~

b、资料收集:

http://blog.csdn.net/gchww/article/details/7838947

http://blog.csdn.net/tdstds/article/details/25823641

http://blog.csdn.net/stevenliyong/article/details/5285334

http://lhc180.blog.51cto.com/316940/774227/

c、拷贝文件的两种方法(都在源码内测试):

第一种、Android.mk   

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := bootanimation
LOCAL_SRC_FILES := bootanimation.zip
LOCAL_MODULE_PATH := $(TARGET_OUT)/media
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX:= .zip
#LOCAL_MODULE_SUFFIX:= .txtfile
LOCAL_CERTIFICATE:= PRESIGNED
LOCAL_PRELINK_MODULE := false
include $(BUILD_PREBUILT)  


第二种   1、在Z:\Backup\rk3168_v4.2\build\target\product\full_base.mk中添加:

# Get some sounds
$(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk)

#add by hcm
#Get some videos
$(call inherit-product-if-exists, frameworks/base/data/videos/AllVideo.mk)

2、在Z:\Backup\rk3168_v4.2\frameworks\base\data\videos中新建:AllVideo.mk

$(call inherit-product, frameworks/base/data/videos/VideoPackage1.mk)
$(call inherit-product, frameworks/base/data/videos/VideoPackage2.mk)


分析流程包含在产品分支添加中:

1、当我们编译Android源码是执行下面两条看到如下信息: 

root@david-desktop:/home/hcm/Backup/rk3168_v4.2# . ./build/envsetup.sh 
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/armv7-a/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/rockchip/rk30sdk_bnd/vendorsetup.sh
including device/rockchip/rk30sdk_hcm/vendorsetup.sh

including device/rockchip/rk30sdk/vendorsetup.sh

including sdk/bash_completion/adb.bash

从上面的信息我们可以看出,配置环境变量,在envsetup.sh 最重要是去包含了vendorsetup.sh,

root@david-desktop:/home/hcm/Backup/rk3168_v4.2# lunch

You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_mips-eng
     5. mini_armv7a_neon-userdebug
     6. mini_armv7a-userdebug
     7. mini_mips-userdebug
     8. mini_x86-userdebug
     9. rk30sdk_bnd-eng
     10. rk30sdk_hcmx-eng
     11. rk30sdk-eng


Which would you like? [full-eng] 

我们看到lunch命令输出了一个Lunch菜单,该菜单列出了当前Android源码支持的所有设备型号及其编译类型。例如,第一项“full-eng”表示的设备“full”即为模拟器,并且编译类型为“eng”即为工程机


一、调用流程:envsetup.sh --------> including device/xxx/xxx/vendorsetup.sh

lunch ---------> check_product()->get_build_var()-> build/core/main.mk -> build/core/config.mk 

-> build/core/envsetup.mk -> build/core/product_config.mk

在build/core/product_config.mk 中编译系统首先调用 build/core/product.mk中定义的函数get-all-product-makefiles ,来遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProducts.mk, 再由 AndroidProducts.mk找到Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\rk30sdk_bnd.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/product_config.mk  中的#$(dump-products) 语句使控制台编译的时候输出所有product 的信息)  , 接着build/core/product_config.mk 会调用resolve-short-product-name 将TARGET_PRODUCT匹配的AndroidProducts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。

有了这个TARGET_DEVICE, 再回到 build/core/config.mk,

会include $(TARGET_DEVCIE)/BoardConfig.mk

board_config_mk := /
 $(strip $(wildcard /
  $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
  vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
 ))

 include $(board_config_mk) 

而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等

另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk

TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))

TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product

PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)

再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来

#
# Typical build; include any Android.mk files we can find.
#

subdir_makefiles := /
 $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)

include $(subdir_makefiles)

 

我们再来看其中的

./build/target/board/Android.mk

,对了它引用了

include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由上面TARGET_DEVICE_DIR的定义,这下又进入了

vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Product需要编译和安装app 和 script.

二、Android lunch调用关系

1.      调用流程图:

Android4.2添加自己的产品分支及video的拷贝方法_第1张图片

2.      调用关系分析

在编译Android产品的时候我们首先会导入. build/envsetup.sh ,然后lunch,这时候我们可以看到几个基本的产品版本。

从现象回推,首先查看envsetup.sh文件中的lunch函数:

具体分析见:lunch函数分析

在envsetup.sh中,有几个比较重要的函数。Lunch(),check_product(),print_lunch_menu(),get_build_var(),gettop,add_lunch_combo(),set_stuff_for_environment(),set_java_home(),findmakefile()。

1)  lunch

[plain]  view plain copy
  1. functionlunch()  
  2. {  
  3.     local answer  
  4.     if [ "$1" ] ; then  
  5.        # lunch后面直接带参数  
  6.         answer=$1  
  7.     else  
  8.        # lunch后面不带参数,则打印处所有的target product和variant菜单提供用户选择  
  9.         print_lunch_menu    
  10.         echo -n "Which would you like?[generic-eng] "  
  11.         read answer  
  12.     fi  
  13.     local selection=  
  14.     if [ -z "$answer" ]  
  15.     then  
  16.            # 如果用户在菜单中没有选择,直接回车,则为系统缺省的generic-eng  
  17.         selection=generic-eng  
  18.     elif [ "$answer" ="simulator" ]  
  19.     then  
  20.         # 如果是模拟器  
  21.         selection=simulator  
  22.     elif(echo -n $answer | grep -q -e "^[0-9][0-9]*{1}quot;)  
  23.     then  
  24.         # 如果answer是选择菜单的数字,则获取该数字对应的字符串  
  25.         if [ $answer -le${#LUNCH_MENU_CHOICES[@]} ]  
  26.         then  
  27.            selection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}  
  28.         fi  
  29.         # 如果 answer字符串匹配 *-*模式(*的开头不能为-)  
  30.     elif (echo -n $answer | grep -q -e"^[^\-][^\-]*-[^\-][^\-]*{1}quot;)  
  31.   
  32.     then  
  33.         selection=$answer  
  34.     fi  
  35.    
  36.     if [ -z "$selection" ]  
  37.     then  
  38.         echo  
  39.         echo "Invalid lunch combo:$answer"  
  40.         return 1  
  41.     fi  
  42.    
  43.     # special case the simulator  
  44.     if [ "$selection" ="simulator" ]  
  45.     then  
  46.         # 模拟器模式  
  47.         export TARGET_PRODUCT=sim  
  48.         export TARGET_BUILD_VARIANT=eng  
  49.         export TARGET_SIMULATOR=true  
  50.         export TARGET_BUILD_TYPE=debug  
  51.     else  
  52.    
  53.         # 将 product-variant模式种的product分离出来  
  54.         local product=$(echo -n $selection |sed -e "s/-.*$//")  
  55.    
  56.         # 检查product,调用关系 check_product()->get_build_var()->build/core/config.mk  
  57.         check_product $product  
  58.         if [ $? -ne 0 ]  
  59.         then  
  60.             echo  
  61.             echo "** Don't have a productspec for: '$product'"  
  62.             echo "** Do you have the rightrepo manifest?"  
  63.             product=  
  64.         fi  
  65.    
  66.         # 将 product-variant模式种的variant分离出来  
  67.         local variant=$(echo -n $selection | sed-e "s/^[^\-]*-//")  
  68.    
  69.         # 检查之,看看是否在 (user userdebug eng) 范围内  
  70.         check_variant $variant  
  71.         if [ $? -ne 0 ]  
  72.         then  
  73.             echo  
  74.             echo "** Invalid variant:'$variant'"  
  75.             echo "** Must be one of${VARIANT_CHOICES[@]}"  
  76.             variant=  
  77.         fi  
  78.    
  79.         if [ -z "$product" -o -z"$variant" ]  
  80.         then  
  81.             echo  
  82.             return 1  
  83.         fi  
  84.    
  85.         export TARGET_PRODUCT=$product  
  86.         export TARGET_BUILD_VARIANT=$variant  
  87.         export TARGET_SIMULATOR=false  
  88.         export TARGET_BUILD_TYPE=release  
  89.     fi # !simulator  
  90.    


2)  Check_product:

[plain]  view plain copy
  1. functioncheck_product()  
  2. {  
  3.     T=$(gettop)  
  4.     if [ ! "$T" ]; then  
  5.         echo "Couldn't locate the top ofthe tree.  Try setting TOP.">&2  
  6.         return  
  7.     fi  
  8.     CALLED_FROM_SETUP=trueBUILD_SYSTEM=build/core \  
  9.         TARGET_PRODUCT=$1 TARGET_BUILD_VARIANT=\  
  10.         TARGET_SIMULATOR= TARGET_BUILD_TYPE= \  
  11.         TARGET_BUILD_APPS= \  
  12.         get_build_varTARGET_DEVICE > /dev/null  
  13.     # hide successful answers, but allow theerrors to show  
  14. }  
检查指定的TARGET_PRODUCT是否允许,默认的有sim和generic。如果不允许,则输出错误信息,允许则不显示

3)  Print_lunch_menu()

[plain]  view plain copy
  1. functionprint_lunch_menu()  
  2. {  
  3.     local uname=$(uname)  
  4.     echo  
  5.     echo "You're building on" $uname  
  6.     echo  
  7.     echo "Lunch menu... pick acombo:"  
  8.    
  9.     local i=1  
  10. local choice  
  11. #循环查找LUNCH_MENU_CHOICES中的版本  
  12.     for choice in ${LUNCH_MENU_CHOICES[@]}  
  13.     do  
  14.         echo "     $i. $choice"  
  15.         i=$(($i+1))  
  16.     done  
  17.    
  18.     echo  
  19. }  
该函数负责打印已经定义的版本

4)  Get_build_var()

[plain]  view plain copy
  1. functionget_build_var()  
  2. {  
  3.     T=$(gettop)  
  4.     if [ ! "$T" ]; then  
  5.         echo "Couldn't locate the top ofthe tree.  Try setting TOP.">&2  
  6.         return  
  7.     fi  
  8.     CALLED_FROM_SETUP=trueBUILD_SYSTEM=build/core \  
  9.       make --no-print-directory -C"$T" -f build/core/config.mk dumpvar-$1  
  10. }  
列出make脚本中某变量的值,当前为build/core/config.mk

5)  Gettop()

[plain]  view plain copy
  1. function gettop  
  2. {  
  3.     local TOPFILE=build/core/envsetup.mk  
  4.     if [ -n "$TOP" -a -f"$TOP/$TOPFILE" ] ; then  
  5.         echo $TOP  
  6. # 如果TOP不为空,并且envsetup.mk存在,函数直接返回TOP对应路径  
  7.     else  
  8.  # 否则(指找不到envsetup.mk)如下处理  
  9.         if [ -f $TOPFILE ] ; then  
  10.             # The following circumlocution(repeated below as well) ensures  
  11.             # that we record the true directoryname and not one that is  
  12.             # faked up with symlink names.  
  13.             PWD= /bin/pwd  
  14.         else  
  15.             # We redirect cd to /dev/null incase it's aliased to  
  16.             # a command that prints somethingas a side-effect  
  17.             # (like pushd)  
  18.             local HERE=$PWD  
  19.             T=  
  20.             while [ \( ! \( -f $TOPFILE \) \)-a \( $PWD != "/" \) ]; do  
  21.                 cd .. > /dev/null  
  22.                 T=`PWD= /bin/pwd`  
  23.             done  
  24.             cd $HERE > /dev/null  
  25.             if [ -f "$T/$TOPFILE" ];then  
  26.                 echo $T  
  27.             fi  
  28.         fi  
  29.     fi  
  30. }  
返回当前android代码树的顶层路径。前提是当前路径位于android代码树中

6)  Add_lunch_combo()

[plain]  view plain copy
  1. functionadd_lunch_combo()  
  2. {  
  3.     local new_combo=$1  
  4.     local c  
  5.     for c in ${LUNCH_MENU_CHOICES[@]} ; do  
  6.         if [ "$new_combo" ="$c" ] ; then  
  7.             return  
  8.         fi  
  9.     done  
  10.    LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)  
  11. }  
向环境变量LUNCH_MENU_CHOICES标识的列表中添加项

7)  Set_stuff_for_environment()

[plain]  view plain copy
  1. functionset_stuff_for_environment()  
  2. {  
  3.     settitle  
  4.     set_java_home  
  5.     setpaths  
  6.     set_sequence_number  
  7.   
  8.     export ANDROID_BUILD_TOP=$(gettop)  
  9. }  
设置android编译需要的环境变量

8)  Set_java_home

[plain]  view plain copy
  1. functionset_java_home() {  
  2.     if [ ! "$JAVA_HOME" ]; then  
  3.         case `uname -s` in  
  4.             Darwin)  
  5.                 exportJAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home  
  6.                 ;;  
  7.             *)  
  8.                 exportJAVA_HOME=/usr/lib/jvm/java-6-sun  
  9.                 ;;  
  10.         esac  
  11.     fi  
  12. }  
设置java运行环境

9)  findmakefile

[plain]  view plain copy
  1. functionfindmakefile()  
  2. {  
  3.     TOPFILE=build/core/envsetup.mk  
  4.     # We redirect cd to /dev/null in case it's aliased to  
  5.     # a command that prints something as a side-effect  
  6.     # (like pushd)  
  7.     local HERE=$PWD  
  8.     T=  
  9.     while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD !="/" \) ]; do  
  10.         T=$PWD  
  11.         if [ -f "$T/Android.mk" ];then  
  12.             echo$T/Android.mk  
  13.             # 如果找到Android.mk,echo出来的全路径将作为函数的返回值赋给某个变量  
  14.             cd $HERE> /dev/null  
  15.             return  
  16.         fi  
  17.         cd .. > /dev/null  
  18.     done  
  19.     cd $HERE > /dev/null  
  20. }  
此外还有一段比较重要的代码

[plain]  view plain copy
  1. # Execute thecontents of any vendorsetup.sh files we can find.  
  2. for f in`/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh device/*/*/vendorsetup.sh2> /dev/null`  
  3. do  
  4.     echo "including $f"  
  5.     . $f  
  6. done  
  7. unset f  

这段代码寻找vendor,build,device指定目录下的vendorsetup.sh。在vendorsetup.sh中定义了各版本的产品。

三、通过上面分析我们如果要定制自己的lunch分支主要是添加自己的平台到Z:\source\rk3168_v4.2\device\芯片厂商名\芯片名

1、具体修改文件:由于执行. ./build/envsetup.sh找到vendorsetup.sh,在其中加入自己的平台版本号!

add_lunch_combo rk30sdk_bnd-eng

2、lunch---->, AndroidProducts.mk---->Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\rk30sdk_bnd.mk

rk30sdk_bnd.mk的关键部分

include device/rockchip/rk30sdk_bnd/BoardConfig.mk  

#或者为$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
$(call inherit-product, device/rockchip/rk30sdk_bnd/device.mk)(或者将full_base.mk包含在其中
full_base.mk此文件主要指定对系统语言,APP编译配置文件,sounds的拷贝的mk文件!

PRODUCT_BRAND := rk30sdk_bnd
PRODUCT_DEVICE := rk30sdk_bnd //指定Z:\source\rk3168_v4.2\out\target\product\rk30sdk_bnd目录名

//指定Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd目录名

PRODUCT_NAME := rk30sdk_bnd //目标设备名
PRODUCT_MODEL := rk30sdk_bnd
PRODUCT_MANUFACTURER := rockchip

3、至于其他的根据你要引用的变量来决定如:Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\BoardConfig.mk 中

include device/rockchip/$(TARGET_PRODUCT)/wifi_bt.mk的$(TARGET_PRODUCT)就和PRODUCT_NAME有关,因为要知道准确路径!

4、注解:

Z:\source\rk3168_v4.2\device\rockchip\rk30sdk_bnd\BoardConfig.mk中

//MAX-SIZE=512M, for generate out/.../system.img 对system.img的大小进行了限制
BOARD_SYSTEMIMAGE_PARTITION_SIZE ?= 671088640
BOARD_FLASH_BLOCK_SIZE ?= 131072




你可能感兴趣的:(源码,video,frameworks,Android4.2.2)