gradle打包多渠道cocos2dx

     先说明一下本人的技术与岗位背景吧,方便你们理解,要吐槽的请当看笑话一下样,跳过!html

本人自2013年3月进入某得的,那个时候我只有一年左右的cocos2d-x的开发经验,说多很少,说少很多!在进入某得以前,我一个好朋友总是对我说,某得如今有一套很好的技术,想让我去学习一下某得的技术(朋友以前也是某得的员工,但在我进去以前就已经离开了!)传说中的opencore(我不想吐槽这技术的)。
     如今回归主题,在项目将要完成的时候,我接到一个我还没有接触过的工做。那就是写一个build包工具!!从接到工做开始,我一直想直接用aapt之类的来解决这个build问题,由于那个时候项目已经有13个android渠道了,若是仍是用传统的eclipse来build包的话,那就坑大发了!在天朝下,android的平台据说有近百个,要死了!
     gradle:一个屌炸天的工具出现了,这货竟然是好几年前就出现了,看来专心搞同样东西,一样会让人视野更小了!具体什么是gradle, 我就不说了。本身百度去!怎么弄环境,想信不用我教,本身去看官方文档!
     由于咱们的项目是便用cocos2dx开发,因此咱们使用的都是同一个.so,而java代码却只有那么几个文件,并且咱们每一个渠道在项目一开始就已经被其它人定死了,每个渠道都要使用一个新的工程!结果就致使咱们项目以下这样子的结构!
screenshot.png
 
看到这样子的结构是否是有点蛋碎的赶脚 ?反正我是看得很不爽!
     既然工程已经生成了,那若是要我一个一个工程去写.gradle文件,那不是要写死我?因此,我作了如下的决定!!!
打开eclipse!
把全部的target和其相依赖的工程所有都导入到eclipse里!
 
export;
 
在eclipse里,里面就有一个gradle,爽吧,但别高兴太早了,后面会坑你的!一路next,一直到出现下面这个界面
 
在这里,咱们须要选中你全部相关的项目,这样子你的target里才会包括全部的项目哦!
 
框内说的是,gradle已经存在,是否要覆盖?而后next到完成!
到些时,全部的工程都一次性导完了。
     重头戏开始了!!
咱们cd到整个工程的根目录(这个根目录,就是刚刚用eclipse导出gradle的目录),好比的我就在client,执行一下如下命令
gradle clean
这个时候,你会download一些gradle相关的东西,而且对gradle进行一些初始化!
若是网络和你的gradle环境没有问题的话,那么你clean应该是successful的。
兴奋了吧,就这么简单就完成了!如今开始build包了哦!
咱们在command里键入如下命令!
gradle build
这个时发,已经在build包了!

半个小时完了,你很操蛋地发现,build得也太漫长了吧?对,我也是这么以为,每一个包都build一下工程的c++代码,这个够恶心,当初我接第三方平台的时候就是不想第个平台都要build一次c++,想让cocos2dx的代码能作到最大程度上的通用作了好多工做呀,若是还让你继续build下去,那不是白用功了?不行!因此我决定把每一个工程的c++ builder给去掉,而后从新导出一个gralde。可是若是没有c++ builder,那么c++的代码怎么办?在cocos2dx里,若是没有c++的.so库,那么游戏绝对跑不起来!难道要我先编译一次全部的c++代码,而后一个一个地copy到每个工程里?话说这个主鄣挺不错的,咱们用shell去作这些就行啦,一个合格的程序员,若是没有一两门脚本技术,根本就活不下去呀!在某得用到的shell技术,我会另开一个文章说明的!
我用到的方是这样子的!若是的其它方法或不错的建议,能够发到我邮箱 戳这,
先copy珍上项目,该项目咱们只是须要其帮咱们编译c++文件便可!
因此咱们修改其build_native.sh文件,让其为我工做!
修改以下:
APPNAME="HeroLegend"

# options

buildexternalsfromsource=

usage(){
cat << EOF
usage: $0 [options]

Build C/C++ code for $APPNAME using Android NDK

OPTIONS:
-s    Build externals from source
-h    this help
EOF
}

while getopts "sh" OPTION; do
case "$OPTION" in
s)
buildexternalsfromsource=1
;;
h)
usage
exit 0
;;
esac
done

# paths

if [ -z "${NDK_ROOT+aaa}" ];then
echo "please define NDK_ROOT"
exit 1
fi

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# ... use paths relative to current directory
COCOS2DX_ROOT="$DIR/../../opencore"
GOODSDK="$DIR/../../SDK/XIAOMISdk"
APP_ROOT="$DIR/.."
APP_ANDROID_ROOT="$DIR"

