【问题标题】:How to obfuscate everything but public method names and attributes with proguard?如何使用 proguard 混淆除公共方法名称和属性之外的所有内容?
【发布时间】:2015-11-27 13:58:03
【问题描述】:

我正在构建一个 android 框架,我需要对 jar 进行混淆和缩小以将其发送给用户。

我正在使用 android SDK 中包含的 proguard 工具,我对输出 jar 有以下要求:

  • 保留输入 jar 中包含的所有类,但对其进行混淆处理。
  • 不要混淆`AndroidManifest.xml中调用的类的类名
  • 不要混淆类名和公共方法名/属性,因为所使用的类具有用户接口,但要针对其内容进行混淆。

为此,我使用以下配置:

-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 选项吗?我认为这是使您的混淆不正确的原因。

标签: java android proguard


【解决方案1】:

玩了一会儿,我发现以下工作正常

-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 选项的末尾。

我使用了以下类:

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;
  }
}

反编译后的类是这样的:

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;
  }
}

【讨论】:

  • 谢谢你修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多