NOSDK--一键打包的实现(一)
所谓一键打包,包含五个流程:
- 刷新mk,这个只有在文件数目改变的时候才会需要;
- 编译,在实现了统一接入以后,只需要编译一次就可以打多个包,这个以后再介绍;
- 拷贝资源,这个使用的是cocos2d-x自带的脚本,也会做一些调整,比如删除一些无用的目录之类的;
- 拷贝sdk自带的资源或者库,这个其实可以拆开分别放在2和3里的,这样做只是为了使结构清晰一些;
- 打包并签名。
所有与打包相关的脚本,都放在目录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" != "" ] && [ "$ALL" != "" ]; 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="" #通用宏设置
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" != "" ] && [ "$ALL" != "" ]; 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=""
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" == "" ]; 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 "\033[31;1mbuild platform --$SDKDIR...\033[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}" == "" ]; then
if [ -f "./platform_refresh.sh" ]; then
echo -e "\033[31;1m开始刷新 Android.mk\033[0m"
source "./platform_refresh.sh"
fi
fi #编译
if [ "${ISBUILD_SET}" == "" ]; then
if [ -f "./build_native.sh" ]; then
echo -e "\033[31;1m开始编译libcocos2dcpp.so\033[0m"
source "./build_native.sh" >> null
fi
fi #拷贝资源
if [ "${ISCOPYRESOURCE_SET}" == "" ]; then
if [ -f "./resource_copy.sh" ]; then
echo -e "\033[31;1m开始拷贝资源\033[0m"
source "./resource_copy.sh" >> null
fi
fi #打包
if [ "${ISPACKAGE_SET}" == "" ]; then
if [ -f "./platform_package.sh" ]; then
echo -e "\033[31;1m开始打包\033[0m"
source "./platform_package.sh" "$1" "$2" "$3" "$4" "$5" >> null
fi
fi if [ "${ISCOPYICON_SET}" == "" ]; then
if [ -f "./icon_copy.sh" ]; then
echo -e "\033[31;1m开始拷贝icon\033[0m"
source "./icon_copy.sh" "$1" "$2" "$3" "$4" "$5" >> null
fi
fi # source "./icon_copy.sh" "$1" "$2" "$3" "$4" echo -e "\033[31;1m$SDKDIR build finished \033[0m"
echo "#############################################"
cd "$2"
这一节到这里就结束了,下一节将主要介绍mk刷新这一块的代码
NOSDK--一键打包的实现(一)的更多相关文章
- NOSDK--SDK一键打包及统一接入的实现(前言)
前言 一,一键打包的实现 1.1 shell脚本执行流程介绍 1.2 自动刷新mk文件的脚本介绍 1.3 编译及拷贝资源的脚本介绍 1.4 打包及签名的脚本介绍 1.5 mac下的脚本环境配置及脚本的 ...
- 前端资源多个产品整站一键打包&包版本管理(四)—— js&css文件文件打包并生成哈希后缀,自动写入路径、解决资源缓存问题。
问题: 当我们版本更新的时候,我们都要清理缓存的js跟css,如何使得在网页中不需要手动清理呢? 答案: 生成带有哈希后缀的js跟css文件 1.文件路径 路径中的conf.js 是用于放置全局打包的 ...
- 前端资源多个产品整站一键打包&包版本管理(三)—— gulp分流
问题: 当我们一个工作台里面有好几个项目的时候,我们要为项目的前端资源进行打包,但是,gulpfile只有一个,如果我们把所有的打包都放在同一个文件里面,首先文件会越来越大,而且不便于管理,这时,我们 ...
- 前端资源多个产品整站一键打包&包版本管理(一)
来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们 ...
- cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程 ...
- Web项目也能一键打包Android、IOS
随着移动互联网的不断发展,智能手机配置的不断提高,越来越多的年轻人基本都在使用手机,如微信.支付宝等等.已基本成为一种习惯,坐电梯也好.吃饭也好.开车也好,基本都捧着一个手机在那按来按去,开车就不建议 ...
- maven 聚合的含义是父类打包 ,清理等 则子类自动打包;也就是一键打包 方便服务
maven 聚合的含义是父类打包 ,清理等 则子类自动打包:也就是一键打包 方便服务
- Android Studio如何配置CURL指令一键打包apk上传至蒲公英
Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...
- Docker的镜像制作与整套项目一键打包部署
Dockerfile常用指令介绍 指令 描述 FROM 构建的新镜像是基于哪个镜像.例如:FROM centos:6 MAINTAINER 镜像维护者姓名或邮箱地址.例如:MAINTAINER Mr. ...
- 使用VS中自带的一键打包功能将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理
本章将和大家简单分享下如何使用VS中自带的一键打包功能将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理. 一.注册并登录NuGet平台 NuGet官网:http ...
随机推荐
- java设计模式之中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...
- Leetcode: sliding window maximum
August 7, 2015 周日玩这个算法, 看到Javascript Array模拟Deque, 非常喜欢, 想用C#数组也模拟; 看有什么新的经历. 试了四五种方法, 花时间研究C# Sorte ...
- load和get的延迟加载
load和get方法的区别: Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象. 区别在于: 如果未能发现符合条件的记录,get方法返回nul ...
- thinkphp发送邮件
看thinkPHP手册发送邮件 Thinkphp3.2 PHPMailer 发送邮件结合QQ企业邮箱发送邮件下载附件PHPMailer解压到ThinkPHP\Library\VendorPHPMail ...
- Oracle 中的分析函数
Oracle常用分析函数介绍(排名函数+窗口函数) 2014年11月30日 ⁄ 数据库 ⁄ 共 3903字 ⁄ 暂无评论 ⁄ 阅读 7,772 次 评级函数 常见评级函数如下: RANK():返回数据 ...
- IE6\7\8下placeholder效果,支持文本框和密码框
(function($) { var placeholderfriend = { focus: function(s) { s = $(s).hide().prev().show() ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 服务器之间的接口通讯功、信息交换
1:当远程调用方法时,会有很多种可能性发生.接口调用之后,发生错误是什么原因发生的?反馈给开发人员需要精确.精准.高效率,这时候若能返回出错状态信息的详细信息,接口之间的调用就会非常顺利,各种复杂问题 ...
- 部署 OpenStack VirtualBox
VirtualBox 中部署 OpenStack 大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂, ...
- 前端代码目录结构、常用 piugin、元素补充用法及其它注意事项
目录结构: app: .html文件 css: .css文件 script: 脚本文件 plugin: 插件 (此目录放一些通用代码) 注意事项: 1.在IE浏览器下img会显示边框,为了保证兼容 ...
- windows下MySQL 忘记初始密码
一.windows下修改MySQL用户密码的方法: 1.关闭正在运行的MySQL服务:net stop mysql 或 在windows 任务管理器中结束 mysqld.exe 进程 或 在 管 ...