zoukankan      html  css  js  c++  java
  • NOSDK--一键打包的实现(一)

      所谓一键打包,包含五个流程:

    1. 刷新mk,这个只有在文件数目改变的时候才会需要;
    2. 编译,在实现了统一接入以后,只需要编译一次就可以打多个包,这个以后再介绍;
    3. 拷贝资源,这个使用的是cocos2d-x自带的脚本,也会做一些调整,比如删除一些无用的目录之类的;
    4. 拷贝sdk自带的资源或者库,这个其实可以拆开分别放在2和3里的,这样做只是为了使结构清晰一些;
    5. 打包并签名。

      所有与打包相关的脚本,都放在目录projects/main/build_android,下面是目录及文件介绍:

    • tools:                                       //保存通用的功能脚本
      • build_native.sh               //cocosd-x自带脚本,用于编译
      • platform_input.sh             //处理输入,设置代表具体功能的全局变量(可以称之为功能变量)
      • build_platform.sh             //通过功能变量,来执行不同脚本
      • file_list.sh                       //遍历文件夹,输出文件列表
      • icon_copy.sh                   //拷贝icon,暂时废弃
      • normal_define.sh             //刷新mk所需的mk变量,第一小节将会介绍
      • platform_define.sh       //刷新mk所需的mk变量,第一小节将会介绍
      • platform_package.sh       //打包并且签名
      • platform_param.sh          //过渡脚本,解决在build_android和build_android/platform执行脚本的目录问题
      • platform_path.sh         //path设置,
      • platform_property.sh       //统一接入时的分包脚本,下一章介绍
      • platform_refresh.sh         //刷新mk的脚本
      • resource_copy.sh            //cocosd-x自带脚本,用于拷贝资源;
    • platform:                                //存放各平台打包的脚本文件
      • build_noplatform.sh         //无sdk平台(或者叫app store版本)
      • build_xx.sh                 //xx SDK脚本
    • res:                                    //这个目录主要是为了拷贝icon使用的,但目前无法通用,暂时废弃
    • build_all.sh                             //执行所有的平台打包脚本,当然也可以按照自己的意愿分类

      1.1 shell脚本执行流程介绍

      platform_input.sh定义了脚本的基本指令:

    • -a:   执行刷新mk,编译,拷贝,打包;
    • -b:   -b只有编译功能,-b mk则会先刷新mk,再编译;
    • -c:   -c会拷贝icon和sdk自带的资源,-c icon(将会废弃)能够拷贝icon;
    • -p:   打包并签名。

      你可以cd到build_android目录中,执行

        ./build_all.sh -a  或者 ./build_all.sh -b mk 或者 ./build_all.sh -c icon 或者 ./build_all.sh -p 或者 ./build_all.sh -b mk -c icon -p

      你也可以cd到build_android/platform目录中,执行

        ./build_noplatform.sh -a  或者 ./build_noplatform.sh -b mk 或者 ./build_noplatform.sh -c icon 或者 ./build_noplatform.sh -p 或者 ./build_noplatform.sh -b mk -c icon -p

      脚本的执行流程,简单来说,上述指令将build_android/tools/platform_refresh.sh,build_android/tools/build_native.sh,build_android/tools/icon_copy.sh,build_android/tools/resource_copy.sh,build_android/tools/platform_package.sh这五个脚本拷入到目标工程所在的目录,根据指令来执行相应的脚本。

      首先,我们先来看看build_noplatform.sh:

    ##############################################
    ##平台数据,需要更改
    ##############################################
    PLATFORMHONE_CHILD=()
    SDKDIR="game_xx"
    BUILDDIR="build_android"
    LIBRARYDIR="nosdk_xx"
    TOOLSDIR="tools"
    PlatformTarget="libcocos2dcpp"
    # PlatformName="PLATFORM_XX"
    PlatformGameName=(
    "NAME_MYGAME"
    )
    if [ "$ALL" != "1" ] && [ "$ALL" != "0" ]; then
        source ../tools/platform_path.sh    
    ISBUILD_SET="0"
        ISREFRESHMK_SET="0"      
        ISCOPYRESOURCE_SET="0"       
        ISCOPYICON_SET="0"        
        ISPACKAGE_SET="0"  ##使用自定义设置 PLATFORMHONE_CHILD
    =( # "DEBUG" ##编译模式 ) fi source platform_input.sh $* source platform_param.sh

      PLATFORMHONE_CHILD变量存贮了平台所需的宏字符串,在未使用统一接入之前,区分不同平台主要依靠宏来实现,比如PLATFORM_XX,添加PlatformGameName变量是为了处理子包分包(同一平台,通过宏更改游戏登录背景,游戏名称等)。

      接下来的四个dir,SDKDIR/BUILDDIR/LIBRARYDIR/TOOLSDIR,

    • SDKDIR:目标工程目录,未添加统一接入框架时,每一个sdk平台都需要建立一个android工程项目,所在目录和build_android同级;
    • BUILDDIR:build_android目录名,为了切换目录方便添加的;
    • TOOLSDIR:同上;
    • LIBRARYDIR:添加统一接入时需要,目标工程的依赖库。

      通过ALL这个变量,可以区分究竟是执行了build_android/build_all.sh脚本还是build_android/platform的单个平台平台脚本,凡是类似build_all.sh这种脚本,都需要在脚本开头设置ALL=1,由于两种脚本目录的不同,需要分开处理。

    #全局统一配置,针对一键编译
    ALL="1"
    
    #通用宏设置
    PLATFORMHONG=(
    #"DEBUG"     ##编译模式
    #"NO_SHARE"  ##微信分享
    #"TEST_APP" ##app测试
    )
    
    ##
    source ./tools/platform_path.sh
    source platform_input.sh $*
    
    ##app
    source ./platform/build_noplatform.sh
    
    ##xx
    source ./platform/build_xx.sh

      这里我们可以看到,平台脚本会先执行build_path.sh来设置PATH,初始化功能变量,然后通过platform_input.sh来处理输入,设置功能变量,功能变量有5个:

    • ISREFRESHMK_SET:             是否刷新mk
    • ISBUILD_SET:                      是否编译
    • ISCOPYRESOURCE_SET:       是否拷贝资源
    • ISCOPYICON_SET:               是否拷贝icon
    • ISPACKAGE_SET:                   是否打包并签名

      接下来,让我们看看build_param.sh脚本文件,build_param.sh是一个中间脚本,用来处理目录和宏的问题

    if [ "$ALL" != "1" ] && [ "$ALL" != "0" ]; then
        SOURCEDIR="../../proj.android"
        SDKDIR="../project_android/$SDKDIR"
        BUILDDIR2="../$BUILDDIR"
        BUILDDIR="../$BUILDDIR/platform"
        TOOLSDIR="../$TOOLSDIR"
        ExternalDir="../auto_android_src_dir"
        SRCDIR="../proj.android/src/"
        ALL="0"
    else
        SDKDIR="../project_android/$SDKDIR"
        BUILDDIR2="../$BUILDDIR"
        BUILDDIR="../$BUILDDIR"
        TOOLSDIR="./$TOOLSDIR"
        ExternalDir="../auto_android_src_dir"
        SRCDIR="../proj.android/src/"
        SOURCEDIR="../proj.android"
    fi
    
    if [ "$ALL" == "1" ]; then
        ##使用全局设置
        for data in ${PLATFORMHONG[@]}
        do
            PLATFORMHONE_CHILD+=(
            ${data}
            )
        done
    fi
    
    # #####不用更改
    # PLATFORMHONE_CHILD+=(
    # "$PlatformName"   ##平台类型
    # )
    
    for data in ${PlatformGameName[@]}
    do
    PLATFORMHONE_CHILD+=(
    "$data"   ##平台类型
    )
    done
    
    echo "#############################################"
    echo -e "33[31;1mbuild platform --$SDKDIR...33[0m"
    
    echo "############"
    for data in ${PLATFORMHONE_CHILD[@]}
    do
    echo ${data}
    done
    echo "############"
    
    source "$TOOLSDIR"/build_platform.sh "$SDKDIR" "$BUILDDIR" "$TOOLSDIR" "$BUILDDIR2" "$SOURCEDIR"

      通过ALL变量来设置目录,这个我们之前说过,主要是为了切换目录用的,然后设置宏,将平台相关的宏全都保存在PLATFORMHONE_CHILD中。

      那么,现在到了build_platform.sh脚本了,这是脚本流程的最后一个环节,功能是拷贝5个脚本到目标文件夹,cd过去,执行对应脚本,然后再cd回来。

    #执行刷新mk,编译,拷贝资源
    
    cp "$3"/build_native.sh "$5"/
    cp "$3"/resource_copy.sh "$5"/
    cp "$3"/platform_refresh.sh "$5"/
    cp "$3"/platform_package.sh "$5"/
    cp "$3"/platform_copy.sh "$5"/
    cp "$3"/icon_copy.sh "$5"/
    cp "$3"/platform_property.sh "$5"/
    cd "$5"
    
    #### 注意 == 两边必须有空格
    #刷新Android.mk
    if [ "${ISREFRESHMK_SET}" == "1" ]; then
        if [ -f "./platform_refresh.sh" ]; then
            echo -e "33[31;1m开始刷新 Android.mk33[0m"
            source "./platform_refresh.sh"
        fi
    fi
    
    #编译
    if [ "${ISBUILD_SET}" == "1" ]; then
        if [ -f "./build_native.sh" ]; then
            echo -e "33[31;1m开始编译libcocos2dcpp.so33[0m"
            source "./build_native.sh" >> null
        fi
    fi
    
    #拷贝资源
    if [ "${ISCOPYRESOURCE_SET}" == "1" ]; then
        if [ -f "./resource_copy.sh" ]; then
            echo -e "33[31;1m开始拷贝资源33[0m"
            source "./resource_copy.sh" >> null
        fi
    fi
    
    #打包
    if [ "${ISPACKAGE_SET}" == "1" ]; then
        if [ -f "./platform_package.sh" ]; then
            echo -e "33[31;1m开始打包33[0m"
            source "./platform_package.sh" "$1" "$2" "$3" "$4" "$5" >> null
        fi
    fi
    
    if [ "${ISCOPYICON_SET}" == "1" ]; then
        if [ -f "./icon_copy.sh" ]; then
            echo -e "33[31;1m开始拷贝icon33[0m"
            source "./icon_copy.sh" "$1" "$2" "$3" "$4" "$5" >> null
        fi
    fi
    
    # source "./icon_copy.sh" "$1" "$2" "$3" "$4"
    
    echo -e "33[31;1m$SDKDIR build finished 33[0m"
    echo "#############################################"
    cd "$2"

      这一节到这里就结束了,下一节将主要介绍mk刷新这一块的代码

  • 相关阅读:
    java接口返回json数据格式
    ajax请求报406问题
    ajax跨域问题
    js、css等引入文件路径正确,却报404的解决办法
    HttpServletResponse,HttpServletRequest详解
    python学习(十六)os使用
    python学习(十五)python读取配置yaml
    python学习(十四)python操作发送邮件(163邮箱)
    python学习(十三)python使用pymsql链接数据库操作
    python学习(十二)python正则表达式
  • 原文地址:https://www.cnblogs.com/nottvlike/p/4603778.html
Copyright © 2011-2022 走看看