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