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對該工程所報的全部錯誤!
 
 
 
 
這章就完成!
相關文章
相關標籤/搜索