python工具:cocos2d-x打包apk前的准备

packageApk.py

# encoding: utf-8
# -*- coding: utf-8 -*-
import os,os.path,sys,ctypes,time
import json
import codecs
import re
import hashlib
import socket
import shutil
import subprocess
import urllib
import urllib2
import xml.dom.minidom
from datetime import datetime
from os.path import join
import util

default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
   reload(sys)
   sys.setdefaultencoding(default_encoding)


#------------华丽分割线-------------------

def getProjectXMLConfigStr():
    pid = ''
    url = ''
    xml_path = full_path+'/res/values/strings.xml'
    try:
        dom = xml.dom.minidom.parse(r''+xml_path)
        root = dom.documentElement
        itemlist = root.getElementsByTagName('string')

        for item in itemlist:
            if item.getAttribute('name') == 'platform_id':
                pid = item.firstChild.data
            elif item.getAttribute('name') == 'userlogin_url':
                url = item.firstChild.data

    except Exception, e:
        printRed(("获取项目xml配置出错,请自行检查配置!!!path = "+xml_path+"\n").decode('utf8'))
    finally:
        strConf = '\n       -> platform_id = '+pid+'\n      -> userlogin_url = '+url
        return strConf

def compile_so_release():
    cmd='cocos.bat compile -q -p android --no-apk -m release --compile-script 0 -s '+ GAME_PATH
    pro=subprocess.Popen(cmd)
    pro.wait()
    return pro.returncode
def compile_so_debug():
    cmd='cocos.bat compile -q -p android --no-apk -m debug -s '+ GAME_PATH
    pro=subprocess.Popen(cmd)
    pro.wait()
    return pro.returncode
def compile_lua(path_source,path_target):
    cmd=r'cocos.bat luacompile -d '+path_target+' -s '+path_source+' -e -k key -b XXTEA'
    pro=subprocess.Popen(cmd)
    pro.wait()
    return pro.returncode

def compileSO():
    if isDebugApk:
        compile_so_debug()
    else:
        compile_so_release()

    sofilename = "libcocos2dlua.so"
    sofullpath = PROJ_PATH_PRE+FIRST_PROJ_NAME+"/libs/armeabi/"+sofilename
    if not os.path.exists(sofullpath):
        util.printRed("->[error]编译so失败!!!".decode('utf8'))
        os.system("pause")
        sys.exit(0)
    else:
        #拷贝so至当前项目\libs\armeabi\
        shutil.copy(sofullpath,full_path+"/libs/armeabi/")
        cur_sopath = full_path+"/libs/armeabi/"+sofilename
        if os.path.exists(cur_sopath):
            f_size = get_FileSize(cur_sopath)
            outstr = "%s%0.2f%s"%('    编译so成功,已拷贝至当前项目。文件大小:',f_size,"M \n")
            printYellow(outstr.decode('utf8'))
        else:
            outstr="%s%s%s"%('->[error]拷贝so失败!!!\n->路径:',cur_sopath,"\n")
            printRed(outstr.decode('utf8'))
            os.system("pause")
            sys.exit(0)

def splitPackage(path_tool):
    cmd=path_tool+'SplitPackage.bat'
    pro=subprocess.Popen(cmd)
    pro.wait()
    os.chdir(sys.path[0])  #调用SplitPackage时修改了当前路径,现恢复为原来的路径
    return pro.returncode

# 资源分包,放置到项目assets\res目录下
def splitResource():
    # 调用工具SplitPackage.bat,成功执行后,拷贝d:\client\res文件夹至proj.android.xxx\assets\
    path_tool=r'd:/tools/SplitPackage/'
    splitPackage(path_tool)

    if os.path.exists(r''+full_path+"assets/res/"):
        shutil.rmtree(r''+full_path+"assets/res")

    path_src_res = r''+path_tool+'output/res/'
    if os.path.exists(r''+path_src_res):
        printYellow('    拷贝分包后的资源至当前项目...\n'.decode('utf8'))
        printSkyBlue("    (please wait for a few minutes)\n")
        shutil.copytree(r''+path_src_res,full_path+"assets/res/")
        if not os.path.exists(r''+full_path+"assets/res/"):
            printRed('->[error]拷贝分包后的资源至当前项目失败!!!'.decode('utf8'))
            os.system("pause")
            sys.exit(0)
    else:
        outstr="%s%s%s"%('->[error]找不到分包后的资源!!! path = ',path_src_res,'\n')
        printRed(outstr.decode('utf8'))
        print(os.path.exists(r''+path_src_res))
        os.system("pause")
        sys.exit(0)


