def add_apk_list(srcdir, outdir, sque, dque): #获得项目名 --name doc_project = ET.parse(os.path.join(srcdir, ".project")) project_name = doc_project.find("name").text util.print_D(project_name) if (os.path.isfile( os.path.join(srcdir, "bin", project_name + "-release.apk"))): sque.append(os.path.join(srcdir, "bin", project_name + "-release.apk")) dque.append(os.path.join(outdir, project_name + "-release.apk")) elif (os.path.isfile( os.path.join(srcdir, "bin", project_name + "-release-unsigned.apk"))): sque.append( os.path.join(srcdir, "bin", project_name + "-release-unsigned.apk")) dque.append( os.path.join(outdir, project_name + "-release-unsigned.apk")) elif (os.path.isfile( os.path.join(srcdir, "bin", project_name + "-debug.apk"))): sque.append(os.path.join(srcdir, "bin", project_name + "-debug.apk")) dque.append(os.path.join(outdir, project_name + "-debug.apk")) else: util.print_E("ERROR: " + srcdir + " has not build !!!") sys.exit(-1)
def copy_result_list(sque, dque): while True: if len(sque) == 0 or len(dque) == 0: break src = sque.popleft() dst = dque.popleft() util.print_V(src + " => " + dst + "\n") copy_(src, dst) util.print_D(src + " => " + dst)
def copy_result_list(sque, dque): while True: if (len(sque) == 0 or len(dque) == 0): break src = sque.popleft() dst = dque.popleft() util.print_V(src + " => " + dst + "\n") copy_(src, dst) util.print_D(src + " => " + dst)
def copy_(src, dst): if os.path.isdir(src): util.copytree(src, dst) elif os.path.isfile(src): util.print_D(src + " => " + dst) if not os.path.isdir(os.path.dirname(dst)): os.makedirs(os.path.dirname(dst)) shutil.copyfile(src, dst) else: util.print_E("ERROR: " + src + " is not either a file or dir") sys.exit(-1)
def copy_(src, dst): if (os.path.isdir(src)): util.copytree(src, dst) elif (os.path.isfile(src)): util.print_D(src + " => " + dst) if (not os.path.isdir(os.path.dirname(dst))): os.makedirs(os.path.dirname(dst)) shutil.copyfile(src, dst) else: util.print_E("ERROR: " + src + " is not either a file or dir") sys.exit(-1)
def copy_out(srcname, dstname): util.print_D("srcname : " + srcname) util.print_D("dstname : " + dstname) srcqueue = deque([]) dstqueue = deque([]) if not os.path.isdir(dstname): os.makedirs(dstname) add_out_release_list(srcname, dstname, srcqueue, dstqueue) copy_result_list(srcqueue, dstqueue) del_svn(dstname) print "拷贝完成"
def add_lib_ref_list(srcdir, outdir, sque, dque): #读取android.library.reference.n 生成依赖库中的ant配置文件 ref_library = [] fproject_properties = open(os.path.join(srcdir, "project.properties"), "r") for line in fproject_properties: if line.startswith("android.library.reference."): ref_library.append(line.split('=')[1].strip().replace("\\", "/")) fproject_properties.close() util.print_D(ref_library) #获得项目名 --name doc_project = ET.parse(os.path.join(srcdir, ".project")) project_name = doc_project.find("name").text util.print_D(project_name) for file in os.listdir(os.path.join(srcdir, "libs")): if (os.path.splitext(file)[1] == ".jar"): sque.append(os.path.join(srcdir, "libs", os.path.basename(file))) dque.append(os.path.join(outdir, "libs", os.path.basename(file))) if os.path.isdir(os.path.join(srcdir, "jni")): if (not os.path.isdir(os.path.join(srcdir, "libs", "armeabi"))): util.print_E("ERROR: " + srcdir + "native code is not build!!!") sys.exit(-1) for d in os.listdir(os.path.join(srcdir, "libs")): if ("mips armeabi-v7a armeabi x86".find(os.path.basename(d)) > -1): sque.append(os.path.join(srcdir, "libs", os.path.basename(d))) dque.append(os.path.join(outdir, "libs", os.path.basename(d))) if (os.path.isfile(os.path.join(srcdir, "bin", "classes.jar"))): sque.append(os.path.join(srcdir, "bin", "classes.jar")) dque.append(os.path.join(outdir, "libs", project_name + ".jar")) else: util.print_E("ERROR: " + srcdir + " has not build !!!") sys.exit(-1) if (os.path.isfile( os.path.join(srcdir, "bin", "proguard", "obfuscated.jar"))): sque.append(os.path.join(srcdir, "bin", "proguard", "obfuscated.jar")) dque.append( os.path.join(outdir, "libs", project_name + "_proguard_obfuscated.jar")) #查询依赖库 for lib_dir in ref_library: add_lib_ref_list(os.path.join(srcdir, lib_dir), outdir, sque, dque)
def add_apk_list(srcdir, outdir, sque, dque): # 获得项目名 --name doc_project = ET.parse(os.path.join(srcdir, ".project")) project_name = doc_project.find("name").text util.print_D(project_name) if os.path.isfile(os.path.join(srcdir, "bin", project_name + "-release.apk")): sque.append(os.path.join(srcdir, "bin", project_name + "-release.apk")) dque.append(os.path.join(outdir, project_name + "-release.apk")) elif os.path.isfile(os.path.join(srcdir, "bin", project_name + "-release-unsigned.apk")): sque.append(os.path.join(srcdir, "bin", project_name + "-release-unsigned.apk")) dque.append(os.path.join(outdir, project_name + "-release-unsigned.apk")) elif os.path.isfile(os.path.join(srcdir, "bin", project_name + "-debug.apk")): sque.append(os.path.join(srcdir, "bin", project_name + "-debug.apk")) dque.append(os.path.join(outdir, project_name + "-debug.apk")) else: util.print_E("ERROR: " + srcdir + " has not build !!!") sys.exit(-1)
def add_lib_ref_list(srcdir, outdir, sque, dque): # 读取android.library.reference.n 生成依赖库中的ant配置文件 ref_library = [] fproject_properties = open(os.path.join(srcdir, "project.properties"), "r") for line in fproject_properties: if line.startswith("android.library.reference."): ref_library.append(line.split("=")[1].strip().replace("\\", "/")) fproject_properties.close() util.print_D(ref_library) # 获得项目名 --name doc_project = ET.parse(os.path.join(srcdir, ".project")) project_name = doc_project.find("name").text util.print_D(project_name) for file in os.listdir(os.path.join(srcdir, "libs")): if os.path.splitext(file)[1] == ".jar": sque.append(os.path.join(srcdir, "libs", os.path.basename(file))) dque.append(os.path.join(outdir, "libs", os.path.basename(file))) if os.path.isdir(os.path.join(srcdir, "jni")): if not os.path.isdir(os.path.join(srcdir, "libs", "armeabi")): util.print_E("ERROR: " + srcdir + "native code is not build!!!") sys.exit(-1) for d in os.listdir(os.path.join(srcdir, "libs")): if "mips armeabi-v7a armeabi x86".find(os.path.basename(d)) > -1: sque.append(os.path.join(srcdir, "libs", os.path.basename(d))) dque.append(os.path.join(outdir, "libs", os.path.basename(d))) if os.path.isfile(os.path.join(srcdir, "bin", "classes.jar")): sque.append(os.path.join(srcdir, "bin", "classes.jar")) dque.append(os.path.join(outdir, "libs", project_name + ".jar")) else: util.print_E("ERROR: " + srcdir + " has not build !!!") sys.exit(-1) if os.path.isfile(os.path.join(srcdir, "bin", "proguard", "obfuscated.jar")): sque.append(os.path.join(srcdir, "bin", "proguard", "obfuscated.jar")) dque.append(os.path.join(outdir, "libs", project_name + "_proguard_obfuscated.jar")) # 查询依赖库 for lib_dir in ref_library: add_lib_ref_list(os.path.join(srcdir, lib_dir), outdir, sque, dque)
sys.exit(0) elif opt in ("-d", "--debug"): build_debug = True elif opt in ("-p", "--path"): project_dir = arg if len(args) > 1: util.print_E("参数错误\n") _help() sys.exit(2) elif len(args) > 0: p_dir = args[0] else: p_dir = "" util.print_D("p_dir = %s" % p_dir) util.print_D("build_debug = %s" % build_debug) util.print_D("project_dir = %s" % project_dir) if (len(project_dir) > 0): project_path = os.path.abspath(project_dir) release_path = os.path.abspath(os.path.join("release", project_dir)) util.print_D(project_path) compile_code(project_path, build_debug) copy_result.copy_out(project_path, release_path) else: xmlfile = os.path.join(p_dir, "config.xml") if (os.path.isfile(xmlfile)): pathList = [] util.go_through_xml(xmlfile, pathList) project_path = os.path.abspath(os.path.join(*pathList))
def config(workspace): extern_jar = [] islib = "" ref_library = [] print "\n处理workspace = %s " % workspace if not os.path.isdir(workspace): util.print_E("ERROR: 文件夹不存在") return #.classpath project.properties local.properties #sed -i 's@\\@/@g' project.properties for f in [".classpath", "project.properties", "local.properties"]: if os.path.isfile(os.path.join(workspace, f)): sed_cmd = "sed -i 's@\\\\@/@g' %s" % (os.path.join(workspace, f)) util.print_D(sed_cmd) os.system(sed_cmd) #获得项目名 --name doc_project = ET.parse(os.path.join(workspace, ".project")) project_name = doc_project.find("name").text util.print_D(project_name) #获得external jar doc_classpath = ET.parse(os.path.join(workspace, ".classpath")) for node in doc_classpath.findall("classpathentry"): if node.get("kind", default=None) == "lib": extern_jar.append(node.get("path", default=None)) util.print_D(extern_jar) #获得android.library fproject_properties = open(os.path.join(workspace, "project.properties"), "r+") for line in fproject_properties: util.print_D(line) if line.startswith("android.library="): islib = line.split('=')[1].strip() if ostype == "cygwin" or ostype == "win32": android_bat = "android.bat" else: android_bat = "android" #运行android.bat 脚本生成ant配置文件 if not islib.lower() == "true": command = "%s update project --path %s --name %s --target android-19" \ % (android_bat, workspace, project_name) else : command = "%s update lib-project --path %s --target android-19" \ % (android_bat, workspace) if os.path.isfile(os.path.join(workspace, "build.xml")): util.print_W("WARNNING: 该项目已经存在build.xml文件,如需重新生成,请删除该项目中的build.xml文件") status,output = 0, "" else: util.print_D(command) (status, output) = commands.getstatusoutput(command) print output if (not status == 0) or (output.find("Error:") > -1): util.print_E("ERROR: ant配置文件更新失败") else: #读取android.library.reference.n 生成依赖库中的ant配置文件 fproject_properties.seek(0) for line in fproject_properties: if line.startswith("android.library.reference."): ref_library.append(line.split('=')[1].strip().replace("\\", "/")) util.print_D(ref_library) #将external jar 写入project.properties文件 if len(extern_jar) > 0: fproject_properties.seek(0) lines = fproject_properties.readlines() new_lines = [] skip = False for line in lines: if line.startswith("java.compiler.classpath="): new_lines.append("java.compiler.classpath=" + ";".join(extern_jar) + "\n") skip = True else: new_lines.append(line) if not skip: new_lines.append("\njava.compiler.classpath=" + ";".join(extern_jar)) new_lines.append("\n"); util.print_D(new_lines) fproject_properties.truncate(0) fproject_properties.seek(0) fproject_properties.write("".join(new_lines)) fproject_properties.close() #如果有jni目录,添加ndk编译 if os.path.isdir(os.path.join(workspace, "jni")): util.print_W("添加NDK编译") util.print_D(ndk_build_xml_str) fcustom_rule = open(os.path.join(workspace, "custom_rules.xml"), "w") fcustom_rule.write(ndk_build_xml_str) fcustom_rule.close() #添加签名信息 if not islib.lower() == "true": current = os.path.abspath(workspace) while True: if os.path.isdir(os.path.join(current, "common")): break else: current = os.path.join(current, "..") signature_properties_string = (signature_properties_str % current.split(os.path.basename(os.path.abspath(workspace))+"/")[1]) fant_proper = open(os.path.join(workspace, "ant.properties"), "w") fant_proper.write(signature_properties_string) fant_proper.close() #生成依赖库的ant脚本 for lib_dir in ref_library: config(os.path.join(workspace, lib_dir)) #如果lib需要混淆,则把lib的proguard-project.txt include到本工程中proguard-project.txt fproguard = open(os.path.join(workspace, "proguard-project.txt"), "a") for lib_dir in ref_library: f = open(os.path.join(workspace, lib_dir, "project.properties"), "r") for line in f.readlines(): if line.startswith("proguard.config="): fproguard.write("\n-include " + os.path.join(lib_dir, "proguard-project.txt") + "\n") current = os.path.abspath(workspace) while True: if os.path.isdir(os.path.join(current, "common")): break else: current = os.path.join(current, "..") fproguard.write("\n-include " + os.path.join(current.split(os.path.basename(os.path.abspath(workspace))+"/")[1], \ "common", "LK_AntiRobot", "base-proguard-project.txt") + "\n") os.system("sed -i 's/^#proguard.config=/proguard.config=/' " + os.path.join(workspace, "project.properties")) util.print_W("\n" + workspace + " 混淆打开") f.close() fproguard.close()
if(sys.argv[1] == "-h"): _help() sys.exit(0) p_dir = sys.argv[1] else: p_dir = "." xmlfile = os.path.join(p_dir, "config.xml") if(os.path.isfile(xmlfile)): pathList = [] util.go_through_xml(xmlfile, pathList) if ostype == "cygwin" or ostype == "win32": project_path = os.path.join(*pathList) else: project_path = os.path.abspath(os.path.join(*pathList)) util.print_D(project_path) config(project_path) print "\n配置完成" else: util.print_E(xmlfile + " : can't find the file!!!") sys.exit(1) #/////////////////////////////////////////////////////////// #下面的代码不再使用,仅作保留备份 #/////////////////////////////////////////////////////////// def run(project_dir): if not os.path.isdir(project_dir): util.print_E("ERROR: 指定的目录 %s 不存在" % project_dir) return
def del_svn(dirname): for i in os.walk(dirname): if os.path.basename(i[0]) == ".svn": util.print_D("rm " + i[0]) shutil.rmtree(i[0])
def del_svn(dirname): for i in os.walk(dirname): if (os.path.basename(i[0]) == ".svn"): util.print_D("rm " + i[0]) shutil.rmtree(i[0])
sys.exit(0) elif opt in ("-d", "--debug"): build_debug = True elif opt in ("-p", "--path"): project_dir = arg if len(args) > 1: util.print_E("参数错误\n") _help() sys.exit(2) elif len(args) > 0: p_dir = args[0] else: p_dir = "" util.print_D("p_dir = %s" % p_dir) util.print_D("build_debug = %s" % build_debug) util.print_D("project_dir = %s" % project_dir) if len(project_dir) > 0: project_path = os.path.abspath(project_dir) release_path = os.path.abspath(os.path.join("release", project_dir)) util.print_D(project_path) compile_code(project_path, build_debug) copy_result.copy_out(project_path, release_path) else: xmlfile = os.path.join(p_dir, "config.xml") if os.path.isfile(xmlfile): pathList = [] util.go_through_xml(xmlfile, pathList) project_path = os.path.abspath(os.path.join(*pathList))