NOSDK--一键打包的实现(二)
Android.mk文件,位置在android工程/jni目录下,是android工程中的makefile文件,这里我们简称它为mk文件。
1.2 自动刷新mk文件的脚本介绍
这一节介绍mk文件的自动生成过程,所谓刷新mk文件,其实只是刷新变动的那部分mk文件内容,主要是宏设置,cpp文件删减,头文件删减这三部分。这里不介绍android.mk文件结构和相关知识,仅仅介绍如何刷mk文件变动的那部分内容。
首先,我们先来看下一个完整的mk文件,看不懂的可以直接往下翻:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -DNAME_MYGAME=1
LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libcocos2dcpp LOCAL_SRC_FILES := hellocpp/main.cpp \
libiconv.a \
../../Classes/AppDelegate.cpp \
../../Classes/Common/JavaHelper.cpp \
../../Classes/GameOverScene.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/LoginBackScene.cpp \
../../Classes/PayBackScene.cpp \
../../Classes/SDKManager/NS_SDKFactory.cpp \
../../Classes/SDKManager/NS_SDKManager.cpp \
../../Classes/SDKManager/NS_SDKPlatformAndroid.cpp \
../../Classes/SettingScene.cpp \ LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/../../Classes\
$(LOCAL_PATH)/../../Classes/SDKManager
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,CocosDenshion/android) \
$(call import-module,extensions) \
$(call import-module,cocos2dx)
我将这个mk文件分为四个部分,我们先来看第一个部分:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -DNAME_MYGAME=1
LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libcocos2dcpp
这一部分代码大部分都是固定代码,除了用红色标注的那一行,用来设置宏相关的功能,每个游戏平台或者每个平台的不同子包都可以使用宏来加以区分。这个在前一节我们已经介绍过了,再来看下build_xx.sh文件,PlatformGameName变量里定义的NAME_MYGAME就是一个宏,当同一个游戏有多个子包时,可以用来区分不同游戏登录背景和游戏名称等,PLATFORM_XX也是一个宏,用来区分不同平台,不过目前已经废弃了,所有平台相关的宏都会放在PLATFORMHONE_CHILD变量中。
##############################################
##平台数据,需要更改
##############################################
PLATFORMHONE_CHILD=()
SDKDIR="game_xx"
BUILDDIR="build_android"
LIBRARYDIR="nosdk_xx"
TOOLSDIR="tools"
PlatformTarget="libcocos2dcpp"
# PlatformName="PLATFORM_XX"
PlatformGameName=(
"NAME_MYGAME"
)
...
mk文件的第二部,是cpp文件,mk刷新主要是便是cpp文件的刷新,当然还需要排除一些在其它平台(比如ios)使用的cpp文件。
LOCAL_SRC_FILES := hellocpp/main.cpp \
libiconv.a \
../../Classes/AppDelegate.cpp \
../../Classes/Common/JavaHelper.cpp \
../../Classes/GameOverScene.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/LoginBackScene.cpp \
../../Classes/PayBackScene.cpp \
../../Classes/SDKManager/NS_SDKFactory.cpp \
../../Classes/SDKManager/NS_SDKManager.cpp \
../../Classes/SDKManager/NS_SDKPlatformAndroid.cpp \
../../Classes/SettingScene.cpp \
mk文件的第三部分,是包含头文件的路径集合,设置过IDE编译环境的同学应该对这个很熟悉。
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/../../Classes\
$(LOCAL_PATH)/../../Classes/SDKManager
mk文件的第四部分,是固定部分,不会变化,当然除非你更换了cocos2d-x版本。
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,CocosDenshion/android) \
$(call import-module,extensions) \
$(call import-module,cocos2dx)
下面我们将介绍刷新mk文件的脚本build_android/tools/platform_refresh.sh脚本,我们先复习下与mk刷新有关的脚本文件,主要有下面4个:
- tools: //保存通用的功能脚本
- file_list.sh //遍历文件夹,输出文件列表
- normal_define.sh //刷新mk所需的mk变量
- platform_define.sh //刷新mk所需的mk变量
- platform_refresh.sh //刷新mk的脚本
我们先来看下normal_define.sh脚本,normal_define.sh定义了头文件集合和排除文件集合(刚刚mk文件的第三部分和少量第二部分相关内容),normalcppfile是一个怪异的变量,一般情况不会使用到它。这里GameDir变量的定义其实有些多余的,不过也没啥大的问题。
#############################################
##一般数据,一般来说不需要更改
##############################################
#cpp 目录
GameDir=(
"../Classes"
) #固定的cpp文件,比如一个文件夹100个cpp文件中只有10个需要,可以写死在这里
NormalCppfile=( ) #头文件目录
NormalIncludefile=(
"\$(LOCAL_PATH)/../../Classes\\"
"\$(LOCAL_PATH)/../../Classes/SDKManager"
) #不需要的文件(在GameDir中)
NormalExcludefile=(
"../Classes/SDKManager/NS_SDKPlatform.cpp"
)
接下来我们看下platform_define.sh文件,这个脚本主要是处理mk文件第四部分的固定内容,这个'/'需要注意下
#注意: '/' 是转义字符需要转义的主要有$,
PlatformOtherDefine=(
"LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static" "include \$(BUILD_SHARED_LIBRARY)" "\$(call import-module,CocosDenshion/android) \\"
"\$(call import-module,extensions) \\"
"\$(call import-module,cocos2dx)"
)
然后再来看下file_list.sh脚本,file_list.sh顾名思义就是遍历Class目录,输出可用的cpp文件列表(排除在外的文件不输出),主要是输出第三部分的内容,红色的代码将会判断文件是否在排除列表中,如果在排除列表,则不会输出。
#遍历文件夹 输出cpp文件名
for file in $1/*
do
if [ -d $file ]; then
echo $file
source file_list.sh $file $2
elif [ -f $file ]; then
echo $file
if [ ${file##*.} == "cpp" ] || [ ${file##*.} == "c" ]; then
canDo="false"
for data in ${NormalExcludefile[@]}
do
if [ $data == $file ]; then
canDo="true"
fi
done
if [ $canDo == "false" ]; then
echo "../$file \\" >> "$2"
fi
fi
fi
done
最后,让我们看下platform_refresh.sh脚本文件,我使用颜色将这个脚本分成了6个部分,
PlatformDir="./jni"
Name="Android.mk"
if [ -f "$Name" ]; then
rm -r "$Name"
fi source platform_define.sh
source normal_define.sh echo "LOCAL_PATH := \$(call my-dir)" > "$Name"
echo "" >> "$Name"
echo "include \$(CLEAR_VARS)" >> "$Name"
echo "" >> "$Name" for data in ${PLATFORMHONE_CHILD[@]}
do
echo "LOCAL_CFLAGS += -D${data}=1" >> "$Name"
done echo "LOCAL_MODULE := game_shared" >> "$Name"
echo "" >> "$Name"
echo "LOCAL_MODULE_FILENAME := $PlatformTarget" >> "$Name"
echo "" >> "$Name"
echo "" >> "$Name"
echo "LOCAL_SRC_FILES := hellocpp/main.cpp \\" >> "$Name"
echo "libiconv.a \\" >> "$Name"
#Game中的cpp文件 for data in ${PlatformCppfile[@]}
do
echo ${data} >> "$Name"
done #其它文件夹文件
for data in ${NormalCppfile[@]}
do
echo ${data} >> "$Name"
done for data in ${GameDir[@]}
do
source file_list.sh $data $Name
done echo "" >> "$Name"
echo "LOCAL_C_INCLUDES := \$(LOCAL_PATH) \\" >> "$Name" for data in ${PlatformIncludefile[@]}
do
echo ${data} >> "$Name"
done for data in ${NormalIncludefile[@]}
do
echo ${data} >> "$Name"
done IFS=";" for data in ${PlatformOtherDefine[@]}
do
echo ${data} >> "$Name"
done mv "$Name" "${PlatformDir}/Android.mk"
- 新建一个临时文件,并刷新之前定义变量的脚本,获取到变量内容;
- 处理mk文件的第一部分的内容,所有宏都在变量PLATFORMHONE_CHILD中;
- 处理mk文件的第二部分的内容,刷新cpp文件,这里我们可以看到file_list脚本的使用;
- 处理mk文件的第三部分的内容,刷新头文件集合;
- 处理mk文件的第四部分的内容,输出固定内容;
- 将临时文件拷贝到jni目录下,替换Android.mk源文件。
这一节就到此为止了,下一节我们将介绍自动编译及拷贝资源的脚本,这部分的脚本都是cocos2d-x自带的,因此只会简单介绍下。
PS:项目中android这边的demo已经基本成型了,有兴趣可以看看(项目地址可以看前言)。
NOSDK--一键打包的实现(二)的更多相关文章
- NOSDK--SDK一键打包及统一接入的实现(前言)
前言 一,一键打包的实现 1.1 shell脚本执行流程介绍 1.2 自动刷新mk文件的脚本介绍 1.3 编译及拷贝资源的脚本介绍 1.4 打包及签名的脚本介绍 1.5 mac下的脚本环境配置及脚本的 ...
- cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程 ...
- Wix打包系列(二)用户界面和本地化操作
原文:Wix打包系列(二)用户界面和本地化操作 上一章节,我们已经大概知道如何对文件进行打包安装,不过我们也注意到,通过对Sample.wxs的编译链接,生成的msi安装包没有任何用户界面,只有一个安 ...
- 使用VS中自带的一键打包功能将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理
本章将和大家简单分享下如何使用VS中自带的一键打包功能将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理. 一.注册并登录NuGet平台 NuGet官网:http ...
- Nuget一键打包上传以及高级应用
Nuget是什么不用多说,大家应该也没少用过Nuget, 不少人也应该使用过工具打Nuget包,接下来先一步步说明如何使用脚本完成Nuget一键打包 Nuget一键打包 配置Nuget环境 下载地址: ...
- 前端资源多个产品整站一键打包&包版本管理(四)—— js&css文件文件打包并生成哈希后缀,自动写入路径、解决资源缓存问题。
问题: 当我们版本更新的时候,我们都要清理缓存的js跟css,如何使得在网页中不需要手动清理呢? 答案: 生成带有哈希后缀的js跟css文件 1.文件路径 路径中的conf.js 是用于放置全局打包的 ...
- 前端资源多个产品整站一键打包&包版本管理(三)—— gulp分流
问题: 当我们一个工作台里面有好几个项目的时候,我们要为项目的前端资源进行打包,但是,gulpfile只有一个,如果我们把所有的打包都放在同一个文件里面,首先文件会越来越大,而且不便于管理,这时,我们 ...
- 前端资源多个产品整站一键打包&包版本管理(一)
来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们 ...
- jenkins-APP打包页面展示二维码
背景: 客户要求在APP打包页面展示二维码.虽然感觉这个功能很鸡肋,但是还是加上吧. 效果展示: 配置: 在上图中,106对应的内容是BuildName,我们可以通过build-name-setter ...
- Web项目也能一键打包Android、IOS
随着移动互联网的不断发展,智能手机配置的不断提高,越来越多的年轻人基本都在使用手机,如微信.支付宝等等.已基本成为一种习惯,坐电梯也好.吃饭也好.开车也好,基本都捧着一个手机在那按来按去,开车就不建议 ...
随机推荐
- ARM嵌入式开发板
iTOP-4412 ARM嵌入式开发板----主要特点 iTOP-4412开发平台是北京迅为电子研发设计的嵌入式开发板平台,核心板配备64位双通道2GB DDR3,16GBEMMC存储,三星原厂S5M ...
- 手动处理datanode磁盘间使用不均的问题
http://wiki.apache.org/hadoop/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the ...
- 区块链是伟大的,比特币则不然。《FinTech,金融科技时代的来临》。3星。
本书讲技术给金融业带来的变革和可能的趋势.作者认为区块链是伟大的发明,因为他可以让金融交易免费且实时地进行.比特币则可能会被其他区块链技术取代.书中有至少一半的内容涉及到了区块链和比特币.总体评价3星 ...
- 2016.10.29 清北学堂NOIP冲刺班Day1 AM 考试总结
成绩:满分300,我得了200, 1:90//前两个题目都是模拟,没用到什么其他算法,第一题有可能少考虑了一点细节 2:100 3:10//感觉是个DP,但是毫无思路,只打了个普通背包,10分而已. ...
- python_面向对象编程
一.编程范式 程序员通过特定的语法+数据结构+算法告诉计算机如果执行任务,实现这个过程有不同的编程方式,对这些不同的编程方式进行归纳总结得出来的编程方式类别,即为编程范式 编程范式:面向过程编程.面向 ...
- 掌握SortSet接口和Set接口的关系,以及常用方法。
TreeSet类是可以排序的类.TreeSet实际上也是SortSet接口的子类. 此接口的所有类都是可以排序的. 所有的方法: 实例: package 类集; import java.util.So ...
- mysql集群数据一致性校验
目前,mysql在互联网行业使用地如火如荼,很多大型网站都在使用MySQL数据库,通过搭建mysql主备集群,实现高性能,高可用的存储方案.mysql集群的共同特性是通过复制来实现主备间的同步,保证主 ...
- JS组件系列——表格组件神器:bootstrap table
前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉及,罪过,罪过.今天补起来吧.上午博主由零开始自己从头到尾使用了一遍Bootstrap Table ,遇到不少 ...
- c语言之【#ifdef】
电脑程序语句,我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码. 1 2 3 #ifdef 语句1 // 程序2 #endif 可翻译为:如果宏定义了语句1则程序2. 作用:我 ...
- C# 与 SQLite的操作
1.通过Add References引用SQLite ADO .NET安装目录的bin目录下的System.Data.SQLite.DLL. 2.创建数据库文件:因为始终是个0字节文件,应该利用IO也 ...