Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: build/android/gyp/apk_obfuscate.py

Issue 321883002: Make test apks only dex files not in tested apk (proguard version) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright 2014 The Chromium Authors. All rights reserved. 3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 """Generates the obfuscated jar and test jar for an apk. 7 """Generates the obfuscated jar and test jar for an apk.
8 8
9 If proguard is not enabled or 'Release' is not in the configuration name, 9 If proguard is not enabled or 'Release' is not in the configuration name,
10 obfuscation will be a no-op. 10 obfuscation will be a no-op.
11 """ 11 """
12 12
13 import fnmatch 13 import fnmatch
14 import optparse 14 import optparse
15 import os 15 import os
16 import sys 16 import sys
17 import zipfile 17 import zipfile
18 18
19 from util import build_utils 19 from util import build_utils
20 20
21 def ParseArgs(argv): 21 def ParseArgs(argv):
22 parser = optparse.OptionParser() 22 parser = optparse.OptionParser()
23 parser.add_option('--android-sdk', help='path to the Android SDK folder') 23 parser.add_option('--android-sdk', help='path to the Android SDK folder')
24 parser.add_option('--android-sdk-tools', 24 parser.add_option('--android-sdk-tools',
25 help='path to the Android SDK build tools folder') 25 help='path to the Android SDK build tools folder')
26 parser.add_option('--android-sdk-jar', 26 parser.add_option('--android-sdk-jar',
27 help='path to Android SDK\'s android.jar') 27 help='path to Android SDK\'s android.jar')
28 parser.add_option('--proguard-jar-path', 28 parser.add_option('--proguard-jar-path',
29 help='Path to proguard.jar in the sdk') 29 help='Path to proguard.jar in the sdk')
30
31 parser.add_option('--input-jars-paths', 30 parser.add_option('--input-jars-paths',
32 help='Path to jars to include in obfuscated jar') 31 help='Path to jars to include in obfuscated jar')
33 32
34 parser.add_option('--proguard-config-files', 33 parser.add_option('--proguard-configs',
35 help='Paths to proguard config files') 34 help='Paths to proguard config files')
36 35
37 parser.add_option('--configuration-name', 36 parser.add_option('--configuration-name',
38 help='Gyp configuration name (i.e. Debug, Release)') 37 help='Gyp configuration name (i.e. Debug, Release)')
39 parser.add_option('--proguard-enabled', action='store_true', 38 parser.add_option('--proguard-enabled', action='store_true',
40 help='Set if proguard is enabled for this target.') 39 help='Set if proguard is enabled for this target.')
41 40
42 parser.add_option('--obfuscated-jar-path', 41 parser.add_option('--obfuscated-jar-path',
43 help='Output path for obfuscated jar.') 42 help='Output path for obfuscated jar.')
44 43
45 parser.add_option('--testapp', action='store_true', 44 parser.add_option('--testapp', action='store_true',
46 help='Set this if building an instrumentation test apk') 45 help='Set this if building an instrumentation test apk')
46 parser.add_option('--tested-apk-obfuscated-jar-path',
47 help='Path to obfusctated jar of the tested apk')
47 parser.add_option('--test-jar-path', 48 parser.add_option('--test-jar-path',
48 help='Output path for jar containing all the test apk\'s ' 49 help='Output path for jar containing all the test apk\'s '
49 'code.') 50 'code.')
50 51
51 parser.add_option('--stamp', help='File to touch on success') 52 parser.add_option('--stamp', help='File to touch on success')
52 53
53 (options, args) = parser.parse_args(argv) 54 (options, args) = parser.parse_args(argv)
54 55
55 if args: 56 if args:
56 parser.error('No positional arguments should be given. ' + str(args)) 57 parser.error('No positional arguments should be given. ' + str(args))
57 58
58 # Check that required options have been provided. 59 # Check that required options have been provided.
59 required_options = ( 60 required_options = (
60 'android_sdk', 61 'android_sdk',
61 'android_sdk_tools', 62 'android_sdk_tools',
62 'android_sdk_jar', 63 'android_sdk_jar',
63 'proguard_jar_path', 64 'proguard_jar_path',
64 'input_jars_paths', 65 'input_jars_paths',
65 'configuration_name', 66 'configuration_name',
66 'obfuscated_jar_path', 67 'obfuscated_jar_path',
67 ) 68 )
69 if options.testapp:
70 required_options += (
71 'tested_apk_obfuscated_jar_path',
72 'test_jar_path',
73 )
68 build_utils.CheckOptions(options, parser, required=required_options) 74 build_utils.CheckOptions(options, parser, required=required_options)
69 75
70 return options, args 76 return options, args
71 77
72 78
73 def main(argv): 79 def main(argv):
74 options, _ = ParseArgs(argv) 80 options, _ = ParseArgs(argv)
75 81
76 library_classpath = [options.android_sdk_jar] 82 library_classpath = [options.android_sdk_jar]
77 javac_custom_classpath = build_utils.ParseGypList(options.input_jars_paths) 83 input_jars = build_utils.ParseGypList(options.input_jars_paths)
78 84
79 dependency_class_filters = [ 85 dependency_class_filters = [
80 '*R.class', '*R$*.class', '*Manifest.class', '*BuildConfig.class'] 86 '*R.class', '*R$*.class', '*Manifest.class', '*BuildConfig.class']
81 87
82 def DependencyClassFilter(name): 88 def DependencyClassFilter(name):
83 for name_filter in dependency_class_filters: 89 for name_filter in dependency_class_filters:
84 if fnmatch.fnmatch(name, name_filter): 90 if fnmatch.fnmatch(name, name_filter):
85 return False 91 return False
86 return True 92 return True
87 93
88 if options.testapp: 94 if options.testapp:
89 with zipfile.ZipFile(options.test_jar_path, 'w') as test_jar: 95 with zipfile.ZipFile(options.test_jar_path, 'w') as test_jar:
90 for jar in build_utils.ParseGypList(options.input_jars_paths): 96 for jar in input_jars:
91 with zipfile.ZipFile(jar, 'r') as jar_zip: 97 with zipfile.ZipFile(jar, 'r') as jar_zip:
92 for name in filter(DependencyClassFilter, jar_zip.namelist()): 98 for name in filter(DependencyClassFilter, jar_zip.namelist()):
93 with jar_zip.open(name) as zip_entry: 99 with jar_zip.open(name) as zip_entry:
94 test_jar.writestr(name, zip_entry.read()) 100 test_jar.writestr(name, zip_entry.read())
95 101
96 if options.configuration_name == 'Release' and options.proguard_enabled: 102 if 'Release' in options.configuration_name and options.proguard_enabled:
Yaron 2014/06/11 00:45:26 needs rebase :)
cjhopman 2014/06/12 20:36:44 Done.
97 proguard_project_classpath = javac_custom_classpath
98
99 proguard_cmd = [ 103 proguard_cmd = [
100 'java', '-jar', options.proguard_jar_path, 104 'java', '-jar', options.proguard_jar_path,
101 '-forceprocessing', 105 '-forceprocessing',
102 '-injars', ':'.join(proguard_project_classpath),
103 '-libraryjars', ':'.join(library_classpath), 106 '-libraryjars', ':'.join(library_classpath),
104 '-outjars', options.obfuscated_jar_path,
105 '-dump', options.obfuscated_jar_path + '.dump', 107 '-dump', options.obfuscated_jar_path + '.dump',
106 '-printseeds', options.obfuscated_jar_path + '.seeds', 108 '-printseeds', options.obfuscated_jar_path + '.seeds',
107 '-printusage', options.obfuscated_jar_path + '.usage', 109 '-printusage', options.obfuscated_jar_path + '.usage',
108 '-printmapping', options.obfuscated_jar_path + '.mapping', 110 '-printmapping', options.obfuscated_jar_path + '.mapping',
109 ] 111 ]
110 112
111 for proguard_file in build_utils.ParseGypList( 113 exclude_paths = []
112 options.proguard_config_files): 114 configs = build_utils.ParseGypList(options.proguard_configs)
113 proguard_cmd += ['-include', proguard_file] 115 if (options.tested_apk_obfuscated_jar_path and
116 options.tested_apk_obfuscated_jar_path != '/'):
117 tested_jar_info = build_utils.ReadJson(
118 options.tested_apk_obfuscated_jar_path + '.info')
119 exclude_paths = tested_jar_info['inputs']
120 # configs should only contain the process_resources.py generated config.
121 assert len(configs) == 1, (
Yaron 2014/06/11 00:45:26 nit: move to the top of the block.
cjhopman 2014/06/12 20:36:44 Done.
122 'test apks should not have custom proguard configs: ' + str(configs))
123 configs = tested_jar_info['configs']
124 proguard_cmd += [
125 '-dontobfuscate',
126 '-dontoptimize',
127 '-dontskipnonpubliclibraryclassmembers',
128 '-libraryjars', options.tested_apk_obfuscated_jar_path,
129 '-applymapping', options.tested_apk_obfuscated_jar_path + '.mapping',
130 ]
131
132 proguard_injars = [p for p in input_jars if p not in exclude_paths]
133 proguard_cmd += [ '-injars', ':'.join(proguard_injars), ]
Yaron 2014/06/11 00:45:26 nit: no trailing "," or leading " "
cjhopman 2014/06/12 20:36:44 Done.
134
135 for config_file in configs:
136 proguard_cmd += ['-include', config_file]
137
138 # The output jar must be specified after inputs.
139 proguard_cmd += ['-outjars', options.obfuscated_jar_path]
114 140
115 build_utils.CheckOutput(proguard_cmd) 141 build_utils.CheckOutput(proguard_cmd)
142
143 this_info = {
144 'inputs': proguard_injars,
145 'configs': configs
146 }
147
148 build_utils.WriteJson(
149 this_info, options.obfuscated_jar_path + '.info')
116 else: 150 else:
117 output_files = [ 151 output_files = [
118 options.obfuscated_jar_path, 152 options.obfuscated_jar_path,
153 options.obfuscated_jar_path + '.info',
119 options.obfuscated_jar_path + '.dump', 154 options.obfuscated_jar_path + '.dump',
120 options.obfuscated_jar_path + '.seeds', 155 options.obfuscated_jar_path + '.seeds',
121 options.obfuscated_jar_path + '.usage', 156 options.obfuscated_jar_path + '.usage',
122 options.obfuscated_jar_path + '.mapping'] 157 options.obfuscated_jar_path + '.mapping']
123 for f in output_files: 158 for f in output_files:
124 if os.path.exists(f): 159 if os.path.exists(f):
125 os.remove(f) 160 os.remove(f)
126 build_utils.Touch(f) 161 build_utils.Touch(f)
127 162
128 if options.stamp: 163 if options.stamp:
129 build_utils.Touch(options.stamp) 164 build_utils.Touch(options.stamp)
130 165
131 if __name__ == '__main__': 166 if __name__ == '__main__':
132 sys.exit(main(sys.argv[1:])) 167 sys.exit(main(sys.argv[1:]))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698