github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/tools/post_process_props.py (about)

     1  #!/usr/bin/env python
     2  #
     3  # Copyright (C) 2009 The Android Open Source Project
     4  #
     5  # Licensed under the Apache License, Version 2.0 (the "License");
     6  # you may not use this file except in compliance with the License.
     7  # You may obtain a copy of the License at
     8  #
     9  #      http://www.apache.org/licenses/LICENSE-2.0
    10  #
    11  # Unless required by applicable law or agreed to in writing, software
    12  # distributed under the License is distributed on an "AS IS" BASIS,
    13  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  # See the License for the specific language governing permissions and
    15  # limitations under the License.
    16  
    17  import sys
    18  
    19  # Usage: post_process_props.py file.prop [blacklist_key, ...]
    20  # Blacklisted keys are removed from the property file, if present
    21  
    22  # See PROP_VALUE_MAX in system_properties.h.
    23  # The constant in system_properties.h includes the terminating NUL,
    24  # so we decrease the value by 1 here.
    25  PROP_VALUE_MAX = 91
    26  
    27  # Put the modifications that you need to make into the /system/build.prop into this
    28  # function. The prop object has get(name) and put(name,value) methods.
    29  def mangle_build_prop(prop):
    30    pass
    31  
    32  # Put the modifications that you need to make into /vendor/default.prop and
    33  # /odm/default.prop into this function. The prop object has get(name) and
    34  # put(name,value) methods.
    35  def mangle_default_prop_override(prop):
    36    pass
    37  
    38  # Put the modifications that you need to make into the /system/etc/prop.default into this
    39  # function. The prop object has get(name) and put(name,value) methods.
    40  def mangle_default_prop(prop):
    41    # If ro.debuggable is 1, then enable adb on USB by default
    42    # (this is for userdebug builds)
    43    if prop.get("ro.debuggable") == "1":
    44      val = prop.get("persist.sys.usb.config")
    45      if "adb" not in val:
    46        if val == "":
    47          val = "adb"
    48        else:
    49          val = val + ",adb"
    50        prop.put("persist.sys.usb.config", val)
    51    # UsbDeviceManager expects a value here.  If it doesn't get it, it will
    52    # default to "adb". That might not the right policy there, but it's better
    53    # to be explicit.
    54    if not prop.get("persist.sys.usb.config"):
    55      prop.put("persist.sys.usb.config", "none");
    56  
    57  def validate(prop):
    58    """Validate the properties.
    59  
    60    Returns:
    61      True if nothing is wrong.
    62    """
    63    check_pass = True
    64    buildprops = prop.to_dict()
    65    for key, value in buildprops.iteritems():
    66      # Check build properties' length.
    67      if len(value) > PROP_VALUE_MAX and not key.startswith("ro."):
    68        check_pass = False
    69        sys.stderr.write("error: %s cannot exceed %d bytes: " %
    70                         (key, PROP_VALUE_MAX))
    71        sys.stderr.write("%s (%d)\n" % (value, len(value)))
    72    return check_pass
    73  
    74  class PropFile:
    75  
    76    def __init__(self, lines):
    77      self.lines = [s.strip() for s in lines]
    78  
    79    def to_dict(self):
    80      props = {}
    81      for line in self.lines:
    82        if not line or line.startswith("#"):
    83          continue
    84        if "=" in line:
    85          key, value = line.split("=", 1)
    86          props[key] = value
    87      return props
    88  
    89    def get(self, name):
    90      key = name + "="
    91      for line in self.lines:
    92        if line.startswith(key):
    93          return line[len(key):]
    94      return ""
    95  
    96    def put(self, name, value):
    97      key = name + "="
    98      for i in range(0,len(self.lines)):
    99        if self.lines[i].startswith(key):
   100          self.lines[i] = key + value
   101          return
   102      self.lines.append(key + value)
   103  
   104    def delete(self, name):
   105      key = name + "="
   106      self.lines = [ line for line in self.lines if not line.startswith(key) ]
   107  
   108    def write(self, f):
   109      f.write("\n".join(self.lines))
   110      f.write("\n")
   111  
   112  def main(argv):
   113    filename = argv[1]
   114    f = open(filename)
   115    lines = f.readlines()
   116    f.close()
   117  
   118    properties = PropFile(lines)
   119  
   120    if filename.endswith("/build.prop"):
   121      mangle_build_prop(properties)
   122    elif (filename.endswith("/vendor/default.prop") or
   123          filename.endswith("/odm/default.prop")):
   124      mangle_default_prop_override(properties)
   125    elif (filename.endswith("/default.prop") or # legacy
   126          filename.endswith("/prop.default")):
   127      mangle_default_prop(properties)
   128    else:
   129      sys.stderr.write("bad command line: " + str(argv) + "\n")
   130      sys.exit(1)
   131  
   132    if not validate(properties):
   133      sys.exit(1)
   134  
   135    # Drop any blacklisted keys
   136    for key in argv[2:]:
   137      properties.delete(key)
   138  
   139    f = open(filename, 'w+')
   140    properties.write(f)
   141    f.close()
   142  
   143  if __name__ == "__main__":
   144    main(sys.argv)