post_process_props.py revision 26d22f713948dfc5292268b7307de7a3b9e22e4d
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 17import 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 system_properties.h. 23# PROP_VALUE_MAX in system_properties.h includes the termination NUL, 24# so we decrease it by 1 here. 25PROP_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. 29def mangle_build_prop(prop): 30 pass 31 32# Put the modifications that you need to make into the /default.prop into this 33# function. The prop object has get(name) and put(name,value) methods. 34def mangle_default_prop(prop): 35 # If ro.debuggable is 1, then enable adb on USB by default 36 # (this is for userdebug builds) 37 if prop.get("ro.debuggable") == "1": 38 val = prop.get("persist.sys.usb.config") 39 if val == "": 40 val = "adb" 41 else: 42 val = val + ",adb" 43 prop.put("persist.sys.usb.config", val) 44 # UsbDeviceManager expects a value here. If it doesn't get it, it will 45 # default to "adb". That might not the right policy there, but it's better 46 # to be explicit. 47 if not prop.get("persist.sys.usb.config"): 48 prop.put("persist.sys.usb.config", "none"); 49 50def validate(prop): 51 """Validate the properties. 52 53 Returns: 54 True if nothing is wrong. 55 """ 56 check_pass = True 57 buildprops = prop.to_dict() 58 dev_build = buildprops.get("ro.build.version.incremental", 59 "").startswith("eng") 60 for key, value in buildprops.iteritems(): 61 # Check build properties' length. 62 if len(value) > PROP_VALUE_MAX: 63 # If dev build, show a warning message, otherwise fail the 64 # build with error message 65 if dev_build: 66 sys.stderr.write("warning: %s exceeds %d bytes: " % 67 (key, PROP_VALUE_MAX)) 68 sys.stderr.write("%s (%d)\n" % (value, len(value))) 69 sys.stderr.write("warning: This will cause the %s " % key) 70 sys.stderr.write("property return as empty at runtime\n") 71 else: 72 check_pass = False 73 sys.stderr.write("error: %s cannot exceed %d bytes: " % 74 (key, PROP_VALUE_MAX)) 75 sys.stderr.write("%s (%d)\n" % (value, len(value))) 76 return check_pass 77 78class PropFile: 79 80 def __init__(self, lines): 81 self.lines = [s.strip() for s in lines] 82 83 def to_dict(self): 84 props = {} 85 for line in self.lines: 86 if not line or line.startswith("#"): 87 continue 88 key, value = line.split("=", 1) 89 props[key] = value 90 return props 91 92 def get(self, name): 93 key = name + "=" 94 for line in self.lines: 95 if line.startswith(key): 96 return line[len(key):] 97 return "" 98 99 def put(self, name, value): 100 key = name + "=" 101 for i in range(0,len(self.lines)): 102 if self.lines[i].startswith(key): 103 self.lines[i] = key + value 104 return 105 self.lines.append(key + value) 106 107 def delete(self, name): 108 key = name + "=" 109 self.lines = [ line for line in self.lines if not line.startswith(key) ] 110 111 def write(self, f): 112 f.write("\n".join(self.lines)) 113 f.write("\n") 114 115def main(argv): 116 filename = argv[1] 117 f = open(filename) 118 lines = f.readlines() 119 f.close() 120 121 properties = PropFile(lines) 122 123 if filename.endswith("/build.prop"): 124 mangle_build_prop(properties) 125 elif filename.endswith("/default.prop"): 126 mangle_default_prop(properties) 127 else: 128 sys.stderr.write("bad command line: " + str(argv) + "\n") 129 sys.exit(1) 130 131 if not validate(properties): 132 sys.exit(1) 133 134 # Drop any blacklisted keys 135 for key in argv[2:]: 136 properties.delete(key) 137 138 f = open(filename, 'w+') 139 properties.write(f) 140 f.close() 141 142if __name__ == "__main__": 143 main(sys.argv) 144