Esempio n. 1
0
    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()
Esempio n. 2
0
    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')
Esempio n. 3
0
    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)
Esempio n. 4
0
    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')
Esempio n. 5
0
 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项目完成')
Esempio n. 6
0
    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'))
Esempio n. 7
0
    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项目完成')
Esempio n. 8
0
    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
Esempio n. 9
0
                        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
Esempio n. 10
0
 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'))