aboutsummaryrefslogblamecommitdiff
path: root/libraries/proguard/Proguard.scala
blob: 7d57a777b1d6aebdb26a52a905ed14d4d7ce0446 (plain) (tree)
1
2
3
4
5
6
7
8
9




                                         
                                                     


                                                                                  
                                                                                          

                                                                              
                                                                      

                                                                                  
                                                                            

                                                                                
                                                                          




                                                 



                                                                                     


                           

                                     




                                                           
                                                          







                                                                                       


                                                                                                
                                                                       
                                                                                                 
                                                                                                 
                                                                                                                   




                                                                                                                                    


                                                                                                                                                                                  







































                                                                                                                                                                                                                                                            




















































                                                                                             
                                            
                         
                                                              
                                                                   
                            

                                                                                                                  


                                                                                          
                             
                                     
                              

                                     
                                                                         
                                                                

                                                                         





                                                                                                          




                                               




















































                                                                                                              



                                            



                                                                


     
package cbt
package proguard
import java.io.File
import java.nio.file.Files.deleteIfExists

sealed class KeepOptionModifier( val string: String )
object KeepOptionModifier {
  /* AUTO GENERATED SECTION BEGIN: keepModifiers */
  /** Also keep any classes in the descriptors of specified fields and methods. */
  object includedescriptorclasses extends KeepOptionModifier( "includedescriptorclasses" )

  /** Allow the specified entry points to be removed in the shrinking step. */
  object allowshrinking extends KeepOptionModifier( "allowshrinking" )

  /** Allow the specified entry points to be modified in the optimization step. */
  object allowoptimization extends KeepOptionModifier( "allowoptimization" )

  /** Allow the specified entry points to be renamed in the obfuscation step. */
  object allowobfuscation extends KeepOptionModifier( "allowobfuscation" )
  /* AUTO GENERATED SECTION END: keepModifiers */
}

