library obfuscation using proguard












1















I'm trying to create an obfuscation library using a class from my project.
So far, I managed to create a library ('aar' file), which contain that class.
I checked it by deleting the class from the project and importing the library.



My next step is to obfuscate the library I created.



In the library's gradle I wrote:



buildTypes {
release {
minifyEnabled true
useProguard true
consumerProguardFiles 'proguard-rules.pro'
}
}


in addition, I used the example ProGuard rules file:



#
# This ProGuard configuration file illustrates how to process a program
# library, such that it remains usable as a library.
# Usage:
# java -jar proguard.jar @library.pro
#

# Specify the input jars, output jars, and library jars.
# In this case, the input jar is the program library that we want to process.

#-injars in.jar
#-outjars out.jar
#
#-libraryjars <java.home>/lib/rt.jar

# Save the obfuscation mapping to a file, so we can de-obfuscate any stack
# traces later on. Keep a fixed source file attribute and all line number
# tables to get line numbers in the stack traces.
# You can comment this out if you're not interested in stack traces.

-printmapping out.map
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod

# Preserve all annotations.

-keepattributes *Annotation*

# Preserve all public classes, and their public and protected fields and
# methods.

-keep public class * {
public protected *;
}

# Preserve all .class method names.

-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}

# Preserve all native method names and the names of their classes.

-keepclasseswithmembernames class * {
native <methods>;
}

# Preserve the special static methods that are required in all enumeration
# classes.

-keepclassmembers class * extends java.lang.Enum {
public static ** values();
public static ** valueOf(java.lang.String);
}

# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
# You can comment this out if your library doesn't use serialization.
# If your code contains serializable classes that have to be backward
# compatible, please refer to the manual.

-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

# Your library may contain more items that need to be preserved;
# typically classes that are dynamically created using Class.forName:

# -keep public class mypackage.MyClass
# -keep public interface mypackage.MyInterface
# -keep public class * implements mypackage.MyInterface


Now, when I import the library, the project can't find the required class from the library - "cannot resolve symbol 'classname'".



When I write 'false' in the minifyEnabled, the project does recognize the class from the library but the class is not obfuscated. probably because it turns the ProGuard feature off.



I'm stuck at this step, I need the library class to be obfuscated when de-compiled (change the variables name to something less readable). I don't know what am I doing wrong :/










share|improve this question





























    1















    I'm trying to create an obfuscation library using a class from my project.
    So far, I managed to create a library ('aar' file), which contain that class.
    I checked it by deleting the class from the project and importing the library.



    My next step is to obfuscate the library I created.



    In the library's gradle I wrote:



    buildTypes {
    release {
    minifyEnabled true
    useProguard true
    consumerProguardFiles 'proguard-rules.pro'
    }
    }


    in addition, I used the example ProGuard rules file:



    #
    # This ProGuard configuration file illustrates how to process a program
    # library, such that it remains usable as a library.
    # Usage:
    # java -jar proguard.jar @library.pro
    #

    # Specify the input jars, output jars, and library jars.
    # In this case, the input jar is the program library that we want to process.

    #-injars in.jar
    #-outjars out.jar
    #
    #-libraryjars <java.home>/lib/rt.jar

    # Save the obfuscation mapping to a file, so we can de-obfuscate any stack
    # traces later on. Keep a fixed source file attribute and all line number
    # tables to get line numbers in the stack traces.
    # You can comment this out if you're not interested in stack traces.

    -printmapping out.map
    -keepparameternames
    -renamesourcefileattribute SourceFile
    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod

    # Preserve all annotations.

    -keepattributes *Annotation*

    # Preserve all public classes, and their public and protected fields and
    # methods.

    -keep public class * {
    public protected *;
    }

    # Preserve all .class method names.

    -keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
    }

    # Preserve all native method names and the names of their classes.

    -keepclasseswithmembernames class * {
    native <methods>;
    }

    # Preserve the special static methods that are required in all enumeration
    # classes.

    -keepclassmembers class * extends java.lang.Enum {
    public static ** values();
    public static ** valueOf(java.lang.String);
    }

    # Explicitly preserve all serialization members. The Serializable interface
    # is only a marker interface, so it wouldn't save them.
    # You can comment this out if your library doesn't use serialization.
    # If your code contains serializable classes that have to be backward
    # compatible, please refer to the manual.

    -keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    static final java.io.ObjectStreamField serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
    }

    # Your library may contain more items that need to be preserved;
    # typically classes that are dynamically created using Class.forName:

    # -keep public class mypackage.MyClass
    # -keep public interface mypackage.MyInterface
    # -keep public class * implements mypackage.MyInterface


    Now, when I import the library, the project can't find the required class from the library - "cannot resolve symbol 'classname'".



    When I write 'false' in the minifyEnabled, the project does recognize the class from the library but the class is not obfuscated. probably because it turns the ProGuard feature off.



    I'm stuck at this step, I need the library class to be obfuscated when de-compiled (change the variables name to something less readable). I don't know what am I doing wrong :/










    share|improve this question



























      1












      1








      1








      I'm trying to create an obfuscation library using a class from my project.
      So far, I managed to create a library ('aar' file), which contain that class.
      I checked it by deleting the class from the project and importing the library.



      My next step is to obfuscate the library I created.



      In the library's gradle I wrote:



      buildTypes {
      release {
      minifyEnabled true
      useProguard true
      consumerProguardFiles 'proguard-rules.pro'
      }
      }


      in addition, I used the example ProGuard rules file:



      #
      # This ProGuard configuration file illustrates how to process a program
      # library, such that it remains usable as a library.
      # Usage:
      # java -jar proguard.jar @library.pro
      #

      # Specify the input jars, output jars, and library jars.
      # In this case, the input jar is the program library that we want to process.

      #-injars in.jar
      #-outjars out.jar
      #
      #-libraryjars <java.home>/lib/rt.jar

      # Save the obfuscation mapping to a file, so we can de-obfuscate any stack
      # traces later on. Keep a fixed source file attribute and all line number
      # tables to get line numbers in the stack traces.
      # You can comment this out if you're not interested in stack traces.

      -printmapping out.map
      -keepparameternames
      -renamesourcefileattribute SourceFile
      -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod

      # Preserve all annotations.

      -keepattributes *Annotation*

      # Preserve all public classes, and their public and protected fields and
      # methods.

      -keep public class * {
      public protected *;
      }

      # Preserve all .class method names.

      -keepclassmembernames class * {
      java.lang.Class class$(java.lang.String);
      java.lang.Class class$(java.lang.String, boolean);
      }

      # Preserve all native method names and the names of their classes.

      -keepclasseswithmembernames class * {
      native <methods>;
      }

      # Preserve the special static methods that are required in all enumeration
      # classes.

      -keepclassmembers class * extends java.lang.Enum {
      public static ** values();
      public static ** valueOf(java.lang.String);
      }

      # Explicitly preserve all serialization members. The Serializable interface
      # is only a marker interface, so it wouldn't save them.
      # You can comment this out if your library doesn't use serialization.
      # If your code contains serializable classes that have to be backward
      # compatible, please refer to the manual.

      -keepclassmembers class * implements java.io.Serializable {
      static final long serialVersionUID;
      static final java.io.ObjectStreamField serialPersistentFields;
      private void writeObject(java.io.ObjectOutputStream);
      private void readObject(java.io.ObjectInputStream);
      java.lang.Object writeReplace();
      java.lang.Object readResolve();
      }

      # Your library may contain more items that need to be preserved;
      # typically classes that are dynamically created using Class.forName:

      # -keep public class mypackage.MyClass
      # -keep public interface mypackage.MyInterface
      # -keep public class * implements mypackage.MyInterface


      Now, when I import the library, the project can't find the required class from the library - "cannot resolve symbol 'classname'".



      When I write 'false' in the minifyEnabled, the project does recognize the class from the library but the class is not obfuscated. probably because it turns the ProGuard feature off.



      I'm stuck at this step, I need the library class to be obfuscated when de-compiled (change the variables name to something less readable). I don't know what am I doing wrong :/










      share|improve this question
















      I'm trying to create an obfuscation library using a class from my project.
      So far, I managed to create a library ('aar' file), which contain that class.
      I checked it by deleting the class from the project and importing the library.



      My next step is to obfuscate the library I created.



      In the library's gradle I wrote:



      buildTypes {
      release {
      minifyEnabled true
      useProguard true
      consumerProguardFiles 'proguard-rules.pro'
      }
      }


      in addition, I used the example ProGuard rules file:



      #
      # This ProGuard configuration file illustrates how to process a program
      # library, such that it remains usable as a library.
      # Usage:
      # java -jar proguard.jar @library.pro
      #

      # Specify the input jars, output jars, and library jars.
      # In this case, the input jar is the program library that we want to process.

      #-injars in.jar
      #-outjars out.jar
      #
      #-libraryjars <java.home>/lib/rt.jar

      # Save the obfuscation mapping to a file, so we can de-obfuscate any stack
      # traces later on. Keep a fixed source file attribute and all line number
      # tables to get line numbers in the stack traces.
      # You can comment this out if you're not interested in stack traces.

      -printmapping out.map
      -keepparameternames
      -renamesourcefileattribute SourceFile
      -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod

      # Preserve all annotations.

      -keepattributes *Annotation*

      # Preserve all public classes, and their public and protected fields and
      # methods.

      -keep public class * {
      public protected *;
      }

      # Preserve all .class method names.

      -keepclassmembernames class * {
      java.lang.Class class$(java.lang.String);
      java.lang.Class class$(java.lang.String, boolean);
      }

      # Preserve all native method names and the names of their classes.

      -keepclasseswithmembernames class * {
      native <methods>;
      }

      # Preserve the special static methods that are required in all enumeration
      # classes.

      -keepclassmembers class * extends java.lang.Enum {
      public static ** values();
      public static ** valueOf(java.lang.String);
      }

      # Explicitly preserve all serialization members. The Serializable interface
      # is only a marker interface, so it wouldn't save them.
      # You can comment this out if your library doesn't use serialization.
      # If your code contains serializable classes that have to be backward
      # compatible, please refer to the manual.

      -keepclassmembers class * implements java.io.Serializable {
      static final long serialVersionUID;
      static final java.io.ObjectStreamField serialPersistentFields;
      private void writeObject(java.io.ObjectOutputStream);
      private void readObject(java.io.ObjectInputStream);
      java.lang.Object writeReplace();
      java.lang.Object readResolve();
      }

      # Your library may contain more items that need to be preserved;
      # typically classes that are dynamically created using Class.forName:

      # -keep public class mypackage.MyClass
      # -keep public interface mypackage.MyInterface
      # -keep public class * implements mypackage.MyInterface


      Now, when I import the library, the project can't find the required class from the library - "cannot resolve symbol 'classname'".



      When I write 'false' in the minifyEnabled, the project does recognize the class from the library but the class is not obfuscated. probably because it turns the ProGuard feature off.



      I'm stuck at this step, I need the library class to be obfuscated when de-compiled (change the variables name to something less readable). I don't know what am I doing wrong :/







      android proguard obfuscation android-library aar






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 1 at 18:01









      Fantômas

      32.8k156390




      32.8k156390










      asked Jan 1 at 17:04









      ItayItay

      7311




      7311
























          0






          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997335%2flibrary-obfuscation-using-proguard%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997335%2flibrary-obfuscation-using-proguard%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          MongoDB - Not Authorized To Execute Command

          How to fix TextFormField cause rebuild widget in Flutter

          in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith