1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#
2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# This ProGuard configuration file illustrates how to process Scala
3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# applications, including the Scala runtime.
4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Usage:
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#     java -jar proguard.jar @scala.pro
6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#
7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Specify the input jars, output jars, and library jars.
9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-injars  in.jar
11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-injars  /usr/local/java/scala-2.9.1/lib/scala-library.jar
12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-injars  /usr/local/java/scala-2.9.1/lib/scala-compiler.jar(!META-INF/MANIFEST.MF)
13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-injars  /usr/local/java/scala-2.9.1/lib/jline.jar(!META-INF/MANIFEST.MF)
14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-outjars out.jar
15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-libraryjars <java.home>/lib/rt.jar
17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-libraryjars /usr/local/java/ant/lib/ant.jar
18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#...
19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Ignore some compiler artefacts.
21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-dontwarn scala.**
23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# traces later on. Keep a fixed source file attribute and all line number
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# tables to get line numbers in the stack traces.
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# You can comment this out if you're not interested in stack traces.
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-printmapping out.map
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-renamesourcefileattribute SourceFile
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepattributes SourceFile,LineNumberTable
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve all annotations.
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepattributes *Annotation*
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# You can print out the seeds that are matching the keep options below.
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-printseeds out.seeds
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve all public applications.
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclasseswithmembers public class * {
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public static void main(java.lang.String[]);
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve some classes and class members that are accessed by means of
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# introspection.
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keep class * implements org.xml.sax.EntityResolver
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembers class * {
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    ** MODULE$;
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    long eventCount;
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int  workerCounts;
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int  runControl;
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int base;
66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int sp;
67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int runState;
68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int status;
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve some classes and class members that are accessed by means of
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# introspection in the Scala compiler library, if it is processed as well.
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-keep class * implements jline.Completor
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-keep class * implements jline.Terminal
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-keep class scala.tools.nsc.Global
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-keepclasseswithmembers class * {
89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#    <init>(scala.tools.nsc.Global);
90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#}
91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#-keepclassmembers class * {
93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#    *** scala_repl_value();
94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#    *** scala_repl_result();
95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#}
96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve all native method names and the names of their classes.
98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom-keepclasseswithmembernames,includedescriptorclasses class * {
100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    native <methods>;
101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Preserve the special static methods that are required in all enumeration
104b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# classes.
105b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom-keepclassmembers,allowoptimization enum * {
107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public static **[] values();
108b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public static ** valueOf(java.lang.String);
109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
111b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Explicitly preserve all serialization members. The Serializable interface
112b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# is only a marker interface, so it wouldn't save them.
113b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# You can comment this out if your application doesn't use serialization.
114b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# If your code contains serializable classes that have to be backward 
115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# compatible, please refer to the manual.
116b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang-keepclassmembers class * implements java.io.Serializable {
118b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    static final long serialVersionUID;
119b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    static final java.io.ObjectStreamField[] serialPersistentFields;
120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private void writeObject(java.io.ObjectOutputStream);
121b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private void readObject(java.io.ObjectInputStream);
122b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    java.lang.Object writeReplace();
123b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    java.lang.Object readResolve();
124b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# Your application may contain more items that need to be preserved; 
127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# typically classes that are dynamically created using Class.forName:
128b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# -keep public class mypackage.MyClass
130b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# -keep public interface mypackage.MyInterface
131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang# -keep public class * implements mypackage.MyInterface
132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
133