Ben Cheng | c16c215 | 2013-05-03 13:24:25 -0700 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 3 | # Copyright (C) 2013 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 | """summarize and compare the component sizes in installed-files.txt.""" |
| 18 | |
| 19 | import sys |
| 20 | |
| 21 | bin_size1 = {} |
| 22 | bin_size2 = {} |
| 23 | bin_sizes = [bin_size1, bin_size2] |
| 24 | |
| 25 | file_sizes = {} |
| 26 | |
| 27 | def PrintUsage(): |
| 28 | print "usage: " + sys.argv[0] + " filename [filename2]" |
| 29 | print "" |
| 30 | print " Input file is installed-files.txt from the build output directory." |
| 31 | print " When only one input file is given, it will generate module_0.csv." |
| 32 | print " When two input files are given, in addition it will generate" |
| 33 | print " module_1.csv and comparison.csv." |
| 34 | print "" |
| 35 | print " The module_x.csv file shows the aggregated file size in each module" |
| 36 | print " (eg bin, lib, app, ...)" |
| 37 | print " The comparison.cvs file shows the individual file sizes side by side" |
| 38 | print " from two different builds" |
| 39 | print "" |
| 40 | print " These files can be uploaded to Google Doc for further processing." |
| 41 | sys.exit(1) |
| 42 | |
| 43 | def ParseFile(install_file, idx): |
| 44 | input_stream = open(install_file, 'r') |
| 45 | for line in input_stream: |
| 46 | # line = "25027208 /system/lib/libchromeview.so" |
| 47 | line = line.strip() |
| 48 | |
| 49 | # size = "25027208", name = "/system/lib/libchromeview.so" |
| 50 | size, name = line.split() |
| 51 | |
| 52 | # components = ["", "system", "lib", "libchromeview.so"] |
| 53 | components = name.split('/') |
| 54 | |
| 55 | # module = "lib" |
| 56 | module = components[2] |
| 57 | |
| 58 | # filename = libchromeview.so" |
| 59 | filename = components[-1] |
| 60 | |
| 61 | # sum up the file sizes by module name |
| 62 | if module not in bin_sizes[idx]: |
| 63 | bin_sizes[idx][module] = int(size) |
| 64 | else: |
| 65 | bin_sizes[idx][module] += int(size) |
| 66 | |
| 67 | # sometimes a file only exists on one build but not the other - use 0 as the |
| 68 | # default size. |
| 69 | if idx == 0: |
| 70 | file_sizes[name] = [module, size, 0] |
| 71 | else: |
| 72 | if name in file_sizes: |
| 73 | file_sizes[name][-1] = size |
| 74 | else: |
| 75 | file_sizes[name] = [module, 0, size] |
| 76 | |
| 77 | input_stream.close() |
| 78 | |
| 79 | # output the module csv file |
| 80 | output = open("module_%d.csv" % idx, 'w') |
| 81 | total = 0 |
| 82 | for key in bin_sizes[idx]: |
| 83 | output.write("%s, %d\n" % (key, bin_sizes[idx][key])) |
| 84 | output.close() |
| 85 | |
| 86 | def main(): |
| 87 | if len(sys.argv) < 2 or len(sys.argv) > 3: |
| 88 | PrintUsage() |
| 89 | # Parse the first installed-files.txt |
| 90 | ParseFile(sys.argv[1], 0) |
| 91 | |
| 92 | # Parse the second installed-files.txt |
| 93 | if len(sys.argv) == 3: |
| 94 | ParseFile(sys.argv[2], 1) |
| 95 | # comparison.csv has the following columns: |
| 96 | # filename, module, size1, size2, size2-size1 |
| 97 | # eg: /system/lib/libchromeview.so, lib, 25027208, 33278460, 8251252 |
| 98 | output = open("comparison.csv", 'w') |
| 99 | for key in file_sizes: |
| 100 | output.write("%s, %s, %s, %s, %d\n" % |
| 101 | (key, file_sizes[key][0], file_sizes[key][1], |
| 102 | file_sizes[key][2], |
| 103 | int(file_sizes[key][2]) - int(file_sizes[key][1]))) |
| 104 | output.close() |
| 105 | |
| 106 | if __name__ == '__main__': |
| 107 | main() |
| 108 | |
| 109 | # vi: ts=2 sw=2 |