//
// This Gradle build file illustrates how to process ProGuard itself.
// Configuration files for typical applications will be very similar.
// Usage:
//     gradle -b proguard.gradle proguard
//

// Tell Gradle where to find the ProGuard task.

buildscript {
    repositories {
        flatDir dirs: '../../lib'
    }
    dependencies {
        classpath ':proguard'
    }
}

// Define a ProGuard task.

task ('proguard', type: proguard.gradle.ProGuardTask) {

    // You should probably import a more compact ProGuard-style configuration
    // file for all static settings, but we're specifying them all here, for
    // the sake of the example.
    //configuration 'configuration.pro'

    verbose

    // Specify the input jars, output jars, and library jars.
    // We'll filter out the Ant classes, Gradle classes, and WTK classes, keeping
    // everything else.

    injars  '../../lib/proguard.jar', filter: '!proguard/ant/**,!proguard/gradle/**,!proguard/wtk/**'
    outjars 'proguard_out.jar'

    // Automatically handle the Java version of this build.
    if (System.getProperty('java.version').startsWith('1.')) {
        // Before Java 9, the runtime classes were packaged in a single jar file.
        libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    } else {
        // As of Java 9, the runtime classes are packaged in modular jmod files.
        libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class'
    }

    // Write out an obfuscation mapping file, for de-obfuscating any stack traces
    // later on, or for incremental obfuscation of extensions.

    printmapping 'proguard.map'

    // Don't print notes about reflection in injected code.

    dontnote 'proguard.configuration.ConfigurationLogger'

    // Don't print warnings about GSON dependencies.

    dontwarn 'com.google.gson.**'

    // Preserve injected GSON utility classes and their members.

    keep allowobfuscation: true, 'class proguard.optimize.gson._*'
    keepclassmembers 'class proguard.optimize.gson._* { \
        *; \
    }'

    // Obfuscate class strings of injected GSON utility classes.

    adaptclassstrings 'proguard.optimize.gson.**'

    // Allow methods with the same signature, except for the return type,
    // to get the same obfuscation name.

    overloadaggressively

    // Put all obfuscated classes into the nameless root package.

    repackageclasses ''

    // Allow classes and class members to be made public.

    allowaccessmodification

    // The entry point: ProGuard and its main method.

    keep 'public class proguard.ProGuard { \
        public static void main(java.lang.String[]); \
    }'

    // If you want to preserve the Ant task as well, you'll have to specify the
    // main ant.jar.

    //libraryjars '/usr/local/java/ant/lib/ant.jar'
    //adaptresourcefilecontents 'proguard/ant/task.properties'
    //
    //keep allowobfuscation: true, 'class proguard.ant.*'
    //keepclassmembers 'public class proguard.ant.* { \
    //    <init>(org.apache.tools.ant.Project); \
    //    public void set*(***); \
    //    public void add*(***); \
    //}'

    // If you want to preserve the Gradle task, you'll have to specify the Gradle
    // jars.

    //libraryjars '/usr/local/java/gradle-4.2.1/lib/plugins/gradle-plugins-4.2.1.jar'
    //libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-base-services-4.2.1.jar'
    //libraryjars '/usr/local/java/gradle-4.2.1/lib/gradle-core-4.2.1.jar'
    //libraryjars '/usr/local/java/gradle-4.2.1/lib/groovy-all-2.4.12.jar'

    //keep 'public class proguard.gradle.* { \
    //    public *; \
    //}'

    // If you want to preserve the WTK obfuscation plug-in, you'll have to specify
    // the kenv.zip file.

    //libraryjars '/usr/local/java/wtk2.5.2/wtklib/kenv.zip'
    //keep 'public class proguard.wtk.ProGuardObfuscator'
}
