소스 검색

APK自动编译脚本保存。

JeffWang 2 년 전
부모
커밋
f35c5f794e

+ 1 - 0
APK自动编译/app_svn_info_shell/app_svn_info.sh

@@ -0,0 +1 @@
+svn info $1

+ 1 - 0
APK自动编译/app_svn_info_shell/app_svn_log.sh

@@ -0,0 +1 @@
+svn log -r $1 $2

+ 113 - 0
APK自动编译/app_svn_info_shell/svn-debug2release.sh

@@ -0,0 +1,113 @@
+#!/bin/sh
+#svn log -r 6126 https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/Eshow
+#svn info https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/Eshow
+
+# 参数1:apk名称,源于源码路径,需要对带 _General 的删除后缀。
+APK_NAME=$1
+# 参数2:debug apk的svn版本号;
+APK_DEBUG_SVN_REVISION=$2
+# APK的Debug日志;
+APK_DEBUG_LOG=$3
+# Debug Apk 地址;
+APK_DEBUG_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/01debug/general'
+# Release Apk 地址;
+APK_RELEASE_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/02release/general'
+# Apk源码地址;
+APK_SRC_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src'
+# Debug Apk 路径;
+APK_DEBUG_DIR='/home/data/ApkAutoCompile/cacheAPK/general/Debug'
+# Release Apk 路径;
+APK_RELEASE_DIR='/home/data/ApkAutoCompile/cacheAPK/general/Release'
+
+
+function main()
+{
+    # 1、参数校验;
+    if [ "${APK_NAME}" == "" ]; then
+        echo "==> 错误:参数-APK名称为空"
+        return
+    fi
+
+    if [ "${APK_DEBUG_SVN_REVISION}" == "" ]; then
+        echo "==> 错误:参数-Debug Apk SVN版本号为空"
+        return
+    fi
+
+    if [ "${APK_DEBUG_SVN_REVISION}" -gt 0 ] 2>/dev/null; then
+        echo ""
+    else
+        echo "==> 错误:参数-Debug Apk SVN版本号不为数字"
+        return
+    fi
+
+    if [ "${APK_DEBUG_LOG}" == "" ]; then
+        echo "==> 错误:参数-Debug Apk Log日志为空"
+        return
+    fi
+
+    # 过滤掉APK名称中的 _General 后缀
+    # 注:此方法会过滤掉包含 _General 往后的所有字符,所以APK名称不能在中间包含 _General ;
+    APK_NAME=${APK_NAME%_General*}
+
+    echo "==> APK名称=${APK_NAME}, DebugApk SVN 版本号=${APK_DEBUG_SVN_REVISION}" 
+
+    # 生成目标变量;
+    DEBUG_APK_URL="${APK_DEBUG_URL}/${APK_NAME}"
+    RELEASE_APK_URL="${APK_RELEASE_URL}/${APK_NAME}"
+
+    LOG=`svn log -r ${APK_DEBUG_SVN_REVISION} ${DEBUG_APK_URL}`
+    if [ "${LOG}" == "" ];then
+        echo "==> 错误:log空"
+        return
+    fi
+
+    echo "=====================================================================================================>"
+    echo -e "nApk-DebugUrl=\t${DEBUG_APK_URL}\r\nApk-ReleaseUrl=\t${RELEASE_APK_URL}\r\nApk-Log=${LOG}"
+    echo "<====================================================================================================="
+
+     # 创建debug根目录;
+    if [ ! -d ${APK_DEBUG_DIR} ];then
+        mkdir ${APK_DEBUG_DIR}
+    fi
+    # 创建release根目录;
+    if [ ! -d ${APK_RELEASE_DIR} ];then
+        mkdir ${APK_RELEASE_DIR}
+    fi
+
+    echo "==> 导出Debug Apk"
+    DEBUG_APK_DIR="${APK_DEBUG_DIR}/${APK_NAME}"
+    if [ -d ${DEBUG_APK_DIR} ]; then
+        # 删除所有文件;
+        rm -rf ${DEBUG_APK_DIR}
+    fi
+
+    #重新export
+    svn 'export' ${DEBUG_APK_URL} ${DEBUG_APK_DIR}
+
+    echo "==> 检出Release Apk"
+    RELEASE_APK_DIR="${APK_RELEASE_DIR}/${APK_NAME}"
+    if [ -d ${RELEASE_APK_DIR} ]; then
+        # 删除所有文件;
+        rm -rf ${RELEASE_APK_DIR}
+    fi
+
+    # 重新checkout出来;
+    svn co ${RELEASE_APK_URL} ${RELEASE_APK_DIR}
+
+    # 将debug的apk复制到release目录中,再提交;
+    cp ${DEBUG_APK_DIR}/* ${RELEASE_APK_DIR}
+
+    # 是否复制成功
+    Status=`svn status ${RELEASE_APK_DIR}`
+    echo ${Status}
+    if [ "${Status}" == "" ];then
+        echo "==> 错误:Apk-Release目录下SVN无状态改变"
+        return
+    fi
+
+    # 提交修改;
+    svn add ${RELEASE_APK_DIR} 
+    svn commit -m ${APK_DEBUG_LOG} ${RELEASE_APK_DIR} 
+}
+
+main

+ 3 - 0
APK自动编译/app_svn_info_shell/test.sh

@@ -0,0 +1,3 @@
+#svn log -r 6126 https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/Eshow
+
+svn info https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/Eshow

+ 81 - 0
APK自动编译/builder.py

@@ -0,0 +1,81 @@
+# -*- coding:utf-8 -*-
+
+from sabuild.config_parser import *
+from sabuild.formater import *
+import sys,os
+import json
+
+ProjectCFG = "sabuild/data/projects.cfg"
+Project_LASTRev = 0;
+ProjectUpdate = 0;
+
+def getReleaseName(projectDir):
+    buildCfg = os.path.join(projectDir,"build.cfg")
+    saParser = SAPaser(buildCfg)
+    try:
+        releaseName = saParser.configParser.get("app","release")
+    except Exception:
+        releaseName = "assembleRelease"
+    return releaseName
+
+def getAPKSection(projectDir):
+    buildCfg = os.path.join(projectDir,"build.cfg")
+    saParser = SAPaser(buildCfg)
+    try:
+        apkSection = saParser.configParser.sections()
+    except Exception:
+        apkSection = "error"
+    return apkSection
+
+def checkProjectRev(projectDir, lastRevLine, lastDateLine):    
+    global Project_LASTRev,ProjectUpdate
+    lastRev = int(parseSVNLine(lastRevLine))
+    lastDate = parseSVNLine(lastDateLine)
+    print("checkProjectRev, params:",projectDir, lastRev, lastDate)
+    if projectDir.endswith("/"):
+        projectDir = os.path.dirname(projectDir)
+    projectName = os.path.basename(projectDir)
+    print("checkProjectRev,projectName:",projectName)
+    fileUtil = FileUtil()
+    jsonStr = fileUtil.readStr(ProjectCFG)
+    strDict = json.loads(jsonStr,encoding="utf8")
+    # print("checkProjectRev,strDict:",strDict)
+    projectDict = strDict["allProjectDict"]
+    if projectName in projectDict:
+        Project_LASTRev = projectDict[projectName]["svn_lastChangedRev"]
+    print("checkProjectRev,Project_LASTRev",Project_LASTRev,"::lastRev:",lastRev)
+    if lastRev > Project_LASTRev:
+        ProjectUpdate = 1
+        print("checkProjectRev,ProjectUpdate",ProjectUpdate)
+
+def updateProjectRev(projectDir, lastRevLine, lastDateLine):
+    lastRev = int(parseSVNLine(lastRevLine))
+    lastDate = parseSVNLine(lastDateLine)
+    print("updateProjectRev, params:",projectDir, lastRev, lastDate)
+    if projectDir.endswith("/"):
+        projectDir = os.path.dirname(projectDir)
+    projectName = os.path.basename(projectDir)
+    print("updateProjectRev,projectName:",projectName)    
+    fileUtil = FileUtil()
+    jsonStr = fileUtil.readStr(ProjectCFG)
+    strDict = json.loads(jsonStr,encoding="utf8")
+    # print("updateProjectRev,strDict:",strDict)
+    projectDict = strDict["allProjectDict"]
+    if projectName in projectDict:
+        projectDict[projectName]["svn_lastChangedRev"] = lastRev
+        projectDict[projectName]["svn_lastChangedDate"] = lastDate
+    else:
+        pDict = releaseInfo
+        pDict["projectName"]=projectName
+        pDict["svn_lastChangedRev"]=lastRev
+        pDict["svn_lastChangedDate"]=lastDate
+        projectDict[projectName]=pDict
+    fileUtil.reWriteJson(ProjectCFG,strDict)
+
+def isAppUpgrade(): 
+    return ProjectUpdate
+
+if __name__ == "__main__":
+    pass
+    # projectDir = "../cacheAndroidSrc/AudioLink"
+    # print("release:",getReleaseName(projectDir));

+ 100 - 0
APK自动编译/download.sh

@@ -0,0 +1,100 @@
+#! /bin/sh
+
+ARG_CODE_URL=''
+ARG_CODE_REVISION=''
+ARG_CODE_WORK_PATH=''
+#LOG_FILE=/home/data/ApkAutoCompile/shell/log/download_$(date '+%d-%H%M%S').log
+LOG_FILE=/home/data/ApkAutoCompile/shell/log/download.log
+
+svn_download()
+{
+    echo "shell_log===>Download start---------"
+    echo "AndroidSvnPath=${ARG_CODE_URL}"
+    echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
+    echo "AndroidCachePath=${ARG_CODE_WORK_PATH}"
+
+    if [ -d ${ARG_CODE_WORK_PATH} ] || [ -f ${ARG_CODE_WORK_PATH} ];then
+        echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码"
+        rm -rf ${ARG_CODE_WORK_PATH}
+        sleep 5s
+    fi
+
+    if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
+        echo "download the specified version!"
+        svn co -r ${ARG_CODE_REVISION} --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH}
+    else 
+        echo "download the latest version!"
+        svn co --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH}
+    fi
+
+    if [ ! -d ${ARG_CODE_WORK_PATH} ];then
+        echo -e "下载代码[${ARG_CODE_URL}]失败"
+    else
+        cd ${ARG_CODE_WORK_PATH}
+        # 判断文件是否存在;
+        if [ -f "update_modules.sh" ];then
+            echo "current dir:"${pwd}
+            echo -e "\n\tupdate_modules.sh 文件存在,更新复用库\n\n"
+            chmod 777 update_modules.sh
+            ./update_modules.sh
+        fi
+    fi
+
+    echo "shell_log===>Download end------------"
+}
+
+git_download()
+{
+    echo "shell_log===>Download start---------"
+    echo "AndroidSvnPath=${ARG_CODE_URL}"
+    echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
+    echo "AndroidCachePath=${ARG_CODE_WORK_PATH}"
+
+    if [ -d ${ARG_CODE_WORK_PATH} ] || [ -f ${ARG_CODE_WORK_PATH} ];then
+        echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码"
+        rm -rf ${ARG_CODE_WORK_PATH}
+        sleep 5s
+    fi
+
+    # 下载代码;
+    msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
+    echo "-------------->"$msg
+    if [[ $msg != *"Total "* ]]; then
+        echo -e "1.下载代码[${ARG_CODE_URL}]失败"
+    fi
+
+    if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
+        echo "download the specified version!"
+        # 切换到指定commit id;
+        git checkout -b master ${ARG_CODE_REVISION}
+    else 
+        echo "download the latest version!"
+    fi
+
+    if [ ! -d ${ARG_CODE_WORK_PATH} ];then
+        echo -e "2.下载代码[${ARG_CODE_URL}]失败"
+    else
+        cd ${ARG_CODE_WORK_PATH}
+        # 判断文件是否存在;
+        if [ -f "update_modules.sh" ];then
+            echo "current dir:"${pwd}
+            echo -e "\n\tupdate_modules.sh 文件存在,更新复用库\n\n"
+            chmod 777 update_modules.sh
+            ./update_modules.sh
+        fi
+    fi
+
+    echo "shell_log===>Download end------------"
+}
+
+main()
+{
+    ARG_CODE_URL=$1
+    ARG_CODE_REVISION=$2
+    ARG_CODE_WORK_PATH=$3
+
+    svn_download 2>&1 | tee ${LOG_FILE}
+    #git_download 2>&1 | tee ${LOG_FILE}
+}   
+
+main $@

+ 59 - 0
APK自动编译/gradlew-all.sh

@@ -0,0 +1,59 @@
+#!/bin/sh
+# Shell主目录;
+SHELL_HOME="/home/data/ApkAutoCompile/shell"
+# 源码主目录;
+SRC_HOME="/home/data/ApkAutoCompile/cacheAndroidSrc"
+# 日志文件;
+if [ ! -d '/home/data/ApkAutoCompile/shell/log' ];then
+    mkdir '/home/data/ApkAutoCompile/shell/log'
+fi
+#LOG_FILE="/home/data/ApkAutoCompile/shell/log/gradlewall-$(date '+%d-%H%M%S').log"
+LOG_FILE="/home/data/ApkAutoCompile/shell/log/gradlewall.log"
+
+function updateAll()
+{
+    # 遍历源码主目录;
+    for folder in $(ls ${SRC_HOME})
+    do
+        APK_SRC_DIR="${SRC_HOME}/${folder}"
+        if [ -d ${APK_SRC_DIR}/.svn ];then
+            echo -e "\r\n\r\n======================>开始更新:${APK_SRC_DIR}<======================"
+            svn up ${APK_SRC_DIR}
+            if [ -f ${APK_SRC_DIR}/update_modules.sh ];then
+                echo -e "===========>has update_modules<==========="
+                cd ${APK_SRC_DIR}
+                chmod 777 update_modules.sh
+                ./update_modules.sh
+            fi
+            echo -e "======================>更新完成:${APK_SRC_DIR}<======================\r\n\r\n"
+        else
+            echo -e "${APK_SRC_DIR} \t\t不是svn目录\r\n\r\n"
+        fi
+    done
+}
+
+function compileAll()
+{
+    cd ${SHELL_HOME}
+    for folder in $(ls ${SRC_HOME})
+    do
+        APK_SRC_DIR="${SRC_HOME}/${folder}"
+        if [ -d ${APK_SRC_DIR}/.svn ];then
+            echo -e "\r\n\r\n======================>开始编译: ${APK_SRC_DIR}<======================"
+            ./gradlew.sh ${APK_SRC_DIR} 1
+            echo -e "======================>完成编译: ${APK_SRC_DIR}<======================\r\n\r\n"
+        fi
+    done
+}
+
+function main()
+{
+    # 更新全部apk
+    updateAll
+    # 编译全部apk
+    compileAll
+
+    echo -e "\r\nmain end."
+}
+
+main 2>&1 | tee ${LOG_FILE}

+ 448 - 0
APK自动编译/gradlew.sh

@@ -0,0 +1,448 @@
+#!/bin/sh
+
+# 编码要求:
+# 所有全大写变量均为全局变量;
+# 函数内部变量请使用非全大写;
+
+# 主目录;
+WORK_HOME="/home/data/ApkAutoCompile"
+# 参数1:apk源码路径;
+APK_SRC_DIR=$1
+# apk名称,源于源码路径,需要对带 _General 的删除后缀。
+APK_NAME=''
+# debug apk的svn版本号;
+APK_DEBUG_SVN_REVISION=$3
+# Debug Apk 根地址;
+APK_DEBUG_ROOT_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/01debug/general'
+# Release Apk 根地址;
+APK_RELEASE_ROOT_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/02release/general'
+# Apk源码根地址;
+APK_SRC_ROOT_URL='https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src'
+# APK 根路径;
+APK_ROOT_DIR="${WORK_HOME}/cacheAPK/general"
+# Debug Apk 根路径;
+APK_DEBUG_ROOT_DIR="${APK_ROOT_DIR}/Debug"
+# Release Apk 根路径;
+APK_RELEASE_ROOT_DIR="${APK_ROOT_DIR}/Release"
+# Debug Apk Log
+APK_DEBUG_LOG=$4
+# Gradle目录;
+GRADLE_HOME=/home/data/android/gradle/gradle-6.7.1
+# Android SDK 目录;
+ANDROID_SDK_HOME=/home/data/android/android_sdk/android-sdk-linux
+# 是否重新编译;
+REBUILD=$2
+# 当前要处理的APK的SVN路径;
+APK_SRC_URL=''
+# Build的apk路径;
+APK_BUILD_DIR=''
+# debug Apk 路径;
+APK_DEBUG_DIR=''
+# debug Apk 路径;
+APK_RELEASE_DIR=''
+# APK的版本号
+APK_VER_CODE=''
+# 中间件源码路径;
+APK_DIR_TVMidware="/home/data/ApkAutoCompile/cacheAPK/TVMidware"
+
+# 日志文件;
+if [ ! -d '/home/data/ApkAutoCompile/shell/log' ];then
+    mkdir '/home/data/ApkAutoCompile/shell/log'
+fi
+LOG_FILE="/home/data/ApkAutoCompile/shell/log/gradlew-${APK_NAME}-$(date '+%d-%H%M%S').log"
+
+
+SwitchIntranet()
+{
+    echo -e "\r\r---切换到内网---"
+    route del default gw 10.201.40.1
+    sleep 3s
+    route add default gw 10.201.40.1
+    sleep 3s
+    route add default gw 10.201.40.1
+}
+
+SwitchExternal()
+{
+    echo -e "\r\r---切换到外网---"
+    route del default gw 10.201.40.1
+    sleep 3s
+    route del default gw 10.201.40.1
+}
+
+commitAPK(){
+    echo "---------commitAPK------------"
+    # 切回内网;
+    SwitchIntranet
+    sleep 10s
+
+    echo "apk name = "${APK_NAME}
+    if [ x${APK_NAME} == "xMiddleCommon" ];then
+        if [ -d ${APK_DIR_TVMidware} ]; then
+            cd ${APK_DIR_TVMidware}
+            rm *
+        fi
+        svn_result=$(svn up)
+        if [[ $svn_result != *"At revision"* ]] || [[ $svn_result != *"is already under version control"* ]]; then
+            echo -e "\tsvn up:连接SVN服务器失败, 网络异常!\n"
+        fi
+
+        cp ${APK_BUILD_DIR} ${APK_DIR_TVMidware}
+        echo "APK_DIR_TVMidware PWD:$(pwd)" 
+        svn add .
+        svn add *
+        svn_result=$(svn commit -m "upgrade ${APK_NAME}.${APK_VER_CODE}. ${svn_lastChangedRev}" 2>&1)
+        if [[ $svn_result != *"At revision"* ]] || [[ $svn_result != *"is already under version control"* ]]; then
+            echo -e "\t连接SVN服务器失败, 网络异常!\n"
+        fi
+        echo "After apk copy,P_APK_DIR:"
+        ls -l ${APK_DIR_TVMidware}
+    else
+        # copy apk
+        if [ -d ${APK_DEBUG_DIR} ]; then
+            cd ${APK_DEBUG_DIR}
+            echo -e "\tBefore apk copy,APK_DEBUG_DIR=${APK_DEBUG_DIR}"
+            ls -l ${APK_DEBUG_DIR}
+            rm *
+            svn_result=$(svn up 2>&1)
+            echo -e "\r\nsvn up结果="${svn_result}
+            if [[ $svn_result != *"Updated to revision"* ]] && [[ $svn_result != *"At revision"* ]]; then
+                echo -e "\r\n连接SVN服务器失败, 网络异常!\n"
+                SwitchIntranet
+            fi
+        else
+            mkdir -p ${APK_DEBUG_DIR}
+            cd ${APK_DEBUG_DIR}
+        fi
+        
+        svn_lastChangedDate=$(svn info ${APK_SRC_DIR}|grep Date 2>&1)
+        svn_lastChangedRev=$(svn info ${APK_SRC_DIR}|grep "Last Changed Rev" 2>&1)
+
+        cp ${APK_BUILD_DIR} ${APK_DEBUG_DIR}
+        echo -e "\tAPK_DEBUG_DIR PWD:$(pwd)" 
+        svn add .
+        svn add *
+        svn_result=$(svn commit -m "upgrade ${APK_NAME}.${APK_VER_CODE}. ${svn_lastChangedRev}" 2>&1)
+        echo -e "\r\nsvn commit结果="${svn_result}
+        if [[ $svn_result != *"Committed revision"* ]]; then
+            echo -e "\t连接SVN服务器失败, 网络异常!\n"
+            SwitchIntranet
+            exit
+        fi
+        echo -e "\tAfter apk copy,APK_DEBUG_DIR:"
+        ls -l ${APK_DEBUG_DIR}
+    fi
+
+    #ensure under shell folder
+    cd ${WORK_HOME}/shell
+    echo -e "\tWORK_HOME PWD:$(pwd)"
+    
+    python3 -c "import builder;builder.updateProjectRev('$APK_SRC_DIR','$svn_lastChangedRev','$svn_lastChangedDate')"
+}
+
+compileGeneralApp(){
+    echo "enter compileGeneralApp"
+    # 需要单独处理两APK:FastCastTV、FastScreenV3.0的版本号获取问题
+    if [ x${APK_NAME} == "xFastCastTV" ];then
+        echo -e "\t单独处理此APK Local_FastScreenTV_CN"
+        appVCodeT=$(cat "${APK_SRC_DIR}/Local_FastScreenTV/build.gradle"|grep versionCode |grep -v "getVersionNameByCode\|=\|flavorDimensions")
+    elif [ x${APK_NAME} == "xFastScreenV3.0" ];then
+        echo -e "\t单独处理此APK FastScreenV3.0"
+        appVCodeT=$(cat "${APK_SRC_DIR}/AdvertisementActivity/build.gradle"|grep versionCode |grep -v "getVersionNameByCode\|=\|flavorDimensions")
+    else
+        appVCodeT=$(cat "${APK_SRC_DIR}/app/build.gradle"|grep versionCode |grep -v "getVersionNameByCode\|=\|flavorDimensions")
+    fi
+
+    # 查找apk版本号
+    echo "appVCodeT=${appVCodeT}"
+    if [ ${#appVCodeT} -eq 0 ];then
+        echo -e "\tappVCode error"
+    else
+        vCode=$(echo $appVCodeT | tr -cd "[0-9]")
+        echo -e "\tappVCode number:"$vCode
+        mainVersionCode=$(expr $vCode / 100)
+        childVersionCode=$(expr $vCode % 100)
+        appDate=$(date +%Y%m%d)
+        APK_VER_CODE="appVersionName:"$mainVersionCode"."$childVersionCode"."$appDate
+        echo -e "\t$APK_VER_CODE"
+    fi
+
+    # route to google
+    SwitchExternal
+    sleep 10s
+    #get release packet name
+    releaseName=$(python3 -c 'import builder;print(builder.getReleaseName("'$APK_SRC_DIR'"))')
+    echo -e "\treleaseName:"${releaseName}
+
+    #compile app for release apk
+    cp sabuild/local.properties $APK_SRC_DIR
+    cd "$APK_SRC_DIR"
+    echo -e "\tAPK_SRC_DIR,PWD:$(pwd)"
+    chmod +x gradlew
+    gradle --version
+
+    # 判断文件是否存在;
+    if [ -f "build.sh" ];then
+        echo -e "\tbuild.sh"
+        chmod +x build.sh
+        ./build.sh       
+    else
+        echo -e "\tNo build.sh"
+        ./gradlew ${releaseName}
+    fi   
+
+    #commit apk
+    APK_BUILD_DIR=$(find ${APK_SRC_DIR} -name "*.apk")
+    echo -e "\tAPK_BUILD_DIR:${APK_BUILD_DIR}"
+    if [ ${#APK_BUILD_DIR} -eq 0 ];then
+        echo -e "\tcompile apk fail"
+    else
+        tmp1=${APK_NAME%*_General}
+        echo -e "\t==========APK_NAME=" ${APK_NAME}
+        echo -e "\t==========tmp1=" ${tmp1}
+        # P_APK_DIR="${APK_DIR_general}/${tmp1#*TIF_}"
+        APK_DEBUG_DIR="${APK_DEBUG_ROOT_DIR}/${tmp1}"
+        echo -e "\t==========APK_DEBUG_DIR=" ${APK_DEBUG_DIR}
+        mkdir ${APK_DEBUG_DIR}
+        commitAPK
+    fi
+}
+
+compileCustomApp(){
+    echo -e "\tenter compileCustomApp"
+    apkSections=$(python3 -c 'import builder;print(builder.getAPKSection("'$APK_SRC_DIR'"))')
+    echo -e "\tapkSections:"${apkSections}
+}
+
+# 函数:是否需要更新本地svn目录;
+# 描述:判断本地svn目录版本与服务器版本是否一致;
+# 返回:0表示不需要更新本地svn目录, 1表示需要更新;
+IsUpdateSVN()
+{
+    SwitchIntranet
+    echo -e "\n\n==========执行函数:IsUpdate=========="
+    # 如果目录不存在,直接返回需要更新;
+    if [ ! -d ${APK_SRC_DIR} ]; then
+        echo -e "\t目录[${APK_SRC_DIR}]不存在,需要更新\n"
+        return 1
+    fi
+
+    # 获取本地目录的最新提交版本;
+    svn_local_lcr=$(svn info ${APK_SRC_DIR}|grep "Last Changed Rev" 2>&1)
+    echo -e "\r\r获取本地目录的最新提交版本="${svn_local_lcr}
+    svn_local_lcr=${svn_local_lcr#*Last Changed Rev: }
+    echo -e "\r\nLocal SVN Last Changed Revision=${svn_local_lcr}"
+
+    # 查找服务器的地址;
+    cd ${APK_SRC_DIR}
+    APK_SRC_URL=$(svn info|grep "URL:" |grep -v "Relative URL:" 2>&1) 
+    echo -e "\t${APK_SRC_URL}"
+    APK_SRC_URL=${APK_SRC_URL#*URL:}
+    cd -
+
+    # 获取服务器的最新提交版本;    
+    svn_server_lcr=$(svn info ${APK_SRC_URL}|grep "Last Changed Rev" 2>&1)
+    if [[ $svn_server_lcr == *"svn: E170013: Unable to connect to a repository at URL"* ]]; then
+        echo -e "\t连接SVN服务器失败, 网络异常=${svn_server_lcr}!\n"
+        SwitchIntranet
+        exit
+    fi
+
+    svn_server_lcr=${svn_server_lcr#*Last Changed Rev: }
+    echo -e "\tServer SVN Last Changed Revision=${svn_server_lcr}"
+
+    # 比较版本号或日期;
+    if [ ${svn_server_lcr} -gt ${svn_local_lcr} ];then
+        echo -e "\t服务器版本大于本地目录版本号,需要更新"
+        return 1
+    fi
+
+    if [ x${REBUILD} == "x1" ]; then
+        echo -e "\t手动编译标记位"
+        return 1
+    fi
+
+    echo -e "\t本地版本与服务器版本相同 ,不需要更新\n"
+    return 0
+}
+
+IsUpdateGIT()
+{
+    SwitchIntranet
+    echo -e "\n\n==========执行函数:IsUpdate=========="
+    # 如果目录不存在,直接返回需要更新;
+    if [ ! -d ${APK_SRC_DIR} ]; then
+        echo -e "\t目录[${APK_SRC_DIR}]不存在,需要更新\n"
+        return 1
+    fi
+
+    # 获取本地目录的最新提交版本;
+    svn_local_lcr=$(svn info ${APK_SRC_DIR}|grep "Last Changed Rev" 2>&1)
+    echo -e "\r\r获取本地目录的最新提交版本="${svn_local_lcr}
+    svn_local_lcr=${svn_local_lcr#*Last Changed Rev: }
+    echo -e "\r\nLocal SVN Last Changed Revision=${svn_local_lcr}"
+
+    # 查找服务器的地址;
+    cd ${APK_SRC_DIR}
+    APK_SRC_URL=$(svn info|grep "URL:" |grep -v "Relative URL:" 2>&1) 
+    echo -e "\t${APK_SRC_URL}"
+    APK_SRC_URL=${APK_SRC_URL#*URL:}
+    cd -
+
+    # 获取服务器的最新提交版本;    
+    svn_server_lcr=$(svn info ${APK_SRC_URL}|grep "Last Changed Rev" 2>&1)
+    if [[ $svn_server_lcr == *"svn: E170013: Unable to connect to a repository at URL"* ]]; then
+        echo -e "\t连接SVN服务器失败, 网络异常=${svn_server_lcr}!\n"
+        SwitchIntranet
+        exit
+    fi
+
+    svn_server_lcr=${svn_server_lcr#*Last Changed Rev: }
+    echo -e "\tServer SVN Last Changed Revision=${svn_server_lcr}"
+
+    # 比较版本号或日期;
+    if [ ${svn_server_lcr} -gt ${svn_local_lcr} ];then
+        echo -e "\t服务器版本大于本地目录版本号,需要更新"
+        return 1
+    fi
+
+    if [ x${REBUILD} == "x1" ]; then
+        echo -e "\t手动编译标记位"
+        return 1
+    fi
+
+    echo -e "\t本地版本与服务器版本相同 ,不需要更新\n"
+    return 0
+}
+
+UpdateCode()
+{
+    SwitchIntranet
+    echo -e "\n\n==========执行函数:UpdateCode=========="
+    # 本地APK SVN目录是否存在,存在则删除;
+    if [ -d ${APK_SRC_DIR} ]; then
+        echo -e "\t目录不为空,删除未提交的文件;\n"
+        #rm -rf ${APK_SRC_DIR} # 删除操作太危险;
+        svn cleanup ${APK_SRC_DIR}   
+        filelist=$(svn status ${APK_SRC_DIR} 2>&1)
+        echo -e "未提交的文件="${filelist}
+        # 以"A "分组字符串,并修改logo后缀;
+        filearray=(${filelist//? /})
+        for File in ${filearray[@]}
+        do
+            echo -e "\t 即将删除File="$File
+            # 文件是否存在;
+            if [ -f ${File} ];then
+                rm -f ${File}
+            fi
+        done
+    fi 
+
+    if [ x"${APK_SRC_URL}" = x ]; then
+        echo -e "\tAPK URL空\n"
+        SwitchIntranet
+        exit
+    fi
+
+    #echo -e "\t开始Check代码;\n"
+    #svn co --force ${APK_SRC_URL} ${APK_SRC_DIR}
+    echo -e "\t开始更新代码\n"
+    svn_result=$(svn up ${APK_SRC_DIR} 2>&1)
+    echo -e "\r\nsvn up结果="${svn_result}
+    if [[ $svn_result != *"At revision"* ]]; then
+        echo -e "\t连接SVN服务器失败, 网络异常!\n"
+        SwitchIntranet
+        exit
+    fi
+
+    cd ${APK_SRC_DIR}
+    # 判断文件是否存在;
+    if [ -f "update_modules.sh" ];then
+        echo -e "\n\tupdate_modules.sh 文件存在,更新复用库\n\n"
+        chmod 777 update_modules.sh
+        ./update_modules.sh
+    fi
+}
+
+compile()
+{
+    echo "shell_log===>Compile start---------"
+    # 判断工作副本是否需要更新;
+    IsUpdateSVN
+    if [ $? == 1 ]
+    then
+        echo "需要更新本地SVN"
+        UpdateCode
+        cd ${WORK_HOME}/shell
+        # 读取ini配置文件中的信息;
+        releaseType=$(python3 -c 'import builder;print(builder.getReleaseName("'$APK_SRC_DIR'"))')
+        if [ $releaseType == 'custom' ];then
+            compileCustomApp
+        else
+            compileGeneralApp
+        fi
+        echo "shell_log===>Compile end------------"
+    else
+        echo "无需更新本地SVN"
+        echo "shell_log===>No upgrade end------------"
+    fi
+
+    # 切换回内网;
+    SwitchIntranet
+}
+
+main()
+{
+    if [ $# -eq 1 ]; then
+        REBUILD=0
+        APK_SRC_DIR=$1
+    elif [ $# -eq 2 ]; then
+        APK_SRC_DIR=$1
+        REBUILD=$2
+    fi
+
+    echo -e "########################################################开始编译########################################################\n"
+    # 导出变量到子shell;
+    export WORK_HOME        #/home/data/ApkAutoCompile
+    export GRADLE_HOME      #/home/data/android/gradle/gradle-6.7.1
+    export ANDROID_SDK_HOME #/home/data/android/android_sdk/android-sdk-linux
+
+    # 创建 编译完成的Apk文件 根目录;
+    if [ ! -d ${APK_ROOT_DIR} ];then
+        mkdir -p ${APK_ROOT_DIR}
+    fi
+
+    # Apk Debug目录不用创建,但Release根目录需要;
+    if [ ! -d ${APK_RELEASE_ROOT_DIR} ];then
+        mkdir -p ${APK_RELEASE_ROOT_DIR}
+    fi
+
+    # 检出所有debug apk;
+    if [ ! -d ${APK_DEBUG_ROOT_DIR} ];then
+        svn co ${APK_DEBUG_ROOT_URL} ${APK_DEBUG_ROOT_DIR}
+    fi
+
+    # 检出中间件源码;
+    if [ ! -d ${APK_DIR_TVMidware} ];then
+        echo -e 'svn co TVMidware Apk'
+        svn co https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/TVMidware/debug/TVMidwareService ${APK_DIR_TVMidware}
+    fi
+
+    # 取右边第一个字符,判断是否为斜杠;
+    if [ "${APK_SRC_DIR:0-1:1}" = "/" ];then
+        # 若为斜杠,%号截取,删除右边第一个'/'及右边字符,保存左边字符;
+        echo "最后为斜杠,删除斜杠"
+        APK_SRC_DIR=${APK_SRC_DIR%/*}
+    fi
+
+    # 获取APK名称;
+    APK_NAME=${APK_SRC_DIR##*/}
+    echo -e "APK_SRC_DIR=${APK_SRC_DIR}\r\nAPK_NAME=${APK_NAME}"
+    # 重新定义log文件;
+    LOG_FILE="/home/data/ApkAutoCompile/shell/log/gradlew-${APK_NAME}.log"
+
+    compile 2>&1 | tee ${LOG_FILE}
+    echo -e "########################################################编译结束########################################################\n"
+}
+
+main $@