For details about the use of the getopt function in Python, pythongetopt
Function prototype:
getopt.getopt(args, shortopts, longopts=[])
Parameter description:
- Args: args is the list of parameters to be parsed. Sys. argv [1:] is generally used to filter out the first parameter (ps: the first parameter is the Script Name and should not be parsed as a parameter)
- Shortopts: abbreviated parameter list
- Longopts: long parameter list
Return Value:
- Opts: The analyzed (option, value) List pair.
- Args: list of remaining command line parameters that do not belong to the format information.
Source code analysis
In the OTA build system generated by Android, The ParseOptions function in the common. py file is used to parse the input parameters. We can use this function to analyze the usage of getopt.
The function source code is as follows:
def ParseOptions(argv, docstring, extra_opts="", extra_long_opts=(), extra_option_handler=None): try: opts, args = getopt.getopt( argv, "hvp:s:x" + extra_opts, ["help", "verbose", "path=", "signapk_path=", "extra_signapk_args=", "java_path=", "public_key_suffix=", "private_key_suffix=", "device_specific=", "extra="] + list(extra_long_opts)) except getopt.GetoptError, err: Usage(docstring) print "**", str(err), "**" sys.exit(2) path_specified = False for o, a in opts: if o in ("-h", "--help"): Usage(docstring) sys.exit() elif o in ("-v", "--verbose"): OPTIONS.verbose = True elif o in ("-p", "--path"): OPTIONS.search_path = a elif o in ("--signapk_path",): OPTIONS.signapk_path = a elif o in ("--extra_singapk_args",): OPTIONS.extra_signapk_args = shlex.split(a) elif o in ("--java_path",): OPTIONS.java_path = a else: if extra_option_handler is None or not extra_option_handler(o, a): assert False, "unknown option \"%s\"" % (o,) os.environ["PATH"] = (os.path.join(OPTIONS.search_path, "bin") + os.pathsep + os.environ["PATH"]) return args
Specifically, extra_option_handler can be understood as a function pointer, and its function is also to parse opts key-value pairs.
The source code of extra_option_handler is as follows:
def option_handler(o, a): if o in ("-b", "--board_config"): pass # deprecated elif o in ("-k", "--package_key"): OPTIONS.package_key = a elif o in ("-i", "--incremental_from"): OPTIONS.incremental_source = a elif o in ("-w", "--wipe_user_data"): OPTIONS.wipe_user_data = True elif o in ("-n", "--no_prereq"): OPTIONS.omit_prereq = True elif o in ("-e", "--extra_script"): OPTIONS.extra_script = a elif o in ("-a", "--aslr_mode"): if a in ("on", "On", "true", "True", "yes", "Yes"): OPTIONS.aslr_mode = True else: OPTIONS.aslr_mode = False elif o in ("--worker_threads"): OPTIONS.worker_threads = int(a) else: return False return True
The parameters argv for generating an OAT full package are as follows:
Copy codeThe Code is as follows: argv = ['-V','-p', 'Out/host/linux-XXX', '-k ', 'build/target/product/security/testkey', 'Out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files.zip ', out/target/product/xxx/xxx_20150723.1340-ota.zip]
First, analyze the parameters. The short parameters include:
-v,-p,-k,
After resolution, the generated results are as follows:
Copy codeThe Code is as follows: opts = [('-V', ''), ('-p', 'Out/host/linux-x86 '), ('-k ', 'build/target/product/security/testkey')]
Args = ['out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files.zip ', 'Out/target/product/xxx/xxx_20150723.1340-ota.zip']