原创,转载请注明出处!
这几天有点时间研究了下android工程在mac打包的流程,之前项目的android工程都是在windows下完成的,现在转到mac下,总体感觉更方便了一些。
首先是编译工程
对应的命令就是 ant build_native 做的工作:
1. 把Resources目录下的复杂结构,展开复制到android工程下/assets/根目录下
2.. 把mm文件拷贝一份同名的cpp,方便统一编译
3. 编译所有文件,需要注意的是jni/android.mk文件 内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_shared
LOCAL_MODULE_FILENAME := libgame
# 定义 all-cpp-files 返回当前路径和 Classes 路径想的所有 cpp 文件,注意:这里只考虑 cpp 而没有 c,如果需要自行添加
define all-cpp-files
$(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.cpp"))
endef
# 这里使用新的方式替换换来的方式,以自动添加源文件
LOCAL_SRC_FILES := $(call all-cpp-files)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
#静态库不会产生.so, 它们将和动态库一起,打成一个.so库,放到apk包里
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_extension_static
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_lua_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,CocosDenshion/android)
$(call import-module,cocos2dx)
$(call import-module,extensions)
$(call import-module,scripting/lua/proj.android)
下面就是真正执行的编译动作
<target name="build_native" depends="mkdir_assets, copy_Resource" description="build all cpp files to .so file">
<echo message="--target Build Native--" />
<!--把mm文件 复制一份成cpp文件-->
<copy tofile="${basedir}/../Classes/Global/DeviceClass.cpp" file="${basedir}/../Classes/Global/DeviceClass.mm" />
<exec executable="sh">
<arg line="${basedir}/build_native.sh" />
</exec>
</target>
<!-- ************************* mkdir_assets **************** -->
<target name="mkdir_assets" description="mkdir_assets">
<delete dir="${basedir}/assets" />
<mkdir dir="${basedir}/assets" />
</target>
<!-- ************************* Copy Resource **************** -->
<target name="copy_Resource" description="copyResource">
<!--去掉svn 信息, 把所有文件递归拷贝到assets根目录下,不包括空目录-->
<copy todir="${basedir}/assets" flatten="true" includeemptydirs="false">
<fileset dir="${basedir}/../Resources">
<include name="**/*" />
<exclude name="**/.svn/*" />
</fileset>
</copy>
</target>
执行ant build_native, 编译完成
下面是批量打包,根据多个渠道号,批量打包apk
这一步首先看ant.properties
签名文件的密码,可以在这里指定,不然每打一个渠道包,都要手动输入一下,麻烦。
# The password will be asked during the build when you use the 'release' target.
sdk.dir=/Library/Android_Tools/SDK/adt-bundle-mac-x86_64-20130522/sdk
# 证书签名 use keystore to sign apk
key.store=/Users/raochongtao/Documents/Android_KeyStore/******
key.alias=********
# 证书密码 input the password manually, uncomment this
key.store.password=********
key.alias.password=********
#多个渠道号,
market_channels=channel_000,channel_001,channel_002,channel_003
#版本号
app_version=1_0_0
#导出路径
apk_location_name=antApk_apk
再就是关键的 打包动作,这一步参照了,网上多位作者的思路及代码,这里一并表示感谢
<!-- ************************* Make Channels **************** -->
<target name="make_channels" description="make channels">
<echo>--make_channel--</echo>
<foreach target="make_one_channel" list="${market_channels}" delimiter="," param="channel">
</foreach>
</target>
<!-- ************************* Make One Channel **************** -->
<target name="make_one_channel" depends="savemanifest,modify_update_file,release,copyto_antapkdir,replacemanifest,clean" description="make one channel">
<echo>--make one channel--</echo>
</target>
<!-- ************************Save Manifest******************* -->
<target name="savemanifest">
<echo>--savemanifest--</echo>
<copy file="${basedir}/AndroidManifest.xml" tofile="${basedir}/AndroidManifest_bak.xml" />
</target>
<!-- ************************Copyto_antapkdir******************* -->
<target name="copyto_antapkdir">
<echo>--copyto_antapkdir--</echo>
<copy file="${out.final.file}" tofile="${out.final.file.withchannel}" />
</target>
<!-- ************************Replace Manifest******************* -->
<target name="replacemanifest">
<echo>--replacemanifest--</echo>
<copy file="${basedir}/AndroidManifest_bak.xml" tofile="${basedir}/AndroidManifest.xml" overwrite="true" />
</target>
<!-- ************************modify update manifest******************* -->
<target name="modify_update_file">
<echo>--modify_update_file--</echo>
<replaceregexp file="${basedir}/AndroidManifest.xml" match="channel_someid" replace="${channel}" byline="false" encoding="utf-8" />
<property name="out.final.file.withchannel" value="${basedir}/${apk_location_name}/${ant.project.name}_${app_version}_${channel}.apk" />
</target>
<taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" classpath="${sdk.dir}/tools/lib/ant-contrib-1.0b3.jar" />
执行 ant make_channels
完成四个渠道包