def call_command(self, args): self._config = read_freeline_config() self._args = args self.debug('command line args: ' + str(args)) Logger.info('[INFO] preparing for tasks...') if 'debug' in args and args.debug: self._logger.debuggable = True if is_windows_system(): self._logger.debuggable = True self._check_logger_worker() if 'cleanBuild' in args and args.cleanBuild: is_build_all_projects = args.all self._setup_clean_build_command(is_build_all_projects) elif 'version' in args and args.version: version() elif 'clean' in args and args.clean: self._command = CleanAllCacheCommand(self._config['build_cache_dir']) else: from freeline_build import FreelineBuildCommand self._command = FreelineBuildCommand(self._config, task_engine=self._task_engine) if not isinstance(self._command, AbstractCommand): raise TypeError self._exec_command(self._command)
def run_dex_task(self): patch_classes_cache_dir = self._finder.get_patch_classes_cache_dir() dex_path = self._finder.get_dst_dex_path() add_path = None if is_windows_system(): add_path = str( os.path.abspath(os.path.join(self._javac, os.pardir))) dex_args = [ self._dx, '--dex', '--output=' + dex_path, patch_classes_cache_dir ] else: dex_args = [ self._dx, '--dex', '--no-optimize', '--force-jumbo', '--output=' + dex_path, patch_classes_cache_dir ] self.debug('dex exec: ' + ' '.join(dex_args)) output, err, code = cexec(dex_args, add_path=add_path) if code != 0: raise FreelineException('incremental dex compile failed.', '{}\n{}'.format(output, err)) else: mark_restart_flag(self._cache_dir)
def call_command(self, args): self._config = read_freeline_config() self._args = args self.debug('command line args: ' + str(args)) Logger.info('[INFO] preparing for tasks...') if is_windows_system() or ('debug' in args and args.debug): self._logger.debuggable = True Logger.debuggable = True self._check_logger_worker() if 'cleanBuild' in args and args.cleanBuild: is_build_all_projects = args.all wait_for_debugger = args.wait self._setup_clean_build_command(is_build_all_projects, wait_for_debugger) elif 'version' in args and args.version: version() elif 'clean' in args and args.clean: self._command = CleanAllCacheCommand( self._config['build_cache_dir']) else: from freeline_build import FreelineBuildCommand self._command = FreelineBuildCommand(self._config, task_engine=self._task_engine) if not isinstance(self._command, AbstractCommand): raise TypeError self._exec_command(self._command)
def append_r_file(self): if self._name != self._config['main_project_name']: backupdir = self.__get_freeline_backup_r_dir() main_r_path = os.path.join(backupdir, self._config['package'].replace('.', os.sep), 'R.java') # main_r_path existence means that resource modification exists, so that need to add R.java to classpath if os.path.exists(main_r_path): pns = [self._config['package'], self._module_info['packagename']] for m in self._module_info['local_module_dep']: pns.append(self._all_module_info[m]['packagename']) for pn in pns: rpath = os.path.join(backupdir, pn.replace('.', os.sep), 'R.java') if os.path.exists(rpath) and rpath not in self._changed_files['src']: self._changed_files['src'].append(rpath) self.debug('add R.java to changed list: ' + rpath) elif pn == self._module_info['packagename']: fpath = self.__modify_other_modules_r(pn) self.debug('modify {}'.format(fpath)) if os.path.exists(fpath): self._changed_files['src'].append(fpath) self.debug('add R.java to changed list: ' + fpath) else: if is_windows_system(): main_r_path = os.path.join(self._finder.get_backup_dir(), self._module_info['packagename'].replace('.', os.sep), 'R.java') content = self.__fix_unicode_parse_error(get_file_content(main_r_path), main_r_path) write_file_content(main_r_path, content)
def get_aapt(): aapt = os.path.join('freeline', 'release-tools', 'FreelineAapt') if is_windows_system(): aapt = os.path.join('freeline', 'release-tools', 'FreelineAapt.exe') if is_linux_system(): aapt = os.path.join('freeline', 'release-tools', 'FreelineAapt_') return aapt if os.path.exists(aapt) else None
def get_aapt(): aapt = os.path.join("freeline", "release-tools", "FreelineAapt") if is_windows_system(): aapt = os.path.join("freeline", "release-tools", "FreelineAapt.exe") if is_linux_system(): aapt = os.path.join("freeline", "release-tools", "FreelineAapt_") return aapt if os.path.exists(aapt) else None
def append_r_file(self): if self._name != self._config['main_project_name']: backupdir = self.__get_freeline_backup_r_dir() main_r_path = os.path.join(backupdir, self._config['package'].replace('.', os.sep), 'R.java') # main_r_path existence means that resource modification exists, so that need to add R.java to classpath if os.path.exists(main_r_path): pns = [self._config['package'], self._module_info['packagename']] for m in self._module_info['local_module_dep']: pns.append(self._all_module_info[m]['packagename']) for pn in pns: rpath = os.path.join(backupdir, pn.replace('.', os.sep), 'R.java') if os.path.exists(rpath) and rpath not in self._changed_files['src']: self._changed_files['src'].append(rpath) self.debug('add R.java to changed list: ' + rpath) elif pn == self._module_info['packagename']: fpath = self.__modify_other_modules_r(pn) self.debug('modify {}'.format(fpath)) if fpath and os.path.exists(fpath): self._changed_files['src'].append(fpath) self.debug('add R.java to changed list: ' + fpath) else: if is_windows_system(): main_r_path = os.path.join(self._finder.get_backup_dir(), self._module_info['packagename'].replace('.', os.sep), 'R.java') if os.path.exists(main_r_path): content = android_tools.fix_unicode_parse_error(get_file_content(main_r_path), main_r_path) write_file_content(main_r_path, content)
def _generate_java_compile_args(self, extra_javac_args_enabled=False): javacargs = [self._javac] arguments = ['-encoding', 'UTF-8', '-g'] if not self._is_retrolambda_enabled: arguments.extend(['-target', '1.7', '-source', '1.7']) arguments.append('-cp') arguments.append(os.pathsep.join(self._classpaths)) for fpath in self._changed_files['src']: arguments.append(fpath) if extra_javac_args_enabled: if 'apt' in self._changed_files: for fpath in self._changed_files['apt']: arguments.append(fpath) filter_tags = [] if self._is_databinding_enabled: filter_tags.extend( ['BindingAdapter', 'BindingConversion', 'Bindable']) if self._is_dagger_enabled: filter_tags.extend(['DaggerComponent', 'DaggerModule']) files = self._get_apt_related_files(filter_tags=filter_tags) for fpath in files: if fpath and os.path.exists( fpath) and fpath not in self._changed_files['src']: if 'apt' in self._changed_files and fpath in self._changed_files[ 'apt']: continue self.debug('add apt related file: {}'.format(fpath)) arguments.append(fpath) arguments.extend(self._extra_javac_args) arguments.append('-d') arguments.append(self._finder.get_patch_classes_cache_dir()) # ref: https://support.microsoft.com/en-us/kb/830473 if is_windows_system(): arguments_length = sum(map(len, arguments)) if arguments_length > 8000: argument_file_path = os.path.join( self._finder.get_module_cache_dir(), 'javac_args_file') self.debug( 'arguments length: {} > 8000, save args to {}'.format( arguments_length, argument_file_path)) if os.path.exists(argument_file_path): os.remove(argument_file_path) arguments_content = ' '.join(arguments) self.debug('javac arguments: ' + arguments_content) write_file_content(argument_file_path, arguments_content) arguments = ['@{}'.format(argument_file_path)] javacargs.extend(arguments) return javacargs
def get_javac(config=None): path = os.getenv('JAVA_HOME') if config is not None and 'java_home' in config: path = config['java_home'] exec_name = 'javac.exe' if is_windows_system() else 'javac' if path and is_exe(os.path.join(path, 'bin', exec_name)): return os.path.join(path, 'bin', exec_name) return None
def get_dx(config): if is_windows_system(): if 'build_tools_directory' in config and os.path.exists(config['build_tools_directory']): path = os.path.join(config['build_tools_directory'], 'dx.bat') if is_exe(path): return path else: return os.path.join('freeline', 'release-tools', 'dx')
def get_dx(config): if is_windows_system(): if "build_tools_directory" in config and os.path.exists(config["build_tools_directory"]): path = os.path.join(config["build_tools_directory"], "dx.bat") if is_exe(path): return path else: return os.path.join("freeline", "release-tools", "dx")
def get_java(config=None): path = os.getenv('JAVA_HOME') if config is not None and 'java_home' in config: path = config['java_home'] exec_name = 'java.exe' if is_windows_system() else 'java' if path and is_exe(os.path.join(path, 'bin', exec_name)): return os.path.join(path, 'bin', exec_name) Logger.debug('[ERROR] Builder.get_java() return None.') return None
def get_java(config=None): path = os.getenv("JAVA_HOME") if config is not None and "java_home" in config: path = config["java_home"] exec_name = "java.exe" if is_windows_system() else "java" if path and is_exe(os.path.join(path, "bin", exec_name)): return os.path.join(path, "bin", exec_name) Logger.debug("[ERROR] Builder.get_java() return None.") return None
def execute(self): command = './gradlew -q checkBeforeCleanBuild' if is_windows_system(): command = 'gradlew.bat -q checkBeforeCleanBuild' output, err, code = cexec(command.split(' '), callback=None) if code != 0: from exceptions import FreelineException raise FreelineException('freeline failed when read project info with script: {}'.format(command), '{}\n{}'.format(output, err))
def _generate_java_compile_args(self, extra_javac_args_enabled=False): javacargs = [self._javac] arguments = ['-encoding', 'UTF-8', '-g'] if not self._is_retrolambda_enabled: arguments.extend(['-target', '1.7', '-source', '1.7']) arguments.append('-cp') arguments.append(os.pathsep.join(self._classpaths)) for fpath in self._changed_files['src']: arguments.append(fpath) if extra_javac_args_enabled: if 'apt' in self._changed_files: for fpath in self._changed_files['apt']: arguments.append(fpath) filter_tags = [] if self._is_databinding_enabled: filter_tags.extend(['BindingAdapter', 'BindingConversion', 'Bindable']) if self._is_dagger_enabled: filter_tags.extend(['DaggerComponent', 'DaggerModule']) files = self._get_apt_related_files(filter_tags=filter_tags) for fpath in files: if fpath and os.path.exists(fpath) and fpath not in self._changed_files['src']: if 'apt' in self._changed_files and fpath in self._changed_files['apt']: continue self.debug('add apt related file: {}'.format(fpath)) arguments.append(fpath) arguments.extend(self._extra_javac_args) arguments.append('-d') arguments.append(self._finder.get_patch_classes_cache_dir()) # ref: https://support.microsoft.com/en-us/kb/830473 if is_windows_system(): arguments_length = sum(map(len, arguments)) if arguments_length > 8000: argument_file_path = os.path.join(self._finder.get_module_cache_dir(), 'javac_args_file') self.debug('arguments length: {} > 8000, save args to {}'.format(arguments_length, argument_file_path)) if os.path.exists(argument_file_path): os.remove(argument_file_path) arguments_content = ' '.join(arguments) self.debug('javac arguments: ' + arguments_content) write_file_content(argument_file_path, arguments_content) arguments = ['@{}'.format(argument_file_path)] javacargs.extend(arguments) return javacargs
def symlink(base_dir, target_dir, fn): base_path = os.path.join(base_dir, fn) target_path = os.path.join(target_dir, fn) if not os.path.exists(base_path): raise FreelineException('file missing: {}'.format(base_path), ' Maybe you should sync freeline repo') if os.path.exists(target_path): os.remove(target_path) if is_windows_system(): copy(base_path, target_path) else: os.symlink(base_path, target_path)
def __init__(self, debuggable=False, interval=0.1, unit="s"): self.debuggable = debuggable self.interval = interval self.unit = unit if not is_windows_system(): from cursor import Cursor from terminal import Terminal self.cursor = Cursor(Terminal()) self.sorted_tasks = [] self.tpl_running_task = '[+][{}] {} in {}{}\n' self.tpl_waiting_task = '[+][{}] {}\n' self.tpl_finished_task = '[-][{}] {} in {}{}\n' # self.tpl_faied_task = '[-]{}:{} in {}{}\n' logging.basicConfig(level=logging.DEBUG)
def run_dex_task(self): patch_classes_cache_dir = self._finder.get_patch_classes_cache_dir() # dex_path = self._finder.get_dst_dex_path() dex_path = self._finder.get_patch_dex_dir() add_path = None if is_windows_system(): add_path = str(os.path.abspath(os.path.join(self._javac, os.pardir))) dex_args = [self._dx, '--dex', '--multi-dex', '--output=' + dex_path, patch_classes_cache_dir] else: dex_args = [self._dx, '--dex', '--no-optimize', '--force-jumbo', '--multi-dex', '--output=' + dex_path, patch_classes_cache_dir] self.debug('dex exec: ' + ' '.join(dex_args)) output, err, code = cexec(dex_args, add_path=add_path) if code != 0: raise FreelineException('incremental dex compile failed.', '{}\n{}'.format(output, err)) else: mark_restart_flag(self._cache_dir)
def __fix_unicode_parse_error(self, content, path): if content is not None and is_windows_system(): self.debug("avoid windows unicode error for {}".format(path)) return content.replace(r"\u", r"d") return content
def get_javac(): exec_name = 'javac.exe' if is_windows_system() else 'javac' path = os.getenv('JAVA_HOME') if path and is_exe(os.path.join(path, 'bin', exec_name)): return os.path.join(path, 'bin', exec_name) return None
def _get_aapt_args(self): aapt_args = [self._aapt, 'package', '-f', '-I', os.path.join(self._config['compile_sdk_directory'], 'android.jar'), '-M', self._finder.get_dst_manifest_path()] for rdir in self._config['project_source_sets'][self._name]['main_res_directory']: if os.path.exists(rdir): aapt_args.append('-S') aapt_args.append(rdir) for rdir in self._module_info['local_dep_res_path']: if os.path.exists(rdir): aapt_args.append('-S') aapt_args.append(rdir) for resdir in self._module_info['dep_res_path']: if os.path.exists(resdir): aapt_args.append('-S') aapt_args.append(resdir) if 'extra_dep_res_paths' in self._config and self._config['extra_dep_res_paths'] is not None: arr = self._config['extra_dep_res_paths'] for path in arr: path = path.strip() if os.path.isdir(path): aapt_args.append('-S') aapt_args.append(path) aapt_args.append('-S') aapt_args.append(self._finder.get_backup_res_dir()) freeline_assets_dir = os.path.join(self._config['build_cache_dir'], 'freeline-assets') aapt_args.append('-A') aapt_args.append(freeline_assets_dir) for adir in self._config['project_source_sets'][self._name]['main_assets_directory']: if os.path.exists(adir): aapt_args.append('-A') aapt_args.append(adir) for m in self._module_info['local_module_dep']: if m in self._config['project_source_sets']: for adir in self._config['project_source_sets'][m]['main_assets_directory']: if os.path.exists(adir): aapt_args.append('-A') aapt_args.append(adir) gen_path = self._finder.get_backup_dir() aapt_args.append('--custom-package') aapt_args.append(self._config['package']) aapt_args.append('-m') aapt_args.append('-J') aapt_args.append(gen_path) aapt_args.append('--auto-add-overlay') aapt_args.append('-P') aapt_args.append(self._finder.get_public_xml_path()) final_changed_list = self._parse_changed_list() if is_windows_system(): final_changed_list = [fpath.replace('\\', '/') for fpath in final_changed_list] final_changed_list_chain = ':'.join(final_changed_list) aapt_args.append('-F') aapt_args.append(self._finder.get_dst_res_pack_path(self._name)) aapt_args.append('--debug-mode') aapt_args.append('--auto-add-overlay') if len(final_changed_list_chain) > 0 and self._is_art: aapt_args.append('--buildIncrement') aapt_args.append(final_changed_list_chain) aapt_args.append('--resoucres-md5-cache-path') aapt_args.append(os.path.join(self._cache_dir, "arsc_cache.dat")) aapt_args.append('--ignore-assets') aapt_args.append('public_id.xml:public.xml:*.bak:.*') return aapt_args, final_changed_list
# -*- coding:utf8 -*- from __future__ import print_function import os from exceptions import FreelineException from utils import is_windows_system, cexec, copy, get_file_content is_windows = is_windows_system() def init(): project_dir = os.getcwd() symlink('freeline', project_dir, 'freeline.py') if is_windows: symlink('freeline', project_dir, 'freeline_core') from gradle_tools import get_all_modules modules = get_all_modules(project_dir) for m in modules: if is_main_project(m['path']): main_module = m break if not main_module: raise FreelineException('main module not found', 'set main module first') print('find main module: ' + main_module['name']) args = [] if is_windows:
def fix_unicode_parse_error(content, path): if content is not None and is_windows_system(): Logger.debug("avoid windows unicode error for {}".format(path)) return content.replace(r"\u", r"d") return content
def fix_for_windows(path): if is_windows_system(): buf = fix_unicode_parse_error(get_file_content(path), path) write_file_content(path, buf)
def _generate_java_compile_args(self, extra_javac_args_enabled=False): javacargs = [self._javac] arguments = ['-encoding', 'UTF-8', '-g'] if not self._is_retrolambda_enabled: arguments.extend(['-target', '1.7', '-source', '1.7']) arguments.append('-cp') arguments.append(os.pathsep.join(self._classpaths)) patch_classes_cache_dir = self._finder.get_patch_classes_cache_dir() dst_classes_dir = self._finder.get_dst_classes_dir() for fpath in self._changed_files['src']: if self._is_dagger_enabled: # remove *_MembersInjector.class which generated by dagger2 # -5 means '.java' path_members_injector = fpath[:-5] + '_MembersInjector.class' for root, dirs, list in os.walk(patch_classes_cache_dir): for i in list: file = os.path.join(root, i) if file[len(patch_classes_cache_dir ):] in path_members_injector: os.remove(file) for root, dirs, list in os.walk(dst_classes_dir): for i in list: file = os.path.join(root, i) if file[len(dst_classes_dir ):] in path_members_injector: os.remove(file) arguments.append(fpath) for fpath in self._force_annotation_processor_files: arguments.append(fpath) if extra_javac_args_enabled: if 'apt' in self._changed_files: for fpath in self._changed_files['apt']: arguments.append(fpath) filter_tags = [] if self._is_databinding_enabled: filter_tags.extend( ['BindingAdapter', 'BindingConversion', 'Bindable']) if self._is_dagger_enabled: filter_tags.extend(['DaggerComponent', 'DaggerModule']) files = self._get_apt_related_files(filter_tags=filter_tags) for fpath in files: if fpath and os.path.exists( fpath) and fpath not in self._changed_files['src']: if 'apt' in self._changed_files and fpath in self._changed_files[ 'apt']: continue self.debug('add apt related file: {}'.format(fpath)) arguments.append(fpath) arguments.extend(self._extra_javac_args) arguments.append('-d') arguments.append(self._finder.get_patch_classes_cache_dir()) # ref: https://support.microsoft.com/en-us/kb/830473 if is_windows_system(): arguments_length = sum(map(len, arguments)) if arguments_length > 8000: argument_file_path = os.path.join( self._finder.get_module_cache_dir(), 'javac_args_file') self.debug( 'arguments length: {} > 8000, save args to {}'.format( arguments_length, argument_file_path)) if os.path.exists(argument_file_path): os.remove(argument_file_path) arguments_content = ' '.join(arguments) self.debug('javac arguments: ' + arguments_content) write_file_content(argument_file_path, arguments_content) arguments = ['@{}'.format(argument_file_path)] javacargs.extend(arguments) return javacargs
def _get_aapt_args(self): aapt_args = [ self._aapt, 'package', '-f', '-I', os.path.join(self._config['compile_sdk_directory'], 'android.jar'), '-M', fix_package_name(self._config, self._finder.get_dst_manifest_path()) ] for rdir in self._config['project_source_sets'][ self._name]['main_res_directory']: if os.path.exists(rdir): aapt_args.append('-S') aapt_args.append(rdir) for rdir in self._module_info['local_dep_res_path']: if os.path.exists(rdir): aapt_args.append('-S') aapt_args.append(rdir) for resdir in self._module_info['dep_res_path']: if os.path.exists(resdir): aapt_args.append('-S') aapt_args.append(resdir) if 'extra_dep_res_paths' in self._config and self._config[ 'extra_dep_res_paths'] is not None: arr = self._config['extra_dep_res_paths'] for path in arr: path = path.strip() if os.path.isdir(path): aapt_args.append('-S') aapt_args.append(path) aapt_args.append('-S') aapt_args.append(self._finder.get_backup_res_dir()) freeline_assets_dir = os.path.join(self._config['build_cache_dir'], 'freeline-assets') aapt_args.append('-A') aapt_args.append(freeline_assets_dir) for adir in self._config['project_source_sets'][ self._name]['main_assets_directory']: if os.path.exists(adir): aapt_args.append('-A') aapt_args.append(adir) for m in self._module_info['local_module_dep']: if m in self._config['project_source_sets']: for adir in self._config['project_source_sets'][m][ 'main_assets_directory']: if os.path.exists(adir): aapt_args.append('-A') aapt_args.append(adir) gen_path = self._finder.get_backup_dir() aapt_args.append('--custom-package') aapt_args.append(self._config['package']) aapt_args.append('-m') aapt_args.append('-J') aapt_args.append(gen_path) aapt_args.append('--auto-add-overlay') aapt_args.append('-P') aapt_args.append(self._finder.get_public_xml_path()) final_changed_list = self._parse_changed_list() if is_windows_system(): final_changed_list = [ fpath.replace('\\', '/') for fpath in final_changed_list ] final_changed_list_chain = ':'.join(final_changed_list) aapt_args.append('-F') aapt_args.append(self._finder.get_dst_res_pack_path(self._name)) aapt_args.append('--debug-mode') aapt_args.append('--auto-add-overlay') if len(final_changed_list_chain) > 0 and self._is_art: aapt_args.append('--buildIncrement') aapt_args.append(final_changed_list_chain) aapt_args.append('--resoucres-md5-cache-path') aapt_args.append(os.path.join(self._cache_dir, "arsc_cache.dat")) aapt_args.append('--ignore-assets') aapt_args.append('public_id.xml:public.xml:*.bak:.*') return aapt_args, final_changed_list
# -*- coding:utf8 -*- from __future__ import print_function import os from exceptions import FreelineException from utils import is_windows_system, cexec, copy, get_file_content is_windows = is_windows_system() def init(): project_dir = os.getcwd() symlink('freeline', project_dir, 'freeline.py') if is_windows: symlink('freeline', project_dir, 'freeline_core') from gradle_tools import get_all_modules modules = get_all_modules(project_dir) for m in modules: if is_main_project(m['path']): main_module = m break if not main_module: raise FreelineException('main module not found', 'set main module first') print('find main module: ' + main_module['name']) args = [] if is_windows: args.append('gradlew.bat')