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

使用ProGuard混淆私有字段

凤明朗
2023-03-14
问题内容

我在AndroidStudio 1.2.1.1和Gradle 1.2.3中使用了ProGuard。

My Gradle的发布版本的配置如下:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true

我希望混淆类的私有字段。

到目前为止,这是我的proguard配置文件(经过多次尝试):

-allowaccessmodification
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-verbose
[...]

但是在androdd从AndroidGuard 反编译后,我最终得到了:

private com.google.android.gms.common.api.GoogleApiClient googleApiClient;

我知道这种混淆的使用是有限的,但是我想googleApiClient由ProGuard重命名。怎么做?

这是refcard。

有什么办法可以做相反的事情-keepclassmembernames吗?


问题答案:

从此获得:
如何告诉ProGuard保留私有字段而不指定每个字段

根据ProGuard文档,通配符匹配任何字段。

最重要的是,您可以使用取反符(!)。(http://proguard.sourceforge.net/#manual/usage.html

属性名称可以包含?,*通配符,并且可以在其前面加上!!否定者。

我在该领域的经验不是很丰富,所以这只是一个猜测,但是更容易在新注释中撰写。像这样的事情应该做的工作(未测试):

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    <methods>;
    <init>; //and keep every field, method, constructor apart from private fields
}

也许您可以像这样使用,但不确定首先如何使用否定器:

-keepclassmembers class * { //should find all classes 
    !private <fields>;    
    *; //should exclude everything except private fields, which should be obfuscated.
}


 类似资料:
  • 我对混淆有问题。为了获得更好的想象力: JAVA代码 本机代码 在我想发布一个混淆版本之前,一切都很好。这个类中的Java类(例如)和方法的名称被proGuard重命名为“a”和“a()”(这可能并不总是相同的),但在本机代码中,方法和类的原始名称保持不变,因为它被硬编码为字符串,如下所示: ...有没有办法动态设置方法名?

  • 我正在努力解决JavaFX应用程序的模糊问题。以本项目为基础: Proguard配置文件:-dontoptimized-dontshrink 有人有JavaFX模糊处理的经验吗?

  • 问题内容: 是否可以仅将ProGuard用于混淆。我不希望ProGuard从我的项目中删除任何类。我打算使用ProGuard只是为了混淆,以防止进行反向工程。 问题答案: 是的,通过指定 您可以在ProGuard手册中找到有关所有配置选项的详细信息。 请注意,缩小和优化可能有助于防止反向工程。

  • 现在,在这个包中还有许多包私有类,这些类不应该被该规则选择。这些类中的一些实际上被混淆了,无论是在它们自己的名称还是它们的成员名称中,这很好。 相反,有一些实现公共接口的类,它们的类名不会被混淆,而我希望它们应该被混淆。为了完整起见,当它们的成员名不是接口的一部分时,它们的成员名会被有效地混淆。 示例: 我想强调的是,是在其他(保留)类中创建的,并且只通过返回给客户端代码。 如果可能的话,我如何也

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

  • 问题内容: 但是,最终还是推荐了yGuard和另一个ProGuard,但都没有提到两者。我想知道我们是否可以对每个人进行比较,并从围栏的两侧听到人们的经历。查看ProGuard网站上的比较表,它与ProGuard明显成角度。但是,每种产品的实际经验如何- 哪一种产品的产量较小?哪一个更难以反编译?每个版本支持哪些Java版本? 我个人从J2ME的角度特别感兴趣,但是请不要将讨论仅限于此。 问题答案