PY脚本打包AS多个工程

build_quanjiatong.py

#!/usr/bin/env python
# coding:utf-8

'''
Created on Feb 16, 2017

@author: xwang

Ai学全家桶打包
'''

import os
import helper
import shutil

rootDir = '..'
configFile = 'quanjiatong.prop'
returnDir = ''
purge_log = 0
versionCode = "1000000"
versionName = "1.0.0"
minifyEnabled = "false"


def getFileList(dir, fileList):
    newDir = dir
    if os.path.isfile(dir):
        fileList.append(dir.decode('gbk'))
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            # 如果需要忽略某些文件夹,使用以下代码
            # if s == "xxx":
            # continue
            newDir = os.path.join(dir, s)
            getFileList(newDir, fileList)
    return fileList

def updateVersion():
    print("start updateVersion")
    with open("app/build.gradle", "r") as f:
        lines = f.readlines()

    spaceSplitedProps = ('versionCode',
                         'versionName',
                         'minifyEnabled')

    i = 0
    versionCodeChanged = False
    versionNameChanged = False

    for line in lines:

        line = line.strip()
        if (len(line) == 0):
            i = i + 1
            continue;

        for propName in spaceSplitedProps:
            if propName in line:
                if (propName == 'versionCode' and versionCodeChanged == False):
                    lines[i] = '        versionCode ' + versionCode + '\n'
                    print("lines[i]--》 " + lines[i])
                    versionCodeChanged = True
                if (propName == 'versionName' and versionNameChanged == False):
                    lines[i] = '        versionName ' + versionName + '\n'
                    print("lines[i]--》 " + lines[i])
                    versionNameChanged = True
                if (propName == 'minifyEnabled'):
                    lines[i] = '            minifyEnabled ' + minifyEnabled + '\n'
                    print("lines[i]--》 " + lines[i])

        i = i + 1
    fl=open('app/build.gradle', 'w')
    for ii in lines:
        fl.write(ii)
    fl.close()
    return


def buildApk(project):
    os.chdir(returnDir)
    print os.getcwd()
    # exit(0)
    os.chdir('../../../' + project)
    print("curProPath --> " + os.getcwd())

    updateVersion()
    # exit(0)

    buildApkPath = os.getcwd()
    print os.getcwd()

    apkSourceDir = buildApkPath + '/app/build/outputs/apk'
    print(os.path.exists(apkSourceDir))
    if os.path.exists(apkSourceDir):
        print ("delete origin apk folder...")
        shutil.rmtree(apkSourceDir)

    tmpRootDir = os.path.abspath(rootDir)
    dstDir = tmpRootDir + '/shared-library/comm/aixuebuild'

    print ("purge_log --> " + purge_log)
    if purge_log == '1':
        print ("purge log...")
        helper.watchExecuteCommand(dstDir + '/purge_log.py ' + project)
    helper.watchExecuteCommand('./gradlew assembleRelease')

    print("tmpRootDir : " + tmpRootDir)

    if not os.path.exists(dstDir):
        helper.watchExecuteCommand('mkdir -p', dstDir)

    print("buildApkPath : " + buildApkPath)

    print("apkSourceDir : " + apkSourceDir)

    apkSourceName = getFileList(apkSourceDir, [])
    print("apkSourceName : " + apkSourceName[0])

    cmd = 'cp ' + apkSourceName[0] + ' ' + dstDir
    print('copy cmd --> ' + cmd)
    helper.watchExecuteCommand(cmd, cmdAlias='copy plugin to: ' + dstDir)
    if purge_log == '1':
        helper.watchExecuteCommand('git reset --hard')


if __name__ == '__main__':
    configs = helper.readPropertyFile(configFile)
    quanjiatongs = configs['quanjiatongs']
    qianjiatongArray = quanjiatongs.split(',')
    qianjiatongArray = map(lambda x: x.strip(), qianjiatongArray)

    returnDir = os.getcwd()

    purge_log = configs['purge_log']
    versionCode = configs['versionCode']
    versionName = configs['versionName']
    minifyEnabled = configs['minifyEnabled']

    for e in qianjiatongArray:
        print e
        buildApk(e);

        # exit(0);


helper.py

'''
Created on Mar 7, 2016

@author: lqp
'''

import os
import re
import sys
import subprocess as subproc

projectRoot = ''

logFile = None


def buildLog(msg):
    if logFile:
        logFile.write(msg + '\n')

    print(msg)


# tool module code start
def watchExecuteCommand(cmd, args='', cmdAlias=None):
    if not cmdAlias:
        cmdAlias = cmd
    else:
        cmdAlias = '[' + cmdAlias + ']'

    buildLog('Cmd: ' + cmdAlias + " " + args)

    code = subproc.Popen(cmd + " " + args, shell=True).wait()
    if code:
        print 'Fail: ' + str(code)
        exit()
    else:
        print 'Success !!!'


