def BuildExtension(repo_path): old_cwd = os.getcwd() os.chdir(repo_path) os.environ["GYP_GENERATORS"] = "ninja" gyp_cmd = ["gyp", "--depth=.", "all.gyp"] RunCommand(gyp_cmd, True) #Currently, the output path is set to out/Default. ninja_cmd = ["ninja", "-C", os.path.join("out", "Default")] RunCommand(ninja_cmd, True) os.chdir(old_cwd)
def GetAndroidApiLevel(android_path): """Get Highest Android target level installed. return -1 if no targets have been found. """ target_output = RunCommand([android_path, 'list', 'target', '-c']) target_regex = re.compile(r'android-(\d+)') targets = [int(i) for i in target_regex.findall(target_output)] targets.extend([-1]) return max(targets)
def ParseXPK(options, out_dir): cmd = ['python', os.path.join(xwalk_dir, 'parse_xpk.py'), '--file=%s' % os.path.expanduser(options.xpk), '--out=%s' % out_dir] RunCommand(cmd) if options.manifest: print ('Use the manifest from XPK by default ' 'when "--xpk" option is specified, and ' 'the "--manifest" option would be ignored.') sys.exit(7) if os.path.isfile(os.path.join(out_dir, 'manifest.json')): options.manifest = os.path.join(out_dir, 'manifest.json') else: print('XPK doesn\'t contain manifest file.') sys.exit(8)
def HandleAdd(git_url, extensions_path, name=None): if name is None: name = git_url.split('/')[-1].split('.')[0] if not os.path.isdir(extensions_path): if os.path.isfile(extensions_path): print "WARNING: Please remove file %s" % (extensions_path) sys.exit(1) else: os.mkdir(extensions_path) local_extension_path = os.path.join(extensions_path, name) if os.path.exists(local_extension_path): print "ERROR: You already have a repo named \"%s\"." % name return os.mkdir(local_extension_path) #Only support git. git_cmd = ["git", "clone", git_url, local_extension_path] RunCommand(git_cmd, True) if os.path.isfile(os.path.join(local_extension_path, "all.gyp")): BuildExtension(local_extension_path)
def Execution(options, app_info): # Now we've got correct app_version and correct ABI value, # start to generate suitable versionCode app_info.app_versionCode = MakeVersionCode(options, app_info.app_version) # Write generated versionCode into AndroidManifest.xml. # Later if we have other customization, # we can put them together into CustomizeManifest func. CustomizeManifest(app_info) name = app_info.android_name arch_string = (' (' + options.arch + ')' if options.arch else '') print('\nStarting application build' + arch_string) app_dir = GetBuildDir(name) android_path = Which('android') api_level = GetAndroidApiLevel(android_path) target_string = 'android-%d' % api_level print(' * Checking keystore for signing') if options.keystore_path: key_store = os.path.expanduser(options.keystore_path) if options.keystore_alias: key_alias = options.keystore_alias else: print('Please provide an alias name of the developer key.') sys.exit(6) if options.keystore_passcode: key_code = options.keystore_passcode else: key_code = None if options.keystore_alias_passcode: key_alias_code = options.keystore_alias_passcode else: key_alias_code = None else: print(' No keystore provided for signing. Using xwalk\'s keystore ' 'for debugging.\n Please use a valid keystore when ' 'distributing to the app market.') key_store = os.path.join(xwalk_dir, 'xwalk-debug.keystore') key_alias = 'xwalkdebugkey' key_code = 'xwalkdebug' key_alias_code = 'xwalkdebug' # Update android project for app and xwalk_core_library. update_project_cmd = [ android_path, 'update', 'project', '--path', app_dir, '--target', target_string, '--name', name ] if options.mode == 'embedded': print(' * Updating project with xwalk_core_library') RunCommand([ android_path, 'update', 'lib-project', '--path', os.path.join(app_dir, EMBEDDED_LIBRARY), '--target', target_string ]) update_project_cmd.extend(['-l', EMBEDDED_LIBRARY]) elif options.mode == 'shared': print(' * Updating project with xwalk_shared_library') RunCommand([ android_path, 'update', 'lib-project', '--path', os.path.join(app_dir, SHARED_LIBRARY), '--target', target_string ]) update_project_cmd.extend(['-l', SHARED_LIBRARY]) else: print(' * Updating project') RunCommand(update_project_cmd) # Check whether external extensions are included. print(' * Checking for external extensions') extensions_string = 'xwalk-extensions' extensions_dir = os.path.join(app_dir, extensions_string) external_extension_jars = FindExtensionJars(extensions_dir) for external_extension_jar in external_extension_jars: shutil.copyfile( external_extension_jar, os.path.join(app_dir, 'libs', os.path.basename(external_extension_jar))) if options.mode == 'embedded': print(' * Copying native libraries for %s' % options.arch) # Remove existing native libraries in xwalk_core_library, they are probably # for the last execution to make apk for another CPU arch. # And then copy the native libraries for the specified arch into # xwalk_core_library. arch = ConvertArchNameToArchFolder(options.arch) if not arch: print('Invalid CPU arch: %s.' % arch) sys.exit(10) library_lib_path = os.path.join(app_dir, EMBEDDED_LIBRARY, 'libs') for dir_name in os.listdir(library_lib_path): lib_dir = os.path.join(library_lib_path, dir_name) if ContainsNativeLibrary(lib_dir): shutil.rmtree(lib_dir) native_lib_path = os.path.join(app_dir, 'native_libs', arch) if ContainsNativeLibrary(native_lib_path): shutil.copytree(native_lib_path, os.path.join(library_lib_path, arch)) else: print( 'No %s native library has been found for creating a Crosswalk ' 'embedded APK.' % arch) sys.exit(10) if options.project_only: print(' (Skipping apk package creation)') return # Build the APK if options.mode == 'embedded': print(' * Building Android apk package with Crosswalk embedded' + arch_string) else: print(' * Building Android apk package') ant_path = Which('ant') ant_cmd = [ant_path, 'release', '-f', os.path.join(app_dir, 'build.xml')] ant_cmd.extend(['-Dkey.store=%s' % os.path.abspath(key_store)]) ant_cmd.extend(['-Dkey.alias=%s' % key_alias]) if key_code: ant_cmd.extend(['-Dkey.store.password=%s' % key_code]) if key_alias_code: ant_cmd.extend(['-Dkey.alias.password=%s' % key_alias_code]) cmd_display = ' '.join([str(item) for item in ant_cmd]) if options.verbose: print('Executing:\n %s\n' % cmd_display) else: ant_cmd.extend(['-quiet']) ant_result = subprocess.call(ant_cmd) if ant_result != 0: print('Command "%s" exited with non-zero exit code %d' % (cmd_display, ant_result)) sys.exit(ant_result) src_file = os.path.join(app_dir, 'bin', '%s-release.apk' % name) package_name = name if options.app_version: package_name += ('_' + options.app_version) if options.mode == 'shared': dst_file = os.path.join(options.target_dir, '%s.apk' % package_name) elif options.mode == 'embedded': dst_file = os.path.join(options.target_dir, '%s_%s.apk' % (package_name, options.arch)) shutil.copyfile(src_file, dst_file) print(' (Location: %s)' % dst_file)
def MakeNativeLibrary(lib_dir): # use lzma to decompress the compressed library. compressed_library = os.path.join(lib_dir, NATIVE_LIBRARY + '.lzma') RunCommand(['lzma', '-d', compressed_library]) return True
def MakeCompressedLibrary(lib_dir): # use lzma to compress the native library. native_library = os.path.join(lib_dir, NATIVE_LIBRARY) RunCommand(['lzma', '-f', native_library]) return True
def Execution(options, app_info): # Now we've got correct app_version and correct ABI value, # start to generate suitable versionCode app_info.app_versionCode = MakeVersionCode(options, app_info.app_version) # Write generated versionCode into AndroidManifest.xml. # Later if we have other customization, # we can put them together into CustomizeManifest func. CustomizeManifest(app_info) name = app_info.android_name arch_string = (' ('+options.arch+')' if options.arch else '') print('\nStarting application build' + arch_string) app_dir = GetBuildDir(name) android_path = Which('android') api_level = GetAndroidApiLevel(android_path) target_string = 'android-%d' % api_level print (' * Checking keystore for signing') if options.keystore_path: key_store = os.path.expanduser(options.keystore_path) if options.keystore_alias: key_alias = options.keystore_alias else: print('Please provide an alias name of the developer key.') sys.exit(6) if options.keystore_passcode: key_code = options.keystore_passcode else: key_code = None if options.keystore_alias_passcode: key_alias_code = options.keystore_alias_passcode else: key_alias_code = None else: print(' No keystore provided for signing. Using xwalk\'s keystore ' 'for debugging.\n Please use a valid keystore when ' 'distributing to the app market.') key_store = os.path.join(xwalk_dir, 'xwalk-debug.keystore') key_alias = 'xwalkdebugkey' key_code = 'xwalkdebug' key_alias_code = 'xwalkdebug' # Update android project for app and xwalk_core_library. update_project_cmd = [android_path, 'update', 'project', '--path', app_dir, '--target', target_string, '--name', name] if options.mode == 'embedded': print(' * Updating project with xwalk_core_library') RunCommand([android_path, 'update', 'lib-project', '--path', os.path.join(app_dir, EMBEDDED_LIBRARY), '--target', target_string]) update_project_cmd.extend(['-l', EMBEDDED_LIBRARY]) elif options.mode == 'shared': print(' * Updating project with xwalk_shared_library') RunCommand([android_path, 'update', 'lib-project', '--path', os.path.join(app_dir, SHARED_LIBRARY), '--target', target_string]) update_project_cmd.extend(['-l', SHARED_LIBRARY]) else: print(' * Updating project') RunCommand(update_project_cmd) # Enable proguard if options.mode == 'embedded' and options.enable_proguard: print(' * Enabling proguard config files') # Enable proguard in project.properies. if not os.path.exists(os.path.join(app_dir, 'project.properties')): print('Error, project.properties file not found!') sys.exit(14) file_prop = file(os.path.join(app_dir, 'project.properties'), 'a') file_prop.write('proguard.config=${sdk.dir}/tools/proguard/' 'proguard-android.txt:proguard-xwalk.txt') file_prop.close() # Add proguard cfg file. if not os.path.exists(os.path.join(app_dir, 'proguard-xwalk.txt')): print('Error, proguard config file for Crosswalk not found!') sys.exit(14) # Check whether external extensions are included. print(' * Checking for external extensions') extensions_string = 'xwalk-extensions' extensions_dir = os.path.join(app_dir, extensions_string) external_extension_jars = FindExtensionJars(extensions_dir) for external_extension_jar in external_extension_jars: shutil.copyfile(external_extension_jar, os.path.join(app_dir, 'libs', os.path.basename(external_extension_jar))) if options.mode == 'embedded': print (' * Copying native libraries for %s' % options.arch) # Remove existing native libraries in xwalk_core_library, they are probably # for the last execution to make apk for another CPU arch. # And then copy the native libraries for the specified arch into # xwalk_core_library. arch = ConvertArchNameToArchFolder(options.arch) if not arch: print ('Invalid CPU arch: %s.' % arch) sys.exit(10) native_path = os.path.join(app_dir, 'native_libs', arch) library_path = os.path.join(app_dir, EMBEDDED_LIBRARY, 'libs') raw_path = os.path.join(app_dir, EMBEDDED_LIBRARY, 'res', 'raw') if options.enable_lzma: contains_library = ContainsCompressedLibrary clean_library = CleanCompressedLibrary copy_library = CopyCompressedLibrary else: contains_library = ContainsNativeLibrary clean_library = CleanNativeLibrary copy_library = CopyNativeLibrary # cleanup previous build's library first. for dir_name in os.listdir(library_path): clean_library(library_path, dir_name) if options.native_extensions: CheckValidationOfExpectedLibraryArch(options.native_extensions, options.arch) CopyNativeExtensionFile('.so', os.path.join(options.native_extensions, arch), native_path) if contains_library(native_path): copy_library(native_path, library_path, raw_path, arch) else: print('No %s native library has been found for creating a Crosswalk ' 'embedded APK.' % arch) sys.exit(10) else: if options.native_extensions: for arch_name in ALL_ARCHITECTURES: arch = ConvertArchNameToArchFolder(arch_name) extension_path = os.path.join(app_dir, SHARED_LIBRARY, 'libs', arch) library_path = os.path.join(options.native_extensions, arch) CheckValidationOfExpectedLibraryArch(library_path, arch_name) os.mkdir(extension_path) CopyNativeExtensionFile('.so', os.path.join(options.native_extensions, arch), extension_path) if options.project_only: print (' (Skipping apk package creation)') return # Build the APK if options.mode == 'embedded': print(' * Building Android apk package with Crosswalk embedded' + arch_string) else: print(' * Building Android apk package') ant_path = Which('ant') ant_cmd = [ant_path, 'release', '-f', os.path.join(app_dir, 'build.xml')] ant_cmd.extend(['-Dkey.store=%s' % os.path.abspath(key_store)]) ant_cmd.extend(['-Dkey.alias=%s' % key_alias]) if key_code: ant_cmd.extend(['-Dkey.store.password=%s' % key_code]) if key_alias_code: ant_cmd.extend(['-Dkey.alias.password=%s' % key_alias_code]) ignore_properties = "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~" ant_cmd.extend(['-Daapt.ignore.assets=%s' % ignore_properties]) cmd_display = ' '.join([str(item) for item in ant_cmd]) if options.verbose: print('Executing:\n %s\n' % cmd_display) else: ant_cmd.extend(['-quiet']) ant_result = subprocess.call(ant_cmd) if ant_result != 0: print('Command "%s" exited with non-zero exit code %d' % (cmd_display, ant_result)) sys.exit(ant_result) src_file = os.path.join(app_dir, 'bin', '%s-release.apk' % name) package_name = name if options.app_version: package_name += ('_' + options.app_version) if options.mode == 'shared': dst_file = os.path.join(options.target_dir, '%s.apk' % package_name) elif options.mode == 'embedded': dst_file = os.path.join(options.target_dir, '%s_%s.apk' % (package_name, options.arch)) shutil.copyfile(src_file, dst_file) print(' (Location: %s)' % dst_file) #Copy proguard dumping files if options.mode == 'embedded' and options.enable_proguard \ and not options.project_dir: proguard_dir = os.path.join(app_dir, 'bin/proguard/') if os.path.exists(proguard_dir): for afile in os.listdir(proguard_dir): if afile.endswith('.txt'): shutil.copy(os.path.join(proguard_dir,afile), xwalk_dir) else: print('Warning:Cannot find proguard dumping directory!')
def Execution(options, name): android_path = Which('android') if android_path is None: print( 'The "android" binary could not be found. Check your Android SDK ' 'installation and your PATH environment variable.') sys.exit(1) api_level = GetAndroidApiLevel(android_path) if api_level < 14: print('Please install Android API level (>=14) first.') sys.exit(3) target_string = 'android-%d' % api_level if options.keystore_path: key_store = os.path.expanduser(options.keystore_path) if options.keystore_alias: key_alias = options.keystore_alias else: print('Please provide an alias name of the developer key.') sys.exit(6) if options.keystore_passcode: key_code = options.keystore_passcode else: key_code = None if options.keystore_alias_passcode: key_alias_code = options.keystore_alias_passcode else: key_alias_code = None else: print( 'Use xwalk\'s keystore by default for debugging. ' 'Please switch to your keystore when distributing it to app market.' ) key_store = os.path.join(xwalk_dir, 'xwalk-debug.keystore') key_alias = 'xwalkdebugkey' key_code = 'xwalkdebug' key_alias_code = 'xwalkdebug' # Check whether ant is installed. ant_path = Which('ant') if ant_path is None: print('Ant could not be found. Please make sure it is installed.') sys.exit(4) # Update android project for app and xwalk_core_library. update_project_cmd = [ android_path, 'update', 'project', '--path', os.path.join(xwalk_dir, name), '--target', target_string, '--name', name ] if options.mode == 'embedded': RunCommand([ android_path, 'update', 'lib-project', '--path', os.path.join(xwalk_dir, name, 'xwalk_core_library'), '--target', target_string ]) update_project_cmd.extend(['-l', 'xwalk_core_library']) else: # Shared mode doesn't need xwalk_runtime_java.jar. os.remove( os.path.join(xwalk_dir, name, 'libs', 'xwalk_runtime_java.jar')) RunCommand(update_project_cmd) # Check whether external extensions are included. extensions_string = 'xwalk-extensions' extensions_dir = os.path.join(xwalk_dir, name, extensions_string) external_extension_jars = FindExtensionJars(extensions_dir) for external_extension_jar in external_extension_jars: shutil.copyfile( external_extension_jar, os.path.join(xwalk_dir, name, 'libs', os.path.basename(external_extension_jar))) if options.mode == 'embedded': # Remove existing native libraries in xwalk_core_library, they are probably # for the last execution to make apk for another CPU arch. # And then copy the native libraries for the specified arch into # xwalk_core_library. arch = ConvertArchNameToArchFolder(options.arch) if not arch: print('Invalid CPU arch: %s.' % arch) sys.exit(10) library_lib_path = os.path.join(xwalk_dir, name, 'xwalk_core_library', 'libs') for dir_name in os.listdir(library_lib_path): lib_dir = os.path.join(library_lib_path, dir_name) if ContainsNativeLibrary(lib_dir): shutil.rmtree(lib_dir) native_lib_path = os.path.join(xwalk_dir, name, 'native_libs', arch) if ContainsNativeLibrary(native_lib_path): shutil.copytree(native_lib_path, os.path.join(library_lib_path, arch)) else: print( 'No %s native library has been found for creating a Crosswalk ' 'embedded APK.' % arch) sys.exit(10) ant_cmd = [ ant_path, 'release', '-f', os.path.join(xwalk_dir, name, 'build.xml') ] if not options.verbose: ant_cmd.extend(['-quiet']) ant_cmd.extend(['-Dkey.store=%s' % os.path.abspath(key_store)]) ant_cmd.extend(['-Dkey.alias=%s' % key_alias]) if key_code: ant_cmd.extend(['-Dkey.store.password=%s' % key_code]) if key_alias_code: ant_cmd.extend(['-Dkey.alias.password=%s' % key_alias_code]) ant_result = subprocess.call(ant_cmd) if ant_result != 0: print('Command "%s" exited with non-zero exit code %d' % (' '.join(ant_cmd), ant_result)) sys.exit(ant_result) src_file = os.path.join(xwalk_dir, name, 'bin', '%s-release.apk' % name) package_name = name if options.app_version: package_name += ('_' + options.app_version) if options.mode == 'shared': dst_file = os.path.join(options.target_dir, '%s.apk' % package_name) elif options.mode == 'embedded': dst_file = os.path.join(options.target_dir, '%s_%s.apk' % (package_name, options.arch)) shutil.copyfile(src_file, dst_file)