def __init__(self, verbose, app_android_root, no_res, proj_obj, use_studio=False,exts=None): self._verbose = verbose self.app_android_root = app_android_root self._no_res = no_res self._project = proj_obj self.use_studio = use_studio self.ndk_module_paths = [] # check environment variable if self.use_studio: self.ant_root = None self.sign_prop_file = os.path.join(self.app_android_root, 'app', "gradle.properties") else: if exts is not None and exts.has_key('ANT_ROOT'): self.ant_root =exts['ANT_ROOT'] else: self.ant_root = utils.check_environment_variable('ANT_ROOT') self.sign_prop_file = os.path.join(self.app_android_root, "ant.properties") if exts is not None and exts.has_key('ANDROID_SDK_ROOT'): self.sdk_root = exts['ANDROID_SDK_ROOT'] else: self.sdk_root = utils.check_environment_variable('ANDROID_SDK_ROOT') if exts is not None and exts.has_key('NDK_ROOT'): self.ndk_root = exts['NDK_ROOT'] else: self.ndk_root = None self._parse_cfg()
def __init__(self, args): # 配置文件 self.batch_cfg_file = utils.flat_path(args.proj_cfg) if not os.path.isfile(self.batch_cfg_file): raise_known_error("文件 %s 不存在" % self.batch_cfg_file, KnownError.ERROR_PATH_NOT_FOUND) self.root_dir = os.path.dirname(self.batch_cfg_file) self.batch_info = self._parse_json(self.batch_cfg_file) if not self.batch_info: raise_known_error('解析文件 %s 失败' % self.batch_cfg_file, KnownError.ERROR_PARSE_FILE) self.app_id = self.batch_info['appid'] self.channel_id = self.batch_info['channel'] self.proj_parth = utils.flat_path( os.path.join(self.root_dir, self.batch_info['proj_root'])) self.pack_parth = utils.flat_path( os.path.join(self.root_dir, self.batch_info['pack_root'])) # 是否需要重编creator self.rebuild_creator = args.rebuild_creator if self.rebuild_creator: # 检查Creator的安装目录 self.creator_exe_path = utils.check_environment_variable( 'CREATOR_PATH') if not os.path.isdir(self.creator_exe_path): raise_known_error("环境变量 CREATOR_PATH 未设置") self.creator_proj_path = utils.flat_path( os.path.join(self.proj_parth, '../../')) self.encrypt_res = args.encrypt_res Logging.debug_msg('是否重新编译creator工程 : %s' % self.rebuild_creator) Logging.debug_msg('是否加密图片资源 : %s' % self.encrypt_res) Logging.debug_msg('------------------------------------\n')
def do_ndk_build(self, ndk_build_param, build_mode, compile_obj): utils.Logging.info("NDK build mode: %s" %(build_mode)) if self.ndk_root : ndk_root = self.ndk_root else: ndk_root = utils.check_environment_variable('NDK_ROOT') toolchain_version = self.get_toolchain_version(ndk_root, compile_obj) if self.use_studio: ndk_work_dir = os.path.join(self.app_android_root, 'app') else: ndk_work_dir = self.app_android_root reload(sys) sys.setdefaultencoding('utf8') ndk_path = utils.CMDRunner.convert_path_to_cmd(os.path.join(ndk_root, "ndk-build")) module_paths = [] if self.ndk_module_paths is not None: for cfg_path in self.ndk_module_paths: module_paths.append(os.path.join(self.app_android_root, cfg_path)) # delete template static and dynamic files obj_local_dir = os.path.join(ndk_work_dir, "obj", "local") if os.path.isdir(obj_local_dir): for abi_dir in os.listdir(obj_local_dir): static_file_path = os.path.join(ndk_work_dir, "obj", "local", abi_dir) if os.path.isdir(static_file_path): self.remove_c_libs(static_file_path) # windows should use ";" to seperate module paths if utils.os_is_win32(): ndk_module_path = ';'.join(module_paths) else: ndk_module_path = ':'.join(module_paths) ndk_module_path= 'NDK_MODULE_PATH=' + ndk_module_path if ndk_build_param is None: ndk_build_cmd = '%s -C %s %s' % (ndk_path, ndk_work_dir, ndk_module_path) else: ndk_build_cmd = '%s -C %s %s %s' % (ndk_path, ndk_work_dir, ' '.join(ndk_build_param), ndk_module_path) ndk_build_cmd = '%s NDK_TOOLCHAIN_VERSION=%s' % (ndk_build_cmd, toolchain_version) if build_mode == 'debug': ndk_build_cmd = '%s NDK_DEBUG=1' % ndk_build_cmd self._run_cmd(ndk_build_cmd)
def __init__(self, args): self.batch_cfg_file = utils.flat_path(args.proj_cfg) if not os.path.isfile(self.batch_cfg_file): raise_known_error("文件 %s 不存在" % self.batch_cfg_file, KnownError.ERROR_PATH_NOT_FOUND) self.no_rollback = args.no_rollback self.root_dir = os.path.dirname(self.batch_cfg_file) cur_time_str = datetime.datetime.fromtimestamp( time.time()).strftime('%Y%m%d_%H%M%S') self.output_path = os.path.join(self.root_dir, 'output', cur_time_str) #配置文件数据 self.batch_info = self._parse_json(self.batch_cfg_file) if not self.batch_info: raise_known_error('解析文件 %s 失败' % self.batch_cfg_file, KnownError.ERROR_PARSE_FILE) # 检查 android sdk 环境变量 self.sdk_root = utils.flat_path( utils.check_environment_variable('ANDROID_SDK_ROOT')) self.build_result = {} cur_dir = os.path.dirname(__file__) self.proj_parth = utils.flat_path( os.path.join(cur_dir, '../../../jsb-default')) self.proj_android_path = utils.flat_path( os.path.join(self.proj_parth, 'project_android_20')) if not os.path.isdir(self.proj_android_path): raise_known_error("未找到 Android 工程文件夹 %s" % self.proj_android_path) self.android_manifest = os.path.join( self.proj_android_path, 'launcher/src/main/AndroidManifest.xml') self.java_files = [] for parent, dirs, files in os.walk( utils.flat_path( os.path.join(self.proj_android_path, 'unityLibrary/src/main/java'))): for f in files: filename, ext = os.path.splitext(f) if ext.lower() == '.java': self.java_files.append(os.path.join(parent, f)) Logging.debug_msg('使用配置文件 : %s' % self.batch_cfg_file) Logging.debug_msg('是否禁用还原 : %s' % self.no_rollback) Logging.debug_msg('Android 工程路径 : %s' % self.proj_android_path) Logging.debug_msg('----------------\n')
def build_creator_proj(self): Logging.debug_msg('开始构建creator项目') Logging.debug_msg(self.creator_proj_parth) creator_exe_path = utils.check_environment_variable('CREATOR_PATH') try: if sys.platform == "win32": utils.run_shell( 'cd /d %s & CocosCreator.exe --path %s --build "platform=wechatgame;debug=false"' % (creator_exe_path, self.creator_proj_parth)) else: creator_path = '/Applications/CocosCreator.app/Contents/MacOS/' utils.run_shell( '%sCocosCreator --path %s --build "platform=wechatgame;debug=false"' % (creator_path, self.creator_proj_parth)) except Exception as e: raise_known_error("Creator 项目命令行构建失败 msg=%s" % str(e)) Logging.debug_msg('构建creator项目完成')
def __init__(self, args): self.no_rollback = args.no_rollback self.no_encrypt = args.no_encrypt self.no_build_creator = args.no_build_creator self.root_dir = os.path.dirname("./") # self.temp_dir = os.path.join(self.root_dir, 'temp') cur_time_str = datetime.datetime.fromtimestamp( time.time()).strftime('%Y%m%d_%H%M%S') self.output_path = os.path.join(self.root_dir, 'output', cur_time_str) # 检查Creator的安装目录跟工程目录 self.creator_proj_parth = utils.flat_path( os.path.join(self.root_dir, '../../')) if sys.platform == "win32": self.creator_exe_path = utils.check_environment_variable( 'CREATOR_PATH') if not os.path.isdir(self.creator_exe_path): raise_known_error("环境变量 CREATOR_PATH 未设置") self.proj_parth = utils.flat_path( os.path.join(os.path.dirname(__file__), '../../../../build/jsb-link'))
def build_creator_proj(self): Logging.debug_msg('开始构建creator项目') Logging.debug_msg(self.creator_proj_path) try: # 删除之前构建生成的文件夹 if os.path.isdir(self.proj_parth): shutil.rmtree(self.proj_parth) json_file = os.path.join(self.creator_proj_path, "settings/wechatgame.json") loads = self.readJson(json_file) loads["startSceneAssetBundle"] = False self.writeJson(json_file, loads) # https://docs.cocos.com/creator/manual/en/publish/publish-in-command-line.html buildoptions = ";".join([ "platform=wechatgame", "buildPath=build", "debug=false", "sourceMaps=false", "md5Cache=true", "mainCompressionType=merge_all_json", "mainIsRemote=false" ]) paramFmt = '--path {path} --build "{options}"' params = paramFmt.format(path=self.creator_proj_path, options=buildoptions) if sys.platform == "win32": creator_exe_path = utils.check_environment_variable( 'CREATOR_PATH') cmdline = 'cd /d "%s" & CocosCreator.exe %s' % ( creator_exe_path, params) utils.run_shell(cmdline) else: creator_path = '/Applications/CocosCreator/Creator/2.4.3/CocosCreator.app/Contents/MacOS/CocosCreator' utils.run_shell('%s %s' % (creator_path, params)) except Exception as e: raise_known_error("Creator 项目命令行构建失败 msg=%s" % str(e)) Logging.debug_msg('构建creator项目完成')
def select_default_android_platform(self, min_api_level): ''' select a default android platform in SDK_ROOT ''' sdk_root = utils.check_environment_variable('ANDROID_SDK_ROOT') platforms_dir = os.path.join(sdk_root, "platforms") ret_num = -1 ret_platform = "" if os.path.isdir(platforms_dir): for dir_name in os.listdir(platforms_dir): if not os.path.isdir(os.path.join(platforms_dir, dir_name)): continue num = self.get_api_level(dir_name, raise_error=False) if num >= min_api_level: if ret_num == -1 or ret_num > num: ret_num = num ret_platform = dir_name if ret_num != -1: return ret_platform else: return None
help=utils.get_sys_encode_str("指定是否命令行构建creator项目")) parser.add_argument("--no-rollback", dest="no_rollback", action='store_true', help=utils.get_sys_encode_str("若指定此参数,则不执行还原操作")) parser.add_argument("-v", "--version", dest="version", help=utils.get_sys_encode_str("指定配置文件")) (args, unknown) = parser.parse_known_args() # record the start time begin_time = time.time() try: if sys.platform == "win32": creator_exe_path = utils.check_environment_variable('CREATOR_PATH') if not os.path.isdir(creator_exe_path): raise_known_error("环境变量 CREATOR_PATH 未设置") if len(unknown) > 0: raise_known_error('未知参数 : %s' % unknown, KnownError.ERROR_WRONG_ARGS) print(args) packer = PackAPK(args) packer.do_build(args.no_build_creator) except KnownError as e: # a known exception, exit with the known error number sys.exit(e.get_error_no()) except Exception: raise finally: # output the spend time
def _check_env(self): self.ant_root = utils.check_environment_variable('ANT_ROOT') self.sdk_root = utils.flat_path( utils.check_environment_variable('ANDROID_SDK_ROOT')) self.ant_bin = utils.flat_path(os.path.join(self.ant_root, 'ant'))