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文件,

##############################################
##平台数据,需要更改
##############################################
PLATFORMHONE_CHILD=()
SDKDIR="game_xx"
BUILDDIR="build_android"
LIBRARYDIR="nosdk_xx"
TOOLSDIR="tools"
PlatformTarget="libcocos2dcpp"
# PlatformName="PLATFORM_XX"
PlatformGameName=(
"NAME_MYGAME"
)
...

PlatformGameName变量里定义的NAME_MYGAME就是一个宏,当同一个游戏有多个子包时,可以用来区分不同游戏登录背景和游戏名称等,PLATFORM_XX也是一个宏,用来区分不同平台,
不过目前已经废弃了,所有平台相关的宏都会放在PLATFORMHONE_CHILD变量中。
  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"
  1. 新建一个临时文件,并刷新之前定义变量的脚本,获取到变量内容;
  2. 处理mk文件的第一部分的内容,所有宏都在变量PLATFORMHONE_CHILD中;
  3. 处理mk文件的第二部分的内容,刷新cpp文件,这里我们可以看到file_list脚本的使用;
  4. 处理mk文件的第三部分的内容,刷洗头文件集合;
  5. 处理mk文件的第四部分的内容,输出固定内容;
  6. 将临时文件拷贝到jni目录下,替换Android.mk源文件。

  这一节就到此为止了,下一节我们将介绍自动编译及拷贝资源的脚本,这部分的脚本都是cocos2d-x自带的,因此只会简单介绍下。

  PS:项目中android这边的demo已经基本成型了,有兴趣可以看看(项目地址可以看前言)。

时间: 2024-10-05 17:14:29

NOSDK--一键打包的实现(二)的相关文章

NOSDK--关于android一键打包及统一接入国内多个平台SDK的想法与实现(前言)

前言 一,一键打包的实现 1.1 shell文件介绍 1.2 自动刷新mk文件 1.3 自动拷贝资源 1.4 使用ant实现打包 1.5 拷贝icon 二,统一接入多个平台 1.1 nosdk框架介绍 1.2 nosdk_library基本库介绍 1.3 游戏逻辑与sdk平台的分离 1.4 xx平台接入示例 三,后记 做SDK平台接入工作已经有一年多了,自认对于大多平台的sdk都基本熟悉了,因此计划写一个系列的文章,介绍自己对于一键打包及统一接入多个平台sdk的一些想法与实现,算是对于这一年多的

cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)

链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程) 此教程仅供参考,C++小白系列,从新建工程到打包apk,大神们可在评论多给留言建议,若有不详或错误请予指点.OK,我们直入主题 本教程开发环境详情如下开发系统:win764位开发工具:cocos引擎v2.3.3,VS2013cocos2dx版本:3.9 步骤一:windows下各类工具安装(ja

html网站网址一键打包成App平台-开心App平台

开心APP在线打包平台可以快速封装网站变成APP,一键打包网站APP平台的出现,极大的降低的开发费用,几百块就可以制作一个体验不错的APP. 网站封装成APP的流程方便快捷!无需懂代码,会上网就能制作APP! 下面介绍使用开心APP平台将一个网站快速打包成APP 分七步进行 1.注册开心APP平台账号 2.创建APP.配置基本信息 3.配置扩展插件 4.配置打包项目 5.配置安卓证书 6.配置ios证书 7.编译APP 一.注册lbuilder平台账号 1.打开心APP官网http://www.

前端资源多个产品整站一键打包&包版本管理(一)

来新公司工作的第五个月.整站资源打包管理也提上了日程. 问题: 首先.什么是整站的打包管理呢? 我们公司的几个重要产品都在同一个webapp里面,但是,不同的开发部门独立开发不同的产品,长期以来,我们就不知道其他部门的在做什么,或许我们正在头疼的问题,隔壁部门已经早早解决了呢? 各个部门的前端资源也是到处都是.难以管理.于是就提出了整站资源共享.整站资源共享的前提就是资源打包能统一.在几个产品里面.既有使用grunt的也有使用glup的,各个产品引入的包的版本也不一样. 目标: 统一打包工具 对

ios 新的一键打包方式(基于Unity5.x)

                                                                      ios 新的一键打包方式(基于Unity5.x) 1.目前4.x的均可以使用第三方插件XUPorter进行修改framewordk,plist以及代码,但是可视化程度还不够 2.Unity5.x内部已经集成了XCode api函数,我们可以利用这些函数实行更方便的可实话,例如在excel填写相关的Xcode工程参数导出json或者xml,每次导出完工程后读取

cocos 3.0 一键打包android平台应该注意的细节

cocos2d-x 移植越来越便捷,走到cocos2d-x-3.0rc2,能够说移植已经非常完好了,我们仅仅要进行适当的适配,cocos能够直接帮助我们生成apk 我网络不好无法上传图片:(无图无捷豹,呵呵),好像又能够了,哎,这网络! (1)首先确保本地已下载下面软件: android-NDK   :任意找 android-SDK    :官网   developer.android.com/sdk/index.html apache-ant      :    任意找 java-jdk   

仿360一键清理实现(二)

--------------------------------------------------------------------- 编译环境:Android 4.0 测试环境:Android 4.2.2模拟器 屏幕分辨率:480*800 作者:疯狂小强 注意: 1.资源采集于网上,如有侵权请及时联系,以便处理. 2.代码仅用于学习交流,请勿商业化. -------------------------------------------------------------------- 仿

实力封装:Unity打包AssetBundle(二)

→前情提要:Unity最基本的AssetBundle打包方式. 第二种打包方式 Unity提供的BuildAssetBundles API还有一个重载形式,看下面↓↓ public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatfo

RPG MAKER MV 打包APK教程(一键打包,无需编写任何代码)

HTML一键打包APK工具可以快速打包RPG Maker制作出来的游戏, 打包教程如下: 打包软件下载地址: 点击进入下载页面 打包步骤 1.准备好待打包的RPG Maker项目,放在系统的某一目录下,如下图所示 2.打开HTML一键打包APK工具,在工具中点击载入文件按钮,选择RPG Maker生成的主HTML(index.html)文件 3.可以设置图标,启动图, APP包名等,设置完成后,点击打包按钮 4. 打包完成后,会生成APK文件,上传到手机中安装即可正常运行 打包软件详细说明: h

使用HTML一键打包EXE工具打包KRPANO全景项目

HTML一键打包EXE工具(HTML封装EXE, HTML转EXE)能把任意HTML项目(网址)一键打包为单个EXE文件,可以脱离浏览器和服务器,直接双击即可运行. 打包工具群:429338543 最新软件下载地址: 点击进入下载页面 HTML一键打包工具打包全景项目 打包流程 1. 首先,使用全景可视化制作工具导出H5离线项目,生成的本地项目如下图所示 2. 打开HTML一键打包EXE工具,点击"打开本地HTML文件", 选择全景项目中的index.html文件 3. 其他的一些配置