object ProGuard {
  val artifactId = "proguard-base"
  val groupId    = "net.sf.proguard"
  val version    = "5.3.2"
  val mainClass  = "proguard.ProGuard"
  val `rt.jar`   = Seq( new File( System.getProperty( "java.home" ), "lib/rt.jar" ) )
}
case class ProGuard[T](
  main: Seq[String] => Int,
  T:    Seq[File]   => T,
  log:  String      => Unit = _ => ()
) {

  /**
  Typed interface on top of the proguard command line tool.
  Check the official ProGuard docs for usage.
  Use `Some(  None )` to call an option without arguments.
  Use `true` to set a flag.

  @see https://www.guardsquare.com/en/proguard/manual/refcard
  @see https://www.guardsquare.com/en/proguard/manual/usage

  /* AUTO GENERATED SECTION BEGIN: docs */
  @param include Read configuration options from the given file.
  @param basedirectory Specifies the base directory for subsequent relative file names.
  @param injars Specifies the program jars ( or wars, ears, zips, or directories ).
  @param outjars Specifies the names of the output jars ( or wars, ears, zips, or directories ).
  @param libraryjars Specifies the library jars ( or wars, ears, zips, or directories ).
  @param skipnonpubliclibraryclasses Ignore non-public library classes.
  @param dontskipnonpubliclibraryclasses Don't ignore non-public library classes ( the default ).
  @param dontskipnonpubliclibraryclassmembers Don't ignore package visible library class members.
  @param keepdirectories Keep the specified directories in the output jars ( or wars, ears, zips, or directories ).
  @param target Set the given version number in the processed classes.
  @param forceprocessing Process the input, even if the output seems up to date.
  @param keep Preserve the specified classes and class members.
  @param keepclassmembers Preserve the specified class members, if their classes are preserved as well.
  @param keepclasseswithmembers Preserve the specified classes and class members, if all of the specified class members are present.
  @param keepnames Preserve the names of the specified classes and class members ( if they aren't removed in the shrinking step ).
  @param keepclassmembernames Preserve the names of the specified class members ( if they aren't removed in the shrinking step ).
  @param keepclasseswithmembernames Preserve the names of the specified classes and class members, if all of the specified class members are present ( after the shrinking step ).
  @param printseeds List classes and class members matched by the various -keep options, to the standard output or to the given file.
  @param dontshrink Don't shrink the input class files.
  @param printusage List dead code of the input class files, to the standard output or to the given file.
  @param whyareyoukeeping Print details on why the given classes and class members are being kept in the shrinking step.
  @param dontoptimize Don't optimize the input class files.
  @param optimizations The optimizations to be enabled and disabled.
  @param optimizationpasses The number of optimization passes to be performed.
  @param assumenosideeffects Assume that the specified methods don't have any side effects, while optimizing.
  @param allowaccessmodification Allow the access modifiers of classes and class members to be modified, while optimizing.
  @param mergeinterfacesaggressively Allow any interfaces to be merged, while optimizing.
  @param dontobfuscate Don't obfuscate the input class files.
  @param printmapping Print the mapping from old names to new names for classes and class members that have been renamed, to the standard output or to the given file.
  @param applymapping Reuse the given mapping, for incremental obfuscation.
  @param obfuscationdictionary Use the words in the given text file as obfuscated field names and method names.
  @param classobfuscationdictionary Use the words in the given text file as obfuscated class names.
  @param packageobfuscationdictionary Use the words in the given text file as obfuscated package names.
  @param overloadaggressively Apply aggressive overloading while obfuscating.
  @param useuniqueclassmembernames Ensure uniform obfuscated class member names for subsequent incremental obfuscation.
  @param dontusemixedcaseclassnames Don't generate mixed-case class names while obfuscating.
  @param keeppackagenames Keep the specified package names from being obfuscated.
  @param flattenpackagehierarchy Repackage all packages that are renamed into the single given parent package.
  @param repackageclasses Repackage all class files that are renamed into the single given package.
  @param keepattributes Preserve the given optional attributes; typically Exceptions, InnerClasses, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, and *Annotation*.
  @param keepparameternames Keep the parameter names and types of methods that are kept.
  @param renamesourcefileattribute Put the given constant string in the SourceFile attributes.
  @param adaptclassstrings Adapt string constants in the specified classes, based on the obfuscated names of any corresponding classes.
  @param adaptresourcefilenames Rename the specified resource files, based on the obfuscated names of the corresponding class files.
  @param adaptresourcefilecontents Update the contents of the specified resource files, based on the obfuscated names of the processed classes.
  @param dontpreverify Don't preverify the processed class files.
  @param microedition Target the processed class files at Java Micro Edition.
  @param verbose Write out some more information during processing.
  @param dontnote Don't print notes about potential mistakes or omissions in the configuration.
  @param dontwarn Don't warn about unresolved references at all.
  @param ignorewarnings Print warnings about unresolved references, but continue processing anyhow.
  @param printconfiguration Write out the entire configuration in traditional ProGuard style, to the standard output or to the given file.
  @param dump Write out the internal structure of the processed class files, to the standard output or to the given file.
  /* AUTO GENERATED SECTION END: docs */
    */
  case class proguard(
    /* AUTO GENERATED SECTION BEGIN: params */
    include:                              Option[File]                              = None,
    basedirectory:                        Option[File]                              = None,
    injars:                               Option[Seq[File]]                         = None,
    outjars:                              Option[Seq[File]]                         = None,
    libraryjars:                          Option[Seq[File]]                         = None,
    skipnonpubliclibraryclasses:          Boolean                                   = false,
    dontskipnonpubliclibraryclasses:      Boolean                                   = false,
    dontskipnonpubliclibraryclassmembers: Boolean                                   = false,
    keepdirectories:                      Option[Option[String]]                    = None,
    target:                               Option[String]                            = None,
    forceprocessing:                      Boolean                                   = false,
    keep:                                 Option[( Seq[KeepOptionModifier], String )] = None,
    keepclassmembers:                     Option[( Seq[KeepOptionModifier], String )] = None,
    keepclasseswithmembers:               Option[( Seq[KeepOptionModifier], String )] = None,
    keepnames:                            Option[String]                            = None,
    keepclassmembernames:                 Option[String]                            = None,
    keepclasseswithmembernames:           Option[String]                            = None,
    printseeds:                           Option[Option[File]]                      = None,
    dontshrink:                           Boolean                                   = false,
    printusage:                           Option[Option[File]]                      = None,
    whyareyoukeeping:                     Option[String]                            = None,
    dontoptimize:                         Boolean                                   = false,
    optimizations:                        Option[String]                            = None,
    optimizationpasses:                   Option[Int]                               = None,
    assumenosideeffects:                  Option[String]                            = None,
    allowaccessmodification:              Boolean                                   = false,
    mergeinterfacesaggressively:          Boolean                                   = false,
    dontobfuscate:                        Boolean                                   = false,
    printmapping:                         Option[Option[File]]                      = None,
    applymapping:                         Option[File]                              = None,
    obfuscationdictionary:                Option[File]                              = None,
    classobfuscationdictionary:           Option[File]                              = None,
    packageobfuscationdictionary:         Option[File]                              = None,
    overloadaggressively:                 Boolean                                   = false,
    useuniqueclassmembernames:            Boolean                                   = false,
    dontusemixedcaseclassnames:           Boolean                                   = false,
    keeppackagenames:                     Option[Option[String]]                    = None,
    flattenpackagehierarchy:              Option[Option[String]]                    = None,
    repackageclasses:                     Option[Option[String]]                    = None,
    keepattributes:                       Option[Option[String]]                    = None,
    keepparameternames:                   Boolean                                   = false,
    renamesourcefileattribute:            Option[Option[String]]                    = None,
    adaptclassstrings:                    Option[Option[String]]                    = None,
    adaptresourcefilenames:               Option[Option[String]]                    = None,
    adaptresourcefilecontents:            Option[Option[String]]                    = None,
    dontpreverify:                        Boolean                                   = false,
    microedition:                         Boolean                                   = false,
    verbose:                              Boolean                                   = false,
    dontnote:                             Option[Option[String]]                    = None,
    dontwarn:                             Option[Option[String]]                    = None,
    ignorewarnings:                       Boolean                                   = false,
    printconfiguration:                   Option[Option[File]]                      = None,
    dump:                                 Option[Option[File]]                      = None
    /* AUTO GENERATED SECTION END: params */
  ) extends ( () => T ) {
    // type class rendering scala values into string arguments
    private class argsFor[T]( val apply: T => Option[Seq[String]] )
    private object argsFor {
      def apply[T: argsFor]( value: T ) = implicitly[argsFor[T]].apply( value )
      implicit object SeqFile extends argsFor[Seq[File]]( v => Some( Seq( v.map( _.getPath ).mkString( ":" ) ) ) )
      implicit object File    extends argsFor[File]( v      => Some( Seq( v.getPath ) ) )
      implicit object String  extends argsFor[String]( v    => Some( Seq( v ) ) )
      implicit object Int     extends argsFor[Int]( i       => Some( Seq( i.toString ) ) )
      implicit object Boolean
          extends argsFor[Boolean]( {
            case false => None
            case true  => Some( Nil )
          } )
      implicit def Option2[T: argsFor]: argsFor[Option[T]] = new argsFor(
        _.map( implicitly[argsFor[T]].apply( _ ).toSeq.flatten )
      )
      implicit def Option3[T: argsFor]: argsFor[Option[Option[String]]] =
        new argsFor( _.map( _.toSeq ) )
      implicit def SpecWithModifiers: argsFor[( Seq[KeepOptionModifier], String )] =
        new argsFor( {
          case ( modifiers, spec ) =>
            Some( Seq( modifiers.map( _.string ).map( "," ++ _ ).mkString ).filterNot( _ == "" ) :+ spec )
        } )
    }

    // capture string argument values and names
    val args = (
      /* AUTO GENERATED SECTION BEGIN: args */
      argsFor( include ).map( "-include" +: _ )
        ++ argsFor( basedirectory ).map( "-basedirectory" +: _ )
        ++ argsFor( injars ).map( "-injars" +: _ )
        ++ argsFor( outjars ).map( "-outjars" +: _ )
        ++ argsFor( libraryjars ).map( "-libraryjars" +: _ )
        ++ argsFor( skipnonpubliclibraryclasses ).map( "-skipnonpubliclibraryclasses" +: _ )
        ++ argsFor( dontskipnonpubliclibraryclasses ).map( "-dontskipnonpubliclibraryclasses" +: _ )
        ++ argsFor( dontskipnonpubliclibraryclassmembers ).map( "-dontskipnonpubliclibraryclassmembers" +: _ )
        ++ argsFor( keepdirectories ).map( "-keepdirectories" +: _ )
        ++ argsFor( target ).map( "-target" +: _ )
        ++ argsFor( forceprocessing ).map( "-forceprocessing" +: _ )
        ++ argsFor( keep ).map( "-keep" +: _ )
        ++ argsFor( keepclassmembers ).map( "-keepclassmembers" +: _ )
        ++ argsFor( keepclasseswithmembers ).map( "-keepclasseswithmembers" +: _ )
        ++ argsFor( keepnames ).map( "-keepnames" +: _ )
        ++ argsFor( keepclassmembernames ).map( "-keepclassmembernames" +: _ )
        ++ argsFor( keepclasseswithmembernames ).map( "-keepclasseswithmembernames" +: _ )
        ++ argsFor( printseeds ).map( "-printseeds" +: _ )
        ++ argsFor( dontshrink ).map( "-dontshrink" +: _ )
        ++ argsFor( printusage ).map( "-printusage" +: _ )
        ++ argsFor( whyareyoukeeping ).map( "-whyareyoukeeping" +: _ )
        ++ argsFor( dontoptimize ).map( "-dontoptimize" +: _ )
        ++ argsFor( optimizations ).map( "-optimizations" +: _ )
        ++ argsFor( optimizationpasses ).map( "-optimizationpasses" +: _ )
        ++ argsFor( assumenosideeffects ).map( "-assumenosideeffects" +: _ )
        ++ argsFor( allowaccessmodification ).map( "-allowaccessmodification" +: _ )
        ++ argsFor( mergeinterfacesaggressively ).map( "-mergeinterfacesaggressively" +: _ )
        ++ argsFor( dontobfuscate ).map( "-dontobfuscate" +: _ )
        ++ argsFor( printmapping ).map( "-printmapping" +: _ )
        ++ argsFor( applymapping ).map( "-applymapping" +: _ )
        ++ argsFor( obfuscationdictionary ).map( "-obfuscationdictionary" +: _ )
        ++ argsFor( classobfuscationdictionary ).map( "-classobfuscationdictionary" +: _ )
        ++ argsFor( packageobfuscationdictionary ).map( "-packageobfuscationdictionary" +: _ )
        ++ argsFor( overloadaggressively ).map( "-overloadaggressively" +: _ )
        ++ argsFor( useuniqueclassmembernames ).map( "-useuniqueclassmembernames" +: _ )
        ++ argsFor( dontusemixedcaseclassnames ).map( "-dontusemixedcaseclassnames" +: _ )
        ++ argsFor( keeppackagenames ).map( "-keeppackagenames" +: _ )
        ++ argsFor( flattenpackagehierarchy ).map( "-flattenpackagehierarchy" +: _ )
        ++ argsFor( repackageclasses ).map( "-repackageclasses" +: _ )
        ++ argsFor( keepattributes ).map( "-keepattributes" +: _ )
        ++ argsFor( keepparameternames ).map( "-keepparameternames" +: _ )
        ++ argsFor( renamesourcefileattribute ).map( "-renamesourcefileattribute" +: _ )
        ++ argsFor( adaptclassstrings ).map( "-adaptclassstrings" +: _ )
        ++ argsFor( adaptresourcefilenames ).map( "-adaptresourcefilenames" +: _ )
        ++ argsFor( adaptresourcefilecontents ).map( "-adaptresourcefilecontents" +: _ )
        ++ argsFor( dontpreverify ).map( "-dontpreverify" +: _ )
        ++ argsFor( microedition ).map( "-microedition" +: _ )
        ++ argsFor( verbose ).map( "-verbose" +: _ )
        ++ argsFor( dontnote ).map( "-dontnote" +: _ )
        ++ argsFor( dontwarn ).map( "-dontwarn" +: _ )
        ++ argsFor( ignorewarnings ).map( "-ignorewarnings" +: _ )
        ++ argsFor( printconfiguration ).map( "-printconfiguration" +: _ )
        ++ argsFor( dump ).map( "-dump" +: _ )
      /* AUTO GENERATED SECTION END: args */
    ).flatten.toSeq

    def apply: T = {
      outjars.foreach( _.map( _.toPath ).map( deleteIfExists ) )
      val c = main( args )
      if ( c != 0 ) throw new Exception
      T( outjars.toSeq.flatten )
    }
  }
}