# run ndk-build
if [[ "$buildexternalsfromsource" ]]; then
    "$NDK_ROOT"/ndk-build -C "$APP_ANDROID_ROOT" $* \
        "NDK_MODULE_PATH=${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/source"
else
    "$NDK_ROOT"/ndk-build -C "$APP_ANDROID_ROOT" $* \
        "NDK_MODULE_PATH=${COCOS2DX_ROOT}:${COCOS2DX_ROOT}/cocos2dx/platform/third_party/android/prebuilt"
fi

 

我已经把cocos2dx里的一些什么asset的复制呀,给去掉了,只留下一个ndk的build。
当该copy出来的项目编译完成,我再将这些.so copy到每一个target里!
上我使用的shell
echo ------------------------------------------
echo '如今开始build包了哦,请耐心等待'
echo 'create by Windy Chen'
echo 'if founded the problem, please call me !'
echo 'Email: chiefcto@gmail.com'
echo ------------------------------------------
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

function check() {
bb=`echo $1|grep 'proj.android'|wc -l`
if [ $bb = 0 ]
then
   echo "not an android project"
else
  bbb=`echo $1|grep 'proj.android_pmangplus'|wc -l`
  if [ $bbb = 0 ]
  then
    echo "Copy the *.so file to this project($1)"
    echo 'Please waitting for a while'
    echo ------------------------------------------
    $1/build_native.sh
    echo ------------------------------------------
  else
    echo "This is PmangPlus, not contain"
  fi
fi
}

# 编译c++文件
echo 如今开始作有sdk的游戏原码进行编译
#"$dir"/HeroLegend/proj.android_CPL_SDK/build_native.sh

# 复制.so游戏库
echo 把proj.android_CPL_SDK里的libgdmmo4.so复制到所要的工程下
echo 工程在includeProject里配置
echo 开始copy

cat includeProject | while read project; do
echo 开始copy$project
"$dir"/HeroLegend/"proj.android_$project"/build_native.sh
done

#for file in "$dir"/HeroLegend/*
#do
#  if [ -d "$file" ]; then
#    check $file
#  fi
#done

#当全部的资源都已经复制到游戏目录的时候,开始用gradle打包
echo 如今开始使用gradle打包游戏包
echo 打包所要gradle环境
echo 开始打包
echo waitting for a while
gradle build
echo 若是中途没有中断,没有出现failed,那么就打包成功了!

 



其中,每一个项目的buid_native.sh仍是会执行一次,在为有些sdk还须要一些特殊的copy!!!所我把.so的copy也放到每一个工程的.build_native.sh里去了!
就这样,我每次只要直接执行autoPkg.sh就完成打包了!


大概几分钟后,悲剧了~~一大堆错~~坑爹 !
这么多工程,怎么看呀!
认真看一下根目录,你会发现一个很嚣张的家伙
 
这个家伙里就有不少项目工程里要用的工程,我把那些目前尚未报错和与报错项目不相关的工程移除掉!这样子就可以一个一个地编译,一个个项目的问题来解决了!当全部的问题改完,直接一次出全部包,爽歪歪呀!
但真实状况以下,出完包后,一点就闪退~
问题是这样子的,虽然咱们已经把.so放到了对应的目录下了,但gradle并无把.so copy到打包资源里~因此咱们要对每一个.gradle进行修改!只要添加如下代码就能够了!
和dependencies,android同一层,直接添加
task copyNativeLibs(type: Copy) {
    from(new File('libs'))
    into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
 
clean.dependsOn 'cleanCopyNativeLibs'
 
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}

 


这样子,.so文件就copy进去,出来的包也没有问题!


其它的一些问题,
签名:
android{
}
signingConfigs {
      myConfig{
        storeFile file("../XXX.keystore")
           storePassword "******"
           keyAlias "keyAlias"
           keyPassword “*******"
      }
    }
   
    buildTypes{
      release {
           signingConfig  signingConfigs.myConfig
      }
    }
 
 
忽略一些可有可无的error
lintOptions{
disable ‘issusid’,“issusid”。。。。。。
其它问题的话,能够自行看gradle报的错误英文。
而且,在每一个工程的目录下gradle都会生成一个build文件夹,里面有生成的apk等,其中就有一份lint-results.html文件,打开的话,里机包含gradle对该工程所报的全部错误!
 
 
 
 
这章就完成!
相关文章
相关标签/搜索