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 :/

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Geeky bean
  • 475
  • 6
  • 21

0 Answers0