def collectFilesByPattern(folder, include=None, exclude=None):
    if not os.path.isdir(folder):
        buildLog('collectFilesByPattern: folder not exist: ' + folder)
        return []

    srcFiles = []

    fileList = os.listdir(folder)
    for i in fileList:
        i = folder + '/' + i
        if os.path.isdir(i):
            srcFiles += collectFilesByPattern(i, include, exclude)
        else:
            if include and not re.match(include, i):
                continue

            if exclude and re.match(exclude, i):
                continue

            srcFiles.append(i)

    return srcFiles


def strUntil(string, endChar):
    res = ''

    for c in string:
        if c == endChar:
            break;

        res += c

    return res


def error(string):
    sys.exit("Error: " + string)
    return


def stripQuotedString(string):
    res = string

    if (string.startswith('\'') and string.endswith('\'')) \
            or (string.startswith('"') and string.endswith('"')):
        res = string[1:-1]

    return res


def stripProjectString(string):
    res = string

    if (string.startswith('\'') and string.endswith('\'')) \
            or (string.startswith('"') and string.endswith('"')):
        res = string[1:-1]

    if res.startswith(":"):
        res = res[1:]

    return res


def expandJarPath(libString, pathPrefix=None):
    pathList = []

    splitItems = libString.split(',')
    for item in splitItems:
        if 'dir' in item:
            dirItem = item.split(':')[1].strip()
            dirItem = stripQuotedString(dirItem)
        elif 'include' in item:
            pass

    libDir = dirItem
    if pathPrefix:
        libDir = projectRoot + '/' + pathPrefix + '/' + libDir
    else:
        libDir = os.getcwd() + '/' + libDir

    if not os.path.exists(libDir):
        # print("libPath: " + libDir + " not exist")
        return

    libFiles = os.listdir(libDir)
    for libFile in libFiles:
        if libFile.endswith('.jar'):
            pathList.append(libDir + '/' + libFile)

    return pathList


def deDuplicateStringList(srcList):
    if len(srcList) == 0:
        return srcList

    item = srcList.pop()
    dstList = []

    while item:

        if item not in dstList:
            dstList.append(item);

        if len(srcList) > 0:
            item = srcList.pop()
        else:
            item = None

    srcList += dstList
    return


def readPropertyFile(path):
    dicts = {}

    lines = []
    with open(path) as fd:
        for line in fd.readlines():
            if re.match(r'^\s*#', line) or '=' not in line:
                continue
            else:
                # print('append property line:' + line)
                if line.endswith('\n'):
                    line = line[:len(line) - 1]
                    
                lines.append(line)

    for line in lines:
        items = line.split('=')

        dicts[items[0].strip()] = items[1].strip()

    return dicts

    # tool module code end

purge_log.py

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

'''
Created on Mar 5, 2015

@author: lqp
'''

import os
import re
import helper

import os.path as pathUtil

bbLogRegPattern = re.compile(r'(^\s*)(BBLog\.[^;]+;)', re.DOTALL | re.MULTILINE);
normalLogRegPattern = re.compile(r'(^\s*)(Log\.[^;]+;)', re.DOTALL | re.MULTILINE);

workDir = '../';
srcFolder = ['app/src/main/java'
              ];
processCount = 0


def listFiles(path, outList):
    files = os.listdir(path);

    for item in files:
        item = path + pathUtil.sep + item;

        if pathUtil.isdir(item):
            listFiles(item, outList);
        else:
            if pathUtil.splitext(item)[1] == '.java':
                outList.append(item)

    return


def processFile(fileName):
    srcFile = open(fileName, "r");
    content = srcFile.read()
    srcFile.close()

    global workDir
    needWrite = 0

    # replace BBlog
    groups = bbLogRegPattern.findall(content);
    if len(groups) > 0:
        global processCount

        print 'purge BBLog in: ' + pathUtil.relpath(fileName, workDir);

        content = re.sub(bbLogRegPattern, r'\1//BBLog call replaced', content);

        needWrite = 1

    ##replace Log.x()
    groups = normalLogRegPattern.findall(content);
    if len(groups) > 0:
        global processCount

        print 'purge Log.x in: ' + pathUtil.relpath(fileName, workDir);

        content = re.sub(normalLogRegPattern, r'\1//Log.x call replaced', content);

        needWrite = 1

    if needWrite:
        srcFile = open(fileName, "w");
        srcFile.write(content)
        srcFile.close()
        processCount = processCount + 1

    return


if __name__ == '__main__':
    if len(os.sys.argv) < 2:
        helper.error('Usage: ' + os.sys.argv[0] + ' projectName')

    projectName = os.sys.argv[1]
    print("projectName --> " + projectName)

    holderList = []

    workDir = pathUtil.abspath(workDir) + "/" + projectName

    print 'start work at dir: ' + workDir

    for folder in srcFolder:
        listFiles(workDir + os.path.sep + folder, holderList);
    #listFiles(workDir, holderList);

for item in holderList:
    print("item --> " + item)
    processFile(item)

print 'process complete: ' + str(processCount) + ' files changed'
pass

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容