post_process_props.py revision 115c66bd741c6caa7d3078615b81f5e7a5041c9b
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# Put the modifications that you need to make into the /system/build.prop into this 20# function. The prop object has get(name) and put(name,value) methods. 21def mangle_build_prop(prop): 22 buildprops=prop.buildprops 23 check_pass=True 24 for key in buildprops: 25 # Check build properties' length. 26 # Terminator(\0) added into the provided value of properties 27 # Total length (including terminator) will be no greater that PROP_VALUE_MAX(92). 28 if len(buildprops[key]) > 91: 29 # If dev build, show a warning message, otherwise fail the build with error message 30 if prop.get("ro.build.version.incremental").startswith("eng"): 31 sys.stderr.write("warning: " + key + " exceeds 91 symbols: ") 32 sys.stderr.write(buildprops[key]) 33 sys.stderr.write("(" + str(len(buildprops[key])) + ") \n") 34 sys.stderr.write("warning: This will cause the " + key + " ") 35 sys.stderr.write("property return as empty at runtime\n") 36 else: 37 check_pass=False 38 sys.stderr.write("error: " + key + " cannot exceed 91 symbols: ") 39 sys.stderr.write(buildprops[key]) 40 sys.stderr.write("(" + str(len(buildprops[key])) + ") \n") 41 if not check_pass: 42 sys.exit(1) 43 44# Put the modifications that you need to make into the /system/build.prop into this 45# function. The prop object has get(name) and put(name,value) methods. 46def mangle_default_prop(prop): 47 # If ro.debuggable is 1, then enable adb on USB by default 48 # (this is for userdebug builds) 49 if prop.get("ro.debuggable") == "1": 50 val = prop.get("persist.sys.usb.config") 51 if val == "": 52 val = "adb" 53 else: 54 val = val + ",adb" 55 prop.put("persist.sys.usb.config", val) 56 # UsbDeviceManager expects a value here. If it doesn't get it, it will 57 # default to "adb". That might not the right policy there, but it's better 58 # to be explicit. 59 if not prop.get("persist.sys.usb.config"): 60 prop.put("persist.sys.usb.config", "none"); 61 62class PropFile: 63 64 buildprops={} 65 66 def __init__(self, lines): 67 self.lines = [s[:-1] for s in lines] 68 for line in self.lines: 69 line=line.strip() 70 if not line.strip() or line.startswith("#"): 71 continue 72 index=line.find("=") 73 key=line[0:index] 74 value=line[index+1:] 75 self.buildprops[key]=value 76 77 def get(self, name): 78 key = name + "=" 79 for line in self.lines: 80 if line.startswith(key): 81 return line[len(key):] 82 return "" 83 84 def put(self, name, value): 85 key = name + "=" 86 for i in range(0,len(self.lines)): 87 if self.lines[i].startswith(key): 88 self.lines[i] = key + value 89 return 90 self.lines.append(key + value) 91 92 def write(self, f): 93 f.write("\n".join(self.lines)) 94 f.write("\n") 95 96def main(argv): 97 filename = argv[1] 98 f = open(filename) 99 lines = f.readlines() 100 f.close() 101 102 properties = PropFile(lines) 103 if filename.endswith("/build.prop"): 104 mangle_build_prop(properties) 105 elif filename.endswith("/default.prop"): 106 mangle_default_prop(properties) 107 else: 108 sys.stderr.write("bad command line: " + str(argv) + "\n") 109 sys.exit(1) 110 111 f = open(filename, 'w+') 112 properties.write(f) 113 f.close() 114 115if __name__ == "__main__": 116 main(sys.argv) 117