def compileLuac():
    # 编译luac,放置到项目assets\src目录下
    path_target = full_path+"/assets/src"
    path_source= GAME_PATH+"/src"

    if os.path.exists(path_target):
        shutil.rmtree(path_target)

    rcode = compile_lua(path_source,path_target)
    success = rcode == 0 and os.path.exists(path_target) and os.path.exists(path_target+"/main.luac")
    if success:
        util.printYellow('    编译luac成功,已拷贝至当前项目。\n'.decode('utf8'))
    else:
        util.printRed("->[error]编译luac失败!!!".decode('utf8'))
        os.system("pause")
        sys.exit(0)

#备份debug版本的so至 d:\tools\apk\debug_so\
def backupDebugSO():
    if isDebugApk:
        print("    当前Debug版本,跳过此步骤".decode('utf8'))
    else:
        compile_so_debug()

        sofilename = "libcocos2dlua.so"
        sofullpath = PROJ_PATH_PRE+FIRST_PROJ_NAME+"/libs/armeabi/"+sofilename
        if not os.path.exists(sofullpath):
            util.printRed("->[error]编译so_debug失败!!!".decode('utf8'))
            os.system("pause")
            sys.exit(0)
        else:
            path_debug = sys.path[0]+"/debug_so/"
            if not os.path.exists(path_debug):
                os.makedirs(path_debug)

            strtime = datetime.datetime.now().strftime('%Y%m%d')
            path_debug_cur = path_debug+strtime+"/"
            if os.path.exists(path_debug_cur):
                shutil.rmtree(path_debug_cur)
            os.makedirs(path_debug_cur)

            shutil.copy(sofullpath,path_debug_cur)
            if os.path.exists(path_debug_cur+sofilename):
                f_size = get_FileSize(path_debug_cur+sofilename)
                outstr = "%s%0.2f%s%s%s"%('    备份so_debug成功,文件大小:',f_size,"M。输出:",path_debug_cur,"\n")
                util.printYellow(outstr.decode('utf8'))
            else:
                util.printRed("->[error]备份so_debug失败!!!".decode('utf8'))



GAME_PATH = "d:/client"
PROJ_PATH_PRE = "d:/client/frameworks/runtime-src/"
FIRST_PROJ_NAME = "proj.android"

full_path = ""
isDebugApk = False

if __name__ == '__main__':
    util.printGreen('-------------------------------------------------\n')
    util.printGreen('--------- [ 此工具用于打包Apk前的准备 ] ---------\n'.decode('utf8'))
    util.printGreen('-------------------------------------------------\n')
    util.printRed('[!]使用前请确保本地所有文件svn版本与期望一致\n'.decode('utf8'))
    util.printGreen("输入打包的项目文件夹名,形如proj.android.xxx。N键退出...\n".decode('utf8'))
    inputstr = raw_input("   input: ".decode('utf-8').encode('gbk'))
    if inputstr == "N" or inputstr == "n":
        util.printRed("取消操作!\n".decode('utf8'))
    else:
        sourcefolder = inputstr
        full_path = PROJ_PATH_PRE+sourcefolder+"/"
        if not os.path.exists(full_path):
            outstr="%s%s%s"%('->[error]项目路径不存在!!!\n->请检查全路径:',full_path,"\n")
            util.printRed(outstr.decode('utf8'))
        else:
            outstr="%s%s%s"%('需要打包的项目为->',sourcefolder,"\n")
            util.printYellow(outstr.decode('utf8'))
            util.printSkyBlue("按N键退出,其他任意输入继续...".decode('utf-8'))
            inputstr = raw_input("   input: ".decode('utf-8').encode('gbk'))
            if inputstr=="N" or inputstr == "n":
                util.printRed("取消操作!\n".decode('utf8'))
            else:
                str_conf = getProjectXMLConfigStr().decode('utf8')
                outstr="%s%s%s"%('\n打包前请确认项目配置:',str_conf,"\n")
                util.printYellow(outstr.decode('utf8'))

                util.printSkyBlue("按N键退出,其他任意输入继续...".decode('utf-8'))
                inputstr = raw_input("   input: ".decode('utf-8').encode('gbk'))
                if inputstr=="N" or inputstr == "n":
                    util.printRed("取消操作!\n".decode('utf8'))
                else:
                    # select debug or release apk
                    util.printGreen("\n默认打包release,换debug请输入debug,否则按默认继续...".decode('utf-8'))
                    inputstr = raw_input("   input: ".decode('utf-8').encode('gbk'))
                    if inputstr.lower()=="debug":
                        isDebugApk = True
                    else:
                        isDebugApk = False

                    outstr="%s%s"%('\n\n开始打包项目...   ',sourcefolder)
                    util.printYellow(outstr.decode('utf8'))

                    util.printYellow("\n> 1. 开始编译so...\n".decode('utf8'))
                    util.printSkyBlue("    (please wait for a few minutes)\n")
                    compileSO()
                    util.printYellow("\n> 2. 开始资源分包...\n".decode('utf8'))
                    splitResource()
                    util.printYellow("\n> 3. 开始编译luac...\n".decode('utf8'))
                    compileLuac()
                    util.printYellow("\n> 4. 开始备份debug版本so...\n".decode('utf8'))
                    util.printSkyBlue("    (please wait for a few minutes)\n")
                    backupDebugSO()
                    util.printYellow("\n> 5. 使用Eclipse导出apk\n".decode('utf8'))
                    util.printRed("    【最后一步】请手动操作!!!\n".decode('utf8'))
                    util.printRed("    -> 使用Eclipse打开Android项目,先清理刷新,右键菜单导出apk。\n".decode('utf8'))
                    util.printGreen('---------------------------------\n')
                    util.printGreen('------------ [ End ] ------------\n')
                    util.printGreen('---------------------------------\n')


os.system("pause")

util.py

# encoding: utf-8
# -*- coding: utf-8 -*-
import os,os.path,sys,ctypes,time
import json
import codecs
import re
import hashlib
import socket
import shutil
import subprocess
import urllib
import urllib2
import xml.dom.minidom
import datetime
from os.path import join,getsize

default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
   reload(sys)
   sys.setdefaultencoding(default_encoding)


#------------华丽分割线-------------------

# 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色
#由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中

# Windows CMD命令行 字体颜色定义 text colors
FOREGROUND_BLACK = 0x00 # black.
FOREGROUND_DARKBLUE = 0x01 # dark blue.
FOREGROUND_DARKGREEN = 0x02 # dark green.
FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
FOREGROUND_DARKRED = 0x04 # dark red.
FOREGROUND_DARKPINK = 0x05 # dark pink.
FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
FOREGROUND_DARKWHITE = 0x07 # dark white.
FOREGROUND_DARKGRAY = 0x08 # dark gray.
FOREGROUND_BLUE = 0x09 # blue.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_SKYBLUE = 0x0b # skyblue.
FOREGROUND_RED = 0x0c # red.
FOREGROUND_PINK = 0x0d # pink.
FOREGROUND_YELLOW = 0x0e # yellow.
FOREGROUND_WHITE = 0x0f # white.

# Windows CMD命令行 背景颜色定义 background colors
BACKGROUND_BLUE = 0x10 # dark blue.
BACKGROUND_GREEN = 0x20 # dark green.
BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
BACKGROUND_DARKRED = 0x40 # dark red.
BACKGROUND_DARKPINK = 0x50 # dark pink.
BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
BACKGROUND_DARKWHITE = 0x70 # dark white.
BACKGROUND_DARKGRAY = 0x80 # dark gray.
BACKGROUND_BLUE = 0x90 # blue.
BACKGROUND_GREEN = 0xa0 # green.
BACKGROUND_SKYBLUE = 0xb0 # skyblue.
BACKGROUND_RED = 0xc0 # red.
BACKGROUND_PINK = 0xd0 # pink.
BACKGROUND_YELLOW = 0xe0 # yellow.
BACKGROUND_WHITE = 0xf0 # white.

STD_OUTPUT_HANDLE = -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
def set_cmd_text_color(color, handle=std_out_handle):
    Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
    return Bool
def resetColor():
     set_cmd_text_color(FOREGROUND_DARKWHITE)
def printRed(mess):
    set_cmd_text_color(FOREGROUND_RED)
    sys.stdout.write(mess)
    resetColor()
def printGreen(mess):
    set_cmd_text_color(FOREGROUND_GREEN)
    sys.stdout.write(mess)
    resetColor()
def printSkyBlue(mess):
    set_cmd_text_color(FOREGROUND_SKYBLUE)
    sys.stdout.write(mess)
    resetColor()
def printYellow(mess):
    set_cmd_text_color(FOREGROUND_YELLOW)
    sys.stdout.write(mess)
    resetColor()

#获取文件大小,单位M,保留2位小数
def get_FileSize(filePath):
    filePath = unicode(filePath,'utf8')
    fsize = os.path.getsize(filePath)
    fsize = fsize/float(1024*1024)
    return round(fsize,2)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值