Skip to content

Commit

Permalink
Add support for proguard preprocessing.
Browse files Browse the repository at this point in the history
* Adds support for running proguard on our libraries
before they are added to the final release APK.
* Start using the proguard preprocessing for
third_party/guava.

BUG=272790
NOTRY=true
TBR=darin@chromium.org

Review URL: https://chromiumcodereview.appspot.com/23213002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217706 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
cjhopman@chromium.org committed Aug 15, 2013
1 parent 8ce89cd commit 582a857
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 2 deletions.
55 changes: 55 additions & 0 deletions build/android/gyp/proguard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env python
#
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import fnmatch
import optparse
import os
import sys

from util import build_utils

def DoProguard(options):
injars = options.input_path
outjars = options.output_path
classpath = build_utils.ParseGypList(options.classpath)
classpath = list(set(classpath))
libraryjars = ':'.join(classpath)
# proguard does its own dependency checking, which can be avoided by deleting
# the output.
if os.path.exists(options.output_path):
os.remove(options.output_path)
proguard_cmd = [options.proguard_path,
'-injars', injars,
'-outjars', outjars,
'-libraryjars', libraryjars,
'@' + options.proguard_config]
build_utils.CheckCallDie(proguard_cmd)

def main(argv):
parser = optparse.OptionParser()
parser.add_option('--proguard-path',
help='Path to the proguard executable.')
parser.add_option('--input-path',
help='Path to the .jar file proguard should run on.')
parser.add_option('--output-path', help='Path to the generated .jar file.')
parser.add_option('--proguard-config',
help='Path to the proguard configuration file.')
parser.add_option('--classpath', help="Classpath for proguard.")
parser.add_option('--stamp', help='Path to touch on success.')

# TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
parser.add_option('--ignore', help='Ignored.')

options, _ = parser.parse_args()

DoProguard(options)

if options.stamp:
build_utils.Touch(options.stamp)


if __name__ == '__main__':
sys.exit(main(sys.argv))
48 changes: 46 additions & 2 deletions build/java.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@
'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)',
'classes_dir': '<(intermediate_dir)/classes',
'compile_stamp': '<(intermediate_dir)/compile.stamp',
'proguard_config%': '',
'proguard_preprocess%': '0',
'variables': {
'variables': {
'proguard_preprocess%': 0,
},
'conditions': [
['proguard_preprocess == 1', {
'javac_jar_path': '<(intermediate_dir)/<(_target_name).pre.jar'
}, {
'javac_jar_path': '<(PRODUCT_DIR)/lib.java/<(jar_name)'
}],
],
},
'javac_jar_path': '<(javac_jar_path)',
},
# This all_dependent_settings is used for java targets only. This will add the
# jar path to the classpath of dependent java targets.
Expand Down Expand Up @@ -218,6 +233,35 @@
},
],
}],
['proguard_preprocess == 1', {
'actions': [
{
'action_name': 'proguard_<(_target_name)',
'message': 'Proguard preprocessing <(_target_name) jar',
'inputs': [
'<(android_sdk_root)/tools/proguard/bin/proguard.sh',
'<(DEPTH)/build/android/gyp/util/build_utils.py',
'<(DEPTH)/build/android/gyp/proguard.py',
'<(javac_jar_path)',
'<(proguard_config)',
],
'outputs': [
'<(jar_path)',
],
'action': [
'python', '<(DEPTH)/build/android/gyp/proguard.py',
'--proguard-path=<(android_sdk_root)/tools/proguard/bin/proguard.sh',
'--input-path=<(javac_jar_path)',
'--output-path=<(jar_path)',
'--proguard-config=<(proguard_config)',
'--classpath=<(android_sdk_jar) >(input_jars_paths)',

# TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
'--ignore=>!(echo \'>(_inputs)\' | md5sum)',
]
},
],
}],
],
'actions': [
{
Expand Down Expand Up @@ -263,12 +307,12 @@
'<(compile_stamp)',
],
'outputs': [
'<(jar_path)',
'<(javac_jar_path)',
],
'action': [
'python', '<(DEPTH)/build/android/gyp/jar.py',
'--classes-dir=<(classes_dir)',
'--jar-path=<(jar_path)',
'--jar-path=<(javac_jar_path)',
'--excluded-classes=<(jar_excluded_classes)',

# TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
Expand Down
2 changes: 2 additions & 0 deletions third_party/guava/guava.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
'type': 'none',
'variables': {
'java_in_dir': 'src/guava',
'proguard_preprocess': 1,
'proguard_config': 'proguard.flags',
},
'dependencies': [
'../../third_party/jsr-305/jsr-305.gyp:jsr_305_javalib',
Expand Down
33 changes: 33 additions & 0 deletions third_party/guava/proguard.flags
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

-keep class com.google.common.base.** {
*;
}

-keep class com.google.common.annotations.** {
*;
}

-keep class com.google.common.collect.** {
*;
}

-keepattributes Signature

# Don't complain about usage of sun.misc.Unsafe. Guava imports this,
# but does not use it unless it exists.
# The gyp-target that uses this is guava.gyp:guava_javalib.
-dontwarn sun.misc.Unsafe
# Striped64 uses reflection to access some local fields.
-dontnote com.google.common.cache.Striped64
-dontnote com.google.common.cache.Striped64$Cell

# Keep all enum values and valueOf methods. See
# http://proguard.sourceforge.net/index.html#manual/examples.html
# for the reason for this. Also, see http://crbug.com/248037.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

0 comments on commit 582a857

Please sign in to comment.