当前位置: 首页 > 面试题库 >

如何使用proguard混淆除公共方法名称和属性以外的所有内容?

吴安和
2023-03-14
问题内容

我正在构建一个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
}

但是,即使内容被混淆,我的私有类名称和属性仍然具有相同的名称。我是否遗漏了通配符中的内容?


问题答案:

玩了一段时间后,我发现以下内容有效

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


 类似资料:
  • 我尝试在android studio中使用Proguard,但Proguard似乎没有混淆类名,例如,我的应用程序结构和配置: 和配置 但当我尝试在应用程序中触发异常时: ADB控制台中列出了异常: 只有方法被混淆了,MainActivity.class没有

  • 我尝试使用。 当我在没有的情况下运行应用程序时,应用程序运行成功。当我用运行我的应用程序时,我的应用程序崩溃。 我认为问题是:将我的类的属性重命名为简短的。 保留my one(静态)类的方法和属性的正确方法是什么?

  • 我使用的是——保留类和——保留类成员,但这些似乎只保留类中的方法名称和字段,我想告诉Proproaurd不要碰特定方法内部的任何东西,即使是“for”循环或“if”语句,甚至变量名称!,我想看到一个方法在反编译后看起来与原始版本完全相同,就像您在调试模式下反编译程序时一样!,但只有一种方法而不是所有其他方法。 有没有办法使用proGuard做到这一点? 谢谢:)

  • 问题内容: 我在AndroidStudio 1.2.1.1和Gradle 1.2.3中使用了ProGuard。 My Gradle的发布版本的配置如下: 我希望混淆类的私有字段。 到目前为止,这是我的proguard配置文件(经过多次尝试): 但是在从AndroidGuard 反编译后,我最终得到了: 我知道这种混淆的使用是有限的,但是我想由ProGuard重命名。怎么做? 这是refcard。

  • 我已经设法对Scala代码进行了模糊处理,但我不知道如何对由步骤构建的jar文件运行模糊处理。或者至少在步骤中如何构建fat jar。我发现proguard有一个参数,但我不知道如何将它应用于。谁能告诉我怎么才能做到这一点。 UPD,实际上,Proguard构建的JAR只包含模糊的类,而不包含Proguard忽略的类。

  • 问题内容: 我的班有子班。 我将从解析中获得对象的价值: 我尝试使用。 当我运行我的应用程序而没有运行成功时。当我的应用崩溃时运行我的应用时。 我认为问题是:将班级的属性重命名为short 。 我尝试保持方法和属性的名称不变,但是将其重命名: 保留第一个(静态)类的方法和属性的名称的正确方法是什么? 问题答案: 感谢Waqas! 我为我的情况找到了解决方案: 另外,我不在课堂上使用,上述配置无需序