如何使用混淆器混淆 public 方法名称和属性以外的所有内容?
How to obfuscate everything but public method names and attributes with proguard?
我正在构建一个 android 框架,我需要混淆和压缩 jar 以将其发送给用户。
我正在使用 android SDK 中包含的混淆器工具,我对输出 jar 有以下要求:
- 保留输入 jar 中包含的所有 classes,但混淆它们。
- 不要混淆 `AndroidManifest.xml
中调用的 class 的 class 名称
- 不要混淆 class 名称和 public 方法 names/attributes 因为所使用的 class 具有供用户使用的界面,但是请为他们的用户使用内容。
为此,我使用以下配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-keep, allowobfuscation class com.company.*
-keepclassmembers, allowobfuscation class * {
*;
}
-keepnames class com.company.MyClass { *; }
-keepclassmembernames class com.company.MyClass {
public <methods>;
public <fields>;
#!private *; also tried this but it didn't work
}
然而,我的私有 classes 名称和属性仍然具有相同的名称,即使内容已被混淆。我是否遗漏了通配符中的某些内容?
玩了一下,我发现下面的东西可以用
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-keep, allowobfuscation class com.company.*
-keepclassmembers, allowobfuscation class * {
*;
}
-keepnames class com.company.MyClass
-keepclassmembernames class com.company.MyClass {
public <methods>;
public <fields>;
#!private *; also tried this but it didn't work
}
您配置中的错误是 -keepnames
选项末尾存在 { *; }
。
我使用了以下 class:
package com.company;
public class MyClass {
public static void main(String[] args) {
int longVariableName = publicStaticMethod();
String abcxyz = privateStaticMethod("abc", "xyz");
System.out.println("longVariableName: " + longVariableName);
System.out.println("abcxyz: " + abcxyz);
}
public static int publicStaticMethod() {
return 9000;
}
private static String privateStaticMethod(String first, String second) {
return first + second;
}
}
反编译结果 class 是这样的:
package com.company;
import java.io.PrintStream;
public class MyClass {
public static void main(String[] paramArrayOfString) {
paramArrayOfString = publicStaticMethod();
String str = a("abc", "xyz");
System.out.println("longVariableName: " + paramArrayOfString);
System.out.println("abcxyz: " + str);
}
public static int publicStaticMethod() {
return 9000;
}
private static String a(String paramString1, String paramString2) {
return paramString1 + paramString2;
}
}
我正在构建一个 android 框架,我需要混淆和压缩 jar 以将其发送给用户。
我正在使用 android SDK 中包含的混淆器工具,我对输出 jar 有以下要求:
- 保留输入 jar 中包含的所有 classes,但混淆它们。
- 不要混淆 `AndroidManifest.xml 中调用的 class 的 class 名称
- 不要混淆 class 名称和 public 方法 names/attributes 因为所使用的 class 具有供用户使用的界面,但是请为他们的用户使用内容。
为此,我使用以下配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-keep, allowobfuscation class com.company.*
-keepclassmembers, allowobfuscation class * {
*;
}
-keepnames class com.company.MyClass { *; }
-keepclassmembernames class com.company.MyClass {
public <methods>;
public <fields>;
#!private *; also tried this but it didn't work
}
然而,我的私有 classes 名称和属性仍然具有相同的名称,即使内容已被混淆。我是否遗漏了通配符中的某些内容?
玩了一下,我发现下面的东西可以用
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-keep, allowobfuscation class com.company.*
-keepclassmembers, allowobfuscation class * {
*;
}
-keepnames class com.company.MyClass
-keepclassmembernames class com.company.MyClass {
public <methods>;
public <fields>;
#!private *; also tried this but it didn't work
}
您配置中的错误是 -keepnames
选项末尾存在 { *; }
。
我使用了以下 class:
package com.company;
public class MyClass {
public static void main(String[] args) {
int longVariableName = publicStaticMethod();
String abcxyz = privateStaticMethod("abc", "xyz");
System.out.println("longVariableName: " + longVariableName);
System.out.println("abcxyz: " + abcxyz);
}
public static int publicStaticMethod() {
return 9000;
}
private static String privateStaticMethod(String first, String second) {
return first + second;
}
}
反编译结果 class 是这样的:
package com.company;
import java.io.PrintStream;
public class MyClass {
public static void main(String[] paramArrayOfString) {
paramArrayOfString = publicStaticMethod();
String str = a("abc", "xyz");
System.out.println("longVariableName: " + paramArrayOfString);
System.out.println("abcxyz: " + str);
}
public static int publicStaticMethod() {
return 9000;
}
private static String a(String paramString1, String paramString2) {
return paramString1 + paramString2;
}
}