| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import os | 5 import os |
| 6 import re | 6 import re |
| 7 import tempfile | 7 import tempfile |
| 8 | 8 |
| 9 from devil.utils import cmd_helper | 9 from devil.utils import cmd_helper |
| 10 from pylib import constants | 10 from pylib import constants |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 60 |
| 61 with tempfile.NamedTemporaryFile() as proguard_output: | 61 with tempfile.NamedTemporaryFile() as proguard_output: |
| 62 cmd_helper.RunCmd(['java', '-jar', | 62 cmd_helper.RunCmd(['java', '-jar', |
| 63 _PROGUARD_PATH, | 63 _PROGUARD_PATH, |
| 64 '-injars', jar_path, | 64 '-injars', jar_path, |
| 65 '-dontshrink', | 65 '-dontshrink', |
| 66 '-dontoptimize', | 66 '-dontoptimize', |
| 67 '-dontobfuscate', | 67 '-dontobfuscate', |
| 68 '-dontpreverify', | 68 '-dontpreverify', |
| 69 '-dump', proguard_output.name]) | 69 '-dump', proguard_output.name]) |
| 70 return Parse(proguard_output) |
| 70 | 71 |
| 72 def Parse(proguard_output): |
| 73 results = { |
| 74 'classes': [], |
| 75 } |
| 71 | 76 |
| 72 results = { | 77 annotation = None |
| 73 'classes': [], | 78 annotation_has_value = False |
| 74 } | 79 class_result = None |
| 80 method_result = None |
| 75 | 81 |
| 76 annotation = None | 82 for line in proguard_output: |
| 77 annotation_has_value = False | 83 line = line.strip('\r\n') |
| 78 class_result = None | |
| 79 method_result = None | |
| 80 | 84 |
| 81 for line in proguard_output: | 85 m = _PROGUARD_CLASS_RE.match(line) |
| 82 line = line.strip('\r\n') | 86 if m: |
| 87 class_result = { |
| 88 'class': m.group(1).replace('/', '.'), |
| 89 'superclass': '', |
| 90 'annotations': {}, |
| 91 'methods': [], |
| 92 } |
| 93 results['classes'].append(class_result) |
| 94 annotation = None |
| 95 annotation_has_value = False |
| 96 method_result = None |
| 97 continue |
| 83 | 98 |
| 84 m = _PROGUARD_CLASS_RE.match(line) | 99 if not class_result: |
| 85 if m: | 100 continue |
| 86 class_result = { | |
| 87 'class': m.group(1).replace('/', '.'), | |
| 88 'superclass': '', | |
| 89 'annotations': {}, | |
| 90 'methods': [], | |
| 91 } | |
| 92 results['classes'].append(class_result) | |
| 93 annotation = None | |
| 94 annotation_has_value = False | |
| 95 method_result = None | |
| 96 continue | |
| 97 | 101 |
| 98 if not class_result: | 102 m = _PROGUARD_SUPERCLASS_RE.match(line) |
| 99 continue | 103 if m: |
| 104 class_result['superclass'] = m.group(1).replace('/', '.') |
| 105 continue |
| 100 | 106 |
| 101 m = _PROGUARD_SUPERCLASS_RE.match(line) | 107 m = _PROGUARD_SECTION_RE.match(line) |
| 102 if m: | 108 if m: |
| 103 class_result['superclass'] = m.group(1).replace('/', '.') | 109 annotation = None |
| 104 continue | 110 annotation_has_value = False |
| 111 method_result = None |
| 112 continue |
| 105 | 113 |
| 106 m = _PROGUARD_SECTION_RE.match(line) | 114 m = _PROGUARD_METHOD_RE.match(line) |
| 107 if m: | 115 if m: |
| 108 annotation = None | 116 method_result = { |
| 109 annotation_has_value = False | 117 'method': m.group(1), |
| 110 method_result = None | 118 'annotations': {}, |
| 111 continue | 119 } |
| 120 class_result['methods'].append(method_result) |
| 121 annotation = None |
| 122 annotation_has_value = False |
| 123 continue |
| 112 | 124 |
| 113 m = _PROGUARD_METHOD_RE.match(line) | 125 m = _PROGUARD_ANNOTATION_RE.match(line) |
| 114 if m: | 126 if m: |
| 115 method_result = { | 127 # Ignore the annotation package. |
| 116 'method': m.group(1), | 128 annotation = m.group(1).split('/')[-1] |
| 117 'annotations': {}, | 129 if method_result: |
| 118 } | 130 method_result['annotations'][annotation] = None |
| 119 class_result['methods'].append(method_result) | 131 else: |
| 120 annotation = None | 132 class_result['annotations'][annotation] = None |
| 121 annotation_has_value = False | 133 continue |
| 122 continue | |
| 123 | 134 |
| 124 m = _PROGUARD_ANNOTATION_RE.match(line) | 135 if annotation: |
| 125 if m: | 136 if not annotation_has_value: |
| 126 # Ignore the annotation package. | 137 m = _PROGUARD_ANNOTATION_CONST_RE.match(line) |
| 127 annotation = m.group(1).split('/')[-1] | 138 annotation_has_value = bool(m) |
| 128 if method_result: | 139 else: |
| 129 method_result['annotations'][annotation] = None | 140 m = _PROGUARD_ANNOTATION_VALUE_RE.match(line) |
| 130 else: | 141 if m: |
| 131 class_result['annotations'][annotation] = None | 142 if method_result: |
| 132 continue | 143 method_result['annotations'][annotation] = m.group(1) |
| 133 | 144 else: |
| 134 if annotation: | 145 class_result['annotations'][annotation] = m.group(1) |
| 135 if not annotation_has_value: | 146 annotation_has_value = None |
| 136 m = _PROGUARD_ANNOTATION_CONST_RE.match(line) | |
| 137 annotation_has_value = bool(m) | |
| 138 else: | |
| 139 m = _PROGUARD_ANNOTATION_VALUE_RE.match(line) | |
| 140 if m: | |
| 141 if method_result: | |
| 142 method_result['annotations'][annotation] = m.group(1) | |
| 143 else: | |
| 144 class_result['annotations'][annotation] = m.group(1) | |
| 145 annotation_has_value = None | |
| 146 | |
| 147 return results | 147 return results |
| 148 | |
| OLD | NEW |