#!/bin/bash export PATH=$(echo $PATH) #/////////////////////////////////////////////////////////////////# #////// 其他变量定义,全大写 //////# # 工作空间目录; WORK_DIR=$(pwd) # 日志文件; LOG_FILE=${WORK_DIR}/Target/build.log # 日期; CURR_TIME=$(date +"%Y-%m-%d %T") # Android目录; ANDROID_DIR=${WORK_DIR}"/kernel/android/R" # 配置文件; PROJECT_NAME="CASPER.cfg" # Dailybuild输出目录; RTK_DAILYBUILD_OUTPUT_PATH=${WORK_DIR}"/kernel/system/tmp/dailybuild_output" # Key目录; KEY_OPTION=${ANDROID_DIR}"/device/tv051/R3/Releasekeys" # 是否增量编译OTA包(Incremental Compilation OTA),只用于Arg_BuildMark=1时,即Dailybuild才需要; # 星期四:全量编译OTA; # 星期五:增量编译OTA; IC_OTA=false # SVN路径; SCBC_APPS_SVN_SRC_APK=https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk # 是否编译中间件; export TV_MIDWARE_MAKE=false # 是否安装RTK的APP,即RTK公版; export RTK_TV_APK_INSTALL=false # 是否开启远场语音; # export Argument_FarfieldVoice=true # 版本号; export SCBC_PRODUCT_VERSION="V8-T841AGL-LF1V001" BRAND="CASPER" PRODUCT="CASPER" # 松下品牌AudioLink要置为true,AudioConnectl置为false; # 非松下品牌则与上描述设置反过来; export AudioLink=false export AudioConnect=true export Channel_C=false #CASPER品牌要置为true; #/////////////////////////////////////////////////////////////////# # 获取参数个数使用: $# echo "外部参数个数="$# # 定义外部参数,命名要求:匈牙利命名,带前缀Arg_. # 每个参数意义,需要明确说明,请参照以下方式添加新参数; #/////////////////////////////////////////////////////////////////# # 外部参数定义: 字符串类型、布尔类型、数字类型; Arg_RedirectLog=true # 是否重定向log; Arg_CodeSync=true # 是否需要更新代码; Arg_BuildRelease='' # 编译的Img类型:2=Debug、1=Release(CTS\user); Arg_BuildOTA=false # 是否编译OTA包; Arg_VersionNum='' # 编译版本号; Arg_CleanBuild=false # 是否Clean编译; Arg_BrandName='' # 编译的品牌名称; Arg_FarfieldVoice=true # 是否开启远场语音; Arg_MakeTVMidware=false # 是否编译TVMidware Arg_InstallRTKAPK=false # 是否安装RTK APK,即RTK公版; Arg_BuildMark=0 # 编译类型:给一个编译标志,用于区分某些编译的不同,如1=Dailybuild, 0=普通编译; #/////////////////////////////////////////////////////////////////# # 解析外部参数; parseArgument() { echo "func=parseArgument" # 遍历参数; for arg in $* do if [[ $arg == *'='* ]];then # 获取参数值; key=${arg%%=*} val=${arg#*=} echo -e $arg "\t\t\t取等号左边值:"${key} "\t\t\t取等号右边值:"${val} # 新增外部参数时,请依次添加; if [ ${key} = 'Arg_RedirectLog' ];then Arg_RedirectLog=${val} fi if [ ${key} = 'Arg_BuildRelease' ];then Arg_BuildRelease=${val} fi if [ ${key} = 'Arg_BuildOTA' ];then Arg_BuildOTA=${val} fi if [ ${key} = 'Arg_VersionNum' ];then Arg_VersionNum=${val} fi if [ ${key} = 'Arg_CleanBuild' ];then Arg_CleanBuild=${val} fi if [ ${key} = 'Arg_BrandName' ];then Arg_BrandName=${val} fi if [ ${key} = 'Arg_FarfieldVoice' ];then Arg_FarfieldVoice=${val} fi if [ ${key} = 'Arg_MakeTVMidware' ];then Arg_MakeTVMidware=${val} fi if [ ${key} = 'Arg_InstallRTKAPK' ];then Arg_InstallRTKAPK=${val} fi if [ ${key} = 'Arg_BuildMark' ];then Arg_BuildMark=${val} fi fi done } # 用户手动选择参数进行编译; manualArgument() { echo "===================================================================================" echo "默认客户版本号:V8-T851MGL-LF1V001" echo "===================================================================================" echo "请输入版本号[Please type version]" read -p "[V8-T841AGL-LF1V001]" Arg_VersionNum echo "CTS or not?" read -p "[1-CTS 2-Debug ]" Arg_BuildRelease echo "Build OTA package or not?" read -p "[y/n]" Arg_BuildOTA echo "是否启用远场语音[n/y]?" read -p "[n/y]" Arg_FarfieldVoice echo "Clean or not?" read -p "[n/y]" Arg_CleanBuild echo "是否编译中间件" read -p "[n/y]" Arg_MakeTVMidware echo "是否编译RTK公版?" read -p "[n/y]" Arg_InstallRTKAPK read -p "编译标志位 [ 0-Normal(defualt) 1-Dailybuild ] " Arg_BuildMark } redirectLog() { if [ ${Arg_RedirectLog} = false ];then echo -e "\n未开启日志重定向功能,无build.log生成!\n" else rm -rf ${WORK_DIR}/Target if [ ! -d ${WORK_DIR}/Target ];then mkdir ${WORK_DIR}/Target fi # 重定向Log到文件中; exec 1>>${LOG_FILE} exec 2>>${LOG_FILE} fi } # 初始化参数; initArgument() { # 重定向日志; redirectLog echo "Start DateTime:${CURR_TIME}" # 用户不给版本号,设置默认值; if [ x$Arg_VersionNum = "x" ];then Arg_VersionNum=V8-T841AGL-LF1V001 fi # 远场语音设置:用户选择n不开启,否则不选或y都为开启; if [ x$Arg_FarfieldVoice = "xy" ]; then Arg_FarfieldVoice=true elif [ x$Arg_FarfieldVoice = "xn" ]; then Arg_FarfieldVoice=false elif [ x$Arg_FarfieldVoice = "x" ]; then Arg_FarfieldVoice=false fi # 用户不选择OTA编译,则默认为false; if [ x$Arg_BuildOTA = "xy" ]; then Arg_BuildOTA=true elif [ x$Arg_BuildOTA = "xn" ]; then Arg_BuildOTA=false elif [ x$Arg_BuildOTA = "x" ]; then Arg_BuildOTA=false fi # Clean编译:用户手动选择,则true,否则不选或n都为关闭; if [ x$Arg_CleanBuild = "xy" ]; then Arg_CleanBuild=true elif [ x$Arg_CleanBuild = "x" ];then Arg_CleanBuild=false elif [ x$Arg_CleanBuild = "xn" ];then Arg_CleanBuild=false fi # 编译类型:用户不选择则默认Debug; if [ x$Arg_BuildRelease = "xy" ]; then Arg_BuildRelease=1 elif [ x$Arg_BuildRelease = "xn" ]; then Arg_BuildRelease=2 elif [ x$Arg_BuildRelease = "x" ]; then Arg_BuildRelease=2 fi # 将字串小写比较; if [ x${Arg_BuildRelease,} = "xdebug" ]; then Arg_BuildRelease=2 fi if [ x${Arg_BuildRelease,} = "xrelease" ]; then Arg_BuildRelease=1 fi # 编译中间件,默认false; if [ x$Arg_MakeTVMidware = "xy" ]; then Arg_MakeTVMidware=true elif [ x$Arg_MakeTVMidware = "xn" ]; then Arg_MakeTVMidware=false elif [ x$Arg_MakeTVMidware = "x" ]; then Arg_MakeTVMidware=false fi # rtk公版; if [ x$Arg_InstallRTKAPK = "xy" ] || [ $Arg_InstallRTKAPK = true ] ; then Arg_InstallRTKAPK=true export AudioLink=true export AudioConnect=false export Channel_C=false # RTK公版不能编译中间件; Arg_MakeTVMidware=false elif [ x$Arg_InstallRTKAPK = "xn" ]; then Arg_InstallRTKAPK=false elif [ x$Arg_InstallRTKAPK = "x" ]; then Arg_InstallRTKAPK=false fi # Arg_BuildMark,无选或大于范围的值默认为Normal编译; if [ x$Arg_BuildMark = "x" ] || [ $Arg_BuildMark -gt 1 ]; then Arg_BuildMark=0 fi # Dailybuild专项处理; if [ $Arg_BuildMark = 1 ];then if [ $Arg_InstallRTKAPK = false ];then # Dailybuild Moka版本号 Arg_VersionNum=V8-T841AGL-000$(date +"%m%d") else # Dailybuild RTK公版版本号 Arg_VersionNum=V8-T841AGL-001$(date +"%m%d") fi fi #export TV_MIDWARE_MAKE=${Arg_MakeTVMidware} export SCBC_PRODUCT_VERSION=${Arg_VersionNum} export RTK_TV_APK_INSTALL=${Arg_InstallRTKAPK} # export Argument_FarfieldVoice=${Arg_FarfieldVoice} echo "===================================================================================" echo "SCBC_PRODUCT_VERSION: ${SCBC_PRODUCT_VERSION}" echo "AudioLink: ${AudioLink}" echo "AudioConnect: ${AudioConnect}" echo "Channel_C: ${Channel_C}" echo "RTK_TV_APK_INSTALL: ${Arg_InstallRTKAPK}" # echo "Arg_FarfieldVoice: ${Arg_FarfieldVoice}" echo "Arg_BuildOTA: ${Arg_BuildOTA}" echo "Arg_CleanBuild: ${Arg_CleanBuild}" echo "===================================================================================" echo "软件版本(version): ${Arg_VersionNum} " echo "CTS版本编译: ${Arg_BuildRelease} " echo "TV_MIDWARE_MAKE: ${Arg_MakeTVMidware} " echo "Arg_BuildMark: ${Arg_BuildMark} " echo "===================================================================================" } pre_build() { HEAD_VERSION=`svn info $SCBC_APPS_SVN_SRC_APK|grep Revision|cut -d' ' -f2` if [ -z "$HEAD_VERSION" ]; then echo "HEAD_VERSION is empty 退出编译" exit; fi cd ${WORK_DIR} ./kernel/android/R/device/tv051/R3/update_debug_apps.sh ./kernel/android/R/device/tv051/R3/save_apps_svn.sh } build_img() { rm -rf ${ANDROID_DIR}/signed-target_files.zip rm -rf ${ANDROID_DIR}/signed-ota_update.zip rm -rf ${WORK_DIR}/image_creator/*.img rm -rf ${WORK_DIR}/kernel/system/tmp/dailybuild_output if [ ${Arg_BuildRelease} -eq 1 ];then COMPILEMODE="user" else COMPILEMODE="userdebug" fi if [ ${Arg_CleanBuild} = true ];then make_img_clean else make_img_noclean fi } #报错退出 make_error_exit() { if [ "$(echo $?)" != "0" ]; then echo "There is a error , The compiler is fail !!!!" exit fi } #编译kernel make_kernel() { echo "Start make linux kernel" #./build_android.sh [-p project_name] [-c y/n] [-v Build_variant] [-d device_name] {-j job} {-k key_path} cd ${WORK_DIR}/kernel/system #./build_android.sh -p $PROJECT_NAME -c n -v $COMPILEMODE -j 12 -k $KEY_OPTION -V n make_error_exit echo "make linux kernel succeed" } #编译kernel and Android make_img_clean() { echo "make_img_clean" cd ${WORK_DIR}/kernel/system case $COMPILEMODE in user) ./build_android.sh -p $PROJECT_NAME -c y -v $COMPILEMODE -j 8 -k $KEY_OPTION -o y ;; *) if [ $Arg_BuildOTA = true ];then ./build_android.sh -p $PROJECT_NAME -c y -v $COMPILEMODE -j 8 -k $KEY_OPTION -o y else ./build_android.sh -p $PROJECT_NAME -c y -v $COMPILEMODE -j 8 -o y fi make_error_exit ;; esac cd ${WORK_DIR}/image_creator python create_rtk_image.py --profile=CASPER_allpackage.cfg --bootcode=y --outfile=install_wipe.img --clean_factory=n make_error_exit } #编译kernel and Android noclean make_img_noclean() { echo "make_img_noclean" cd ${WORK_DIR}/kernel/system #./build_android.sh [-p project_name] [-c y/n] [-v Build_variant] [-d device_name] {-j job} {-k key_path} #./build_android.sh -p CASPER.cfg -c n -v userdebug -j 8 case $COMPILEMODE in user) ./build_android.sh -p $PROJECT_NAME -c n -v $COMPILEMODE -j 8 -k $KEY_OPTION -o y make_error_exit ;; *) if [ $Arg_BuildOTA = true ];then ./build_android.sh -p $PROJECT_NAME -c n -v $COMPILEMODE -j 8 -k $KEY_OPTION -o y else ./build_android.sh -p $PROJECT_NAME -c n -v $COMPILEMODE -j 8 -o y fi make_error_exit ;; esac cd ${WORK_DIR}/image_creator python create_rtk_image.py --profile=CASPER_allpackage.cfg --bootcode=y --outfile=install_wipe.img --clean_factory=n make_error_exit } # 复制结果(同时需要处理OTA增量编译); copy_file() { if [ $Arg_BuildRelease -eq 1 ];then OutputDir="${Arg_VersionNum}"-CTS else OutputDir=${Arg_VersionNum} fi mkdir -p ${WORK_DIR}/Target/${OutputDir}/BOOT mkdir -p ${WORK_DIR}/Target/${OutputDir}/OTA mkdir -p ${WORK_DIR}/Target/${OutputDir}/USB mkdir -p ${WORK_DIR}/Target/${OutputDir}/WIPE mkdir -p ${WORK_DIR}/Target/${OutputDir}/Write mkdir -p ${WORK_DIR}/Target/${OutputDir}/Reports mkdir -p ${WORK_DIR}/Target/${OutputDir}/OTA/IncrementalOTA if [ $Arg_BuildRelease -eq 1 ];then cd ${WORK_DIR}/kernel/android/R/vendor/realtek/tool/image_file_creator cp install_user_2K_RTD28XOB8_A1_TV051_R3_2K.img ${WORK_DIR}/Target/${OutputDir}/USB/${OutputDir}.img md5sum ${WORK_DIR}/Target/${OutputDir}/USB/${OutputDir}.img > ${WORK_DIR}/Target/${OutputDir}/USB/MD5.txt cp -f ${ANDROID_DIR}/signed-target_files.zip ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-target_files.zip cp -f ${ANDROID_DIR}/signed-ota_update.zip ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-ota_update.zip md5sum ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-target_files.zip > ${WORK_DIR}/Target/${OutputDir}/OTA/MD5_target_files.txt md5sum ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-ota_update.zip > ${WORK_DIR}/Target/${OutputDir}/OTA/MD5_ota_update.zip.txt else cd ${WORK_DIR}/kernel/android/R/vendor/realtek/tool/image_file_creator cp install_userdebug_2K_RTD28XOB8_A1_TV051_R3_2K.img ${WORK_DIR}/Target/${OutputDir}/USB/${OutputDir}.img md5sum ${WORK_DIR}/Target/${OutputDir}/USB/${OutputDir}.img > ${WORK_DIR}/Target/${OutputDir}/USB/MD5.txt if [ $Arg_BuildOTA = true ];then cp -f ${ANDROID_DIR}/signed-target_files.zip ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-target_files.zip cp -f ${ANDROID_DIR}/signed-ota_update.zip ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-ota_update.zip md5sum ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-ota_update.zip > ${WORK_DIR}/Target/${OutputDir}/OTA/MD5_ota_update.zip.txt md5sum ${WORK_DIR}/Target/${OutputDir}/OTA/"${OutputDir}"-target_files.zip > ${WORK_DIR}/Target/${OutputDir}/OTA/MD5_target_files.txt fi fi cp -f ${ANDROID_DIR}/out/target/product/R3/system/build.prop ${WORK_DIR}/Target/${OutputDir}/USB/ cd ${WORK_DIR}/kernel/android/R/vendor/realtek/tool/image_file_creator cp install_wipe.img ${WORK_DIR}/Target/${OutputDir}/WIPE/"${OutputDir}"-wipe.img md5sum ${WORK_DIR}/Target/${OutputDir}/WIPE/*.img > ${WORK_DIR}/Target/${OutputDir}/WIPE/MD5_WIPE.txt cp -f ${WORK_DIR}//kernel/fw/bootcode/RTD28XOB8_A1_TV051_R3_2K/* ${WORK_DIR}/Target/${OutputDir}/BOOT/ md5sum ${WORK_DIR}/Target/${OutputDir}/BOOT/bootcode_for_rtice.bin > ${WORK_DIR}/Target/${OutputDir}/BOOT/MD5_bootcode_for_rtice.txt md5sum ${WORK_DIR}/Target/${OutputDir}/BOOT/bootloader.img > ${WORK_DIR}/Target/${OutputDir}/BOOT/MD5_bootloader_img.txt md5sum ${WORK_DIR}/Target/${OutputDir}/BOOT/bootloader.pkg > ${WORK_DIR}/Target/${OutputDir}/BOOT/MD5_bootloader_pkg.txt md5sum ${WORK_DIR}/Target/${OutputDir}/BOOT/dvrboot.exe.bin > ${WORK_DIR}/Target/${OutputDir}/BOOT/MD5_dvrboot.exe.txt md5sum ${WORK_DIR}/Target/${OutputDir}/BOOT/dvrboot.rescue.exe.bin> ${WORK_DIR}/Target/${OutputDir}/BOOT/MD5_dvrboot_rescue_exe.txt # 处理Dailybuild 增量编译; if [ $Arg_BuildMark -eq 1 ]; then # 获取周几:0~6 星期天~星期六 week=$(date +%w) # 周五:增量编译OTA,需要保存周四的全量包; if [ ${week} -eq 4 ]; then day=$(date +%m%d) echo "保存周四全量编译OTA包,用于周五增量编译OTA" # /home/exchange/Dailybuild/ 该目录必须存在且有权限; mkdir /home/exchange/Dailybuild/RTK2841A_OTA_$day/ cp -r ${WORK_DIR}/Target/${OutputDir}/OTA/*-target_files.zip /home/exchange/Dailybuild/RTK2841A_OTA_$day/ fi fi } # 保存apk; save_apk_svn() { cp ${ANDROID_DIR}/vendor/tv051/app/prebuilt_app/save_apk_svn ${WORK_DIR}/Target/${OutputDir}/Reports } # 保存版本号文件; save_version_number() { var_d=$(date '+%Y%m%d%H') version_number="${Arg_VersionNum}"_"$var_d" cd ${WORK_DIR} repo manifest -r -o ./$version_number.xml cp -r ${WORK_DIR}/$version_number.xml ${WORK_DIR}/Target/${OutputDir}/Reports/ rm ${WORK_DIR}/$version_number.xml } getold() { cd ${WORK_DIR}/OTA/old/ files=$(ls $path) A=".zip"; for filename1 in $files do if [[ $filename1 == *$A* ]] ; then echo "getold-ota"$filename1 break fi done } getnew() { cd ${WORK_DIR}/OTA/new/ files=$(ls $path) B=".zip"; for filename2 in $files do if [[ $filename2 == *$B* ]] ; then echo "getnew-ota="$filename2 break fi done } makeota_diff() { otaname="51M"_"$filename1"_"$filename2" cd ${ANDROID_DIR} ./build/tools/releasetools/ota_from_target_files --signapk_path ${ANDROID_DIR}/out/host/linux-x86/framework/signapk.jar --signapk_shared_library_path ${ANDROID_DIR}/out/host/linux-x86/lib64 -i ${WORK_DIR}/OTA/old/$filename1 ${WORK_DIR}/OTA/new/$filename2 ${WORK_DIR}/OTA/IncrementalOTA/$otaname.zip md5sum ${WORK_DIR}/OTA/IncrementalOTA/$otaname.zip > ${WORK_DIR}/OTA/IncrementalOTA/MD5_incrementalOTA.txt } make_incrementalOTA() { yesterday=$(date -d"-1 day" +%m%d ) cp -r /home/exchange/Dailybuild/RTK2841A_OTA_$yesterday/*-target_files.zip ${WORK_DIR}/OTA/old/ cp -r ${WORK_DIR}/Target/${OutputDir}/OTA/*-target_files.zip ${WORK_DIR}/OTA/new/ cd ${ANDROID_DIR} source build/envsetup.sh lunch NOKIA-userdebug getnew getold makeota_diff cp -r ${WORK_DIR}/OTA/IncrementalOTA/ ${WORK_DIR}/Target/${OutputDir}/OTA } EnableFarfieldVoice() { if [ ${Arg_FarfieldVoice} == true ]; then echo "开启远场语音" cd ${ANDROID_DIR}/device/tv051/R3/ findstr=' device\/tv051\/R3\/etc\/permissions\/privapp-permissions-rtk.xml:system_ext\/etc\/permissions\/privapp-permissions-rtk.xml \\' newline=' device/tv051/R3/etc/permissions/echo_reference.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/echo_reference.xml \\' sed -i "/^$findstr/a\\$newline" device.mk fi } commitMidware() { Arg_MakeTVMidware=false # 41A不需要编译中间件; if [ $Arg_MakeTVMidware = true ]; then cd "${ANDROID_DIR}"/vendor/tv051/app/prebuilt_app/TVMidwareManager || exit midware_revision=$(svn info --show-item last-changed-revision) cd "${ANDROID_DIR}"/vendor/tv051/app/prebuilt_app/tvmidware/ || exit readme_midware_revision=$(sed -n '/revision/p' readme.txt | awk -F '=' '{print $2}') if [ $midware_revision -gt $readme_midware_revision ]; then cp -f ${ANDROID_DIR}/out/target/product/R3/system_ext/framework/tv-midware-manager.jar ${ANDROID_DIR}/vendor/tv051/app/prebuilt_app/tvmidware/tv-midware-manager.jar cp -f ${ANDROID_DIR}/out/target/product/R3/system_ext/framework/oat/arm/tv-midware-manager.odex ${ANDROID_DIR}/vendor/tv051/app/prebuilt_app/tvmidware/oat/arm/tv-midware-manager.odex cp -f ${ANDROID_DIR}/out/target/product/R3/system_ext/framework/oat/arm/tv-midware-manager.vdex ${ANDROID_DIR}/vendor/tv051/app/prebuilt_app/tvmidware/oat/arm/tv-midware-manager.vdex cd "${ANDROID_DIR}"/vendor/tv051/app/prebuilt_app/tvmidware || exit sed -i "s/revision=$readme_midware_revision/revision=$midware_revision/" readme.txt svn add tv-midware-manager.jar svn add readme.txt svn add oat/ svn commit -m "dailybuild commit revision $midware_revision" fi cd "${ANDROID_DIR}"/vendor/tv051/app/prebuilt_app/ || exit rm -rf TVMidwareManager/ fi } setMakeFileBuildNumber() { cd "${ANDROID_DIR}"/build/make || exit git checkout -- core/Makefile # 0:11 - 取左边11个字符判断是否="V8-T851MGL-LF1V" if [ ${Arg_VersionNum:0:15} == 'V8-T851MGL-LF1V' ]; then BUILD_NUMBER=${Arg_VersionNum:0-3} #0-3:取最后3位; else BUILD_NUMBER='dailybuild'${Arg_VersionNum##*debug} fi echo ${BUILD_NUMBER} sed -i "s/BF_BUILD_NUMBER := 000/BF_BUILD_NUMBER := ${BUILD_NUMBER}/g" core/Makefile sed -i "s/BUILD_NUMBER_FROM_FILE:= 000/BUILD_NUMBER_FROM_FILE:= ${BUILD_NUMBER}/g" core/Makefile } compile() { setMakeFileBuildNumber pre_build build_img copy_file save_apk_svn save_version_number if [ $IC_OTA = true ];then make_incrementalOTA fi echo "$(date '+%Y-%m-%d %H:%S') compile finished" } main() { echo "Start main:${CURR_TIME}" # 如果外部参数>0,解析参数; if [ $# -gt 0 ]; then parseArgument $@ else manualArgument fi # 初始化参数; initArgument # 编译; compile } main $@