带有混淆和优化的 Guava 的 ProGuard 配置

     2023-04-15     262

关键词:

【中文标题】带有混淆和优化的 Guava 的 ProGuard 配置【英文标题】:ProGuard configuration for Guava with obfuscation and optimization 【发布时间】:2012-02-25 13:55:32 【问题描述】:

为 Guava 寻找可以混淆和优化的 ProGuard 配置,因为网站上提供的默认配置没有。

我不仅不能让它导出我的 apk,我还不断得到:

Warning: com.google.common.collect.MinMaxPriorityQueue: 
    can't find referenced field 'int UNSET_EXPECTED_SIZE' in class  
    com.google.common.collect.MinMaxPriorityQueue$Builder
You should check if you need to specify additional program jars.

【问题讨论】:

我认为这更像是一个 Proguard 问题? 实际上更多的是番石榴问题。 Guava 中的某些东西导致该类发出警告。列出的答案应该可以解决问题。 啊。我更关注问题的第一部分:“一个会混淆和优化的配置。” 是的,两部分的问题很烦人,但在这种情况下,两部分都是关于proguard的。 【参考方案1】:

Guava 17.0 开始,这是我在 ProGuard 配置中所需要的:

-dontwarn javax.annotation.**
-dontwarn javax.inject.**
-dontwarn sun.misc.Unsafe

否则构建会失败并出现如下警告:

Warning: com.google.common.base.Absent: 
   can't find referenced class javax.annotation.Nullable

(那是因为 Guava 使用注解 that are not part of Android runtime (android.jar)。在这种情况下,只需将警告静音即可。)

如果您使用的是Gradle as the build tool,则上述proguard-project.txtbuild.gradle 中的以下内容在使用Guava 时会生成一个经过优化和混淆的APK。

buildTypes 
    release 
        minifyEnabled true
        proguardFile file('proguard-project.txt')
        proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
    


或者你可以在build.gradle依赖中include dependecy to jsr305.jar:

compile 'com.google.code.findbugs:jsr305:2.0.2'

...ProGuard 配置中只有-dontwarn sun.misc.Unsafe,但我更喜欢使用-dontwarn 也用于javax 的东西。

【讨论】:

顺便说一句,如果有人担心 Guava 依赖对 APK 大小 的影响,请不要担心。 Simple testing showed 在没有 ProGuard Guava 的情况下,APK 大小增加了大约 700KB,但在使用 ProGuard 的情况下,增加的幅度可以忽略不计。 我正在使用 Guava com.google.guava:guava:22.0-android,您的建议不适用于我的 proguard 配置。有什么想法吗?【参考方案2】:

从 23.4-android 升级到 23.5-android 时,我必须在我的 proguard 规则文件中添加以下行:

-dontwarn afu.org.checkerframework.**
-dontwarn org.checkerframework.**

下面列出了我从更新中看到的proguard警告(添加新规则之前)以供参考:

Warning: afu.org.checkerframework.checker.experimental.tainting_qual.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.experimental.tainting_qual.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.experimental.tainting_qual.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.experimental.tainting_qual.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.fenum.qual.FenumBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.fenum.qual.FenumBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.fenum.qual.FenumBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.formatter.qual.FormatBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.formatter.qual.FormatBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.formatter.qual.FormatBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.guieffect.qual.AlwaysSafe: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.guieffect.qual.AlwaysSafe: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.guieffect.qual.AlwaysSafe: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18n.qual.Localized: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18nformatter.qual.I18nFormatBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.i18nformatter.qual.I18nFormatBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.i18nformatter.qual.I18nFormatBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.initialization.qual.FBCBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.initialization.qual.FBCBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.initialization.qual.FBCBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.interning.qual.Interned: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.interning.qual.Interned: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror
Warning: afu.org.checkerframework.checker.interning.qual.Interned: can't find referenced class afu.com.sun.source.tree.LiteralTree
Warning: afu.org.checkerframework.checker.interning.qual.Interned: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.nullness.qual.KeyForBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.KeyForBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.nullness.qual.KeyForBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedNoType
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedNoType
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.Nullable: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.nullness.qual.Nullable: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.nullness.qual.Nullable: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.Mutable: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.Mutable: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.oigj.qual.Mutable: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.Mutable: can't find referenced class javax.lang.model.type.TypeKind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.oigj.qual.OIGJMutabilityBottom: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror$AnnotatedPrimitiveType
Warning: afu.org.checkerframework.checker.regex.classic.qual.RegexBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.regex.classic.qual.RegexBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.regex.classic.qual.RegexBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.signature.qual.SignatureBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.signature.qual.SignatureBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.signature.qual.SignatureBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.tainting.classic.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.tainting.classic.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.checker.tainting.classic.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.tainting.classic.qual.Untainted: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.checker.units.qual.UnitsRelations: can't find referenced class afu.org.checkerframework.checker.units.UnitsRelations
Warning: afu.org.checkerframework.common.aliasing.qual.MaybeAliased: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.aliasing.qual.MaybeAliased: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.common.aliasing.qual.MaybeAliased: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.reflection.qual.ClassValBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.reflection.qual.ClassValBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.common.reflection.qual.ClassValBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.reflection.qual.MethodValBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.reflection.qual.MethodValBottom: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.common.reflection.qual.MethodValBottom: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.value.qual.BottomVal: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.common.value.qual.BottomVal: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.common.value.qual.BottomVal: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class afu.com.sun.source.tree.Tree$Kind
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class afu.com.sun.source.tree.Tree
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class javax.lang.model.type.TypeKind
Warning: afu.org.checkerframework.framework.qual.ImplicitFor: can't find referenced class afu.org.checkerframework.framework.type.AnnotatedTypeMirror
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.interning.qual.Interned: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.lock.qual.GuardedBy: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.nullness.qual.NonNull: can't find referenced class javax.lang.model.type.TypeKind
Warning: org.checkerframework.checker.units.qual.UnitsRelations: can't find referenced class org.checkerframework.checker.units.UnitsRelations
Warning: org.checkerframework.framework.qual.ImplicitFor: can't find referenced class javax.lang.model.type.TypeKind

对于那些感兴趣的人,我目前对番石榴的完整规则集是:

# Guava (official)
## Not yet defined: follow https://github.com/google/guava/issues/2117
# Guava (unofficial)
## https://github.com/google/guava/issues/2926#issuecomment-325455128
## https://***.com/questions/9120338/proguard-configuration-for-guava-with-obfuscation-and-optimization
-dontwarn com.google.common.base.**
-dontwarn com.google.errorprone.annotations.**
-dontwarn com.google.j2objc.annotations.**
-dontwarn java.lang.ClassValue
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Added for guava 23.5-android
-dontwarn afu.org.checkerframework.**
-dontwarn org.checkerframework.**

【讨论】:

你是否也在 build.gradle 的依赖部分中包含了 jsr 库? 非常感谢你,你拯救了我的一天!它也适用于“guava:24.0-android”【参考方案3】:

其中一位构建 R8 的工程师 (Stephan Herhut) 在 this session from Google I/O 2018 中列出了最新 Guava (25.0-android) 的以下规则:

-dontwarn afu.org.checkerframework.**
-dontwarn org.checkerframework.**
-dontwarn com.google.errorprone.**
-dontwarn sun.misc.Unsafe
-dontwarn java.lang.ClassValue

视频还包含规则的简短说明(前 3 个是静态分析注释框架,后 2 个是 Android 上不可用的类,受 Guava 运行时检查保护)。

我在会议结束后与 Stephan 进行了交谈,他说这些内容有望在未来包含在 Guava 文档中,或者更好地包含在未来 Guava 版本的consumerProguardFiles 中。这是希望!

【讨论】:

从技术上讲,Stephan 的演讲使用了 Guava 24.1-android,但我使用 25.0-android 测试了这些规则并且它们奏效了。 感谢基础解释。几个月过去了,这仍然不在 guava 的文档中......【参考方案4】:

现在Guava 19.0 is released,我发现我必须添加这些规则。

-keep class com.google.j2objc.annotations.**  *; 
-dontwarn   com.google.j2objc.annotations.**
-keep class java.lang.ClassValue  *; 
-dontwarn   java.lang.ClassValue
-keep class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement  *; 
-dontwarn   org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

【讨论】:

我正在使用 Guava com.google.guava:guava:22.0-android,您的建议不适用于我的 proguard 配置。有什么想法吗?【参考方案5】:

对于 Guava 20.0,您还需要添加

# Guava 20.0
-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue
-dontwarn com.google.errorprone.annotations.concurrent.LazyInit
-dontwarn com.google.errorprone.annotations.ForOverride

【讨论】:

我正在使用 Guava com.google.guava:guava:22.0-android,您的建议不适用于我的 proguard 配置。有什么想法吗? @Eftekhari 确保您添加了所有规则,即不仅适用于 22.0,还适用于 20.0、19 等。如果这没有帮助:您可以打开一个新问题并粘贴您的错误构建【参考方案6】:

This message 建议以下解决方法:

-dontwarn com.google.common.collect.MinMaxPriorityQueue 

我认为可以更改 Proguard 以使其不再需要,但我们尚未与其所有者核实。

【讨论】:

【参考方案7】:

guava 20.0 的总保护规则。目前最新的guava 21不支持android。

-dontwarn com.google.common.base.**
-keep class com.google.common.base.** *;
-dontwarn com.google.errorprone.annotations.**
-keep class com.google.errorprone.annotations.** *;
-dontwarn   com.google.j2objc.annotations.**
-keep class com.google.j2objc.annotations.**  *; 
-dontwarn   java.lang.ClassValue
-keep class java.lang.ClassValue  *; 
-dontwarn   org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-keep class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement  *; 

【讨论】:

-keep are not needed. 缺少 -dontwarn javax.annotation.** -dontwarn javax.inject.** -dontwarn sun.misc.Unsafe【参考方案8】:

我只想与 build.gradle 中的以下内容分享我的应用现在实际工作的内容:

编译'com.google.guava:guava:23.5-android'

以下是在proguard-project.txt中处理Guava的。它本质上是TimTron的答案和develper_7的提示的结合:

-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-dontwarn com.google.common.util.concurrent.FuturesGetChecked**
-dontwarn javax.lang.model.element.Modifier
-dontwarn afu.org.checkerframework.**
-dontwarn org.checkerframework.**

【讨论】:

【参考方案9】:

guava 的 jar 文件由 java 编译器生成(与 javac 不同)在同一源文件的引用类的常量池中保留对私有内联常量的额外引用,这仅在 proguard 4.7 中失败,这似乎优化了私有常量定义,而不优化引用。未来的 guava jar 文件将不会有这样的常量池引用,但 proguard 4.7 中可能存在一个错误,它不会在标准 javac 生成的 jar 文件中体现出来。

【讨论】:

如果你告诉 ProGuard 忽略可疑的引用,它将优化掉常量定义和引用。在编译后的代码中,一个类引用了另一个类中的私有字段。据我了解,不允许这样的引用(没有访问器方法)(JVM 规范 2.17.3)。由于延迟解析,其他程序(如 JVM)可能恰好更宽容。我仍然很好奇是哪个编译器生成了这段代码。【参考方案10】:

这些 proguard 规则对我有用:guava 23.3-android

-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-dontwarn com.google.common.util.concurrent.FuturesGetChecked**
-dontwarn javax.lang.model.element.Modifier

【讨论】:

使用混淆proguard压缩代码和资源/减少方法数量

ProGuard介绍ProGuard是一个Java类文件压缩器,优化器,混淆器和预先文件验证器。压缩步骤检测和删除未使用的类,字段,方法和属性。优化步骤分析和优化方法的字节码。混淆步骤使用短无意义的名称重命名剩余的类,字段和方... 查看详情

androidstudio代码混淆添加

...》 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\\tools\\proguard目录中进行查看。    ProGuard是一个免费的Java类文件收缩,优化,混... 查看详情

带有 proguard 的 Kotlin AAR 库:如何只保留类和方法名?

】带有proguard的KotlinAAR库:如何只保留类和方法名?【英文标题】:KotlinAARlibraryw/proguard:HowtokeepONLYclassandmethodnames?【发布时间】:2020-04-2323:34:59【问题描述】:我正在使用Kotlin构建一个android库(aar文件)。我需要以第3方用户将... 查看详情

ProGuard 不会用依赖项混淆 JAR

】ProGuard不会用依赖项混淆JAR【英文标题】:ProGuarddoesn\'tobfuscateJARwithdependencies【发布时间】:2016-04-2215:40:36【问题描述】:我有一个带有下面给出的pom.xml文件的项目。当我发出命令mvncleancompileassembly:singleinstall时,我希望Maven生... 查看详情

关于proguard的一些踩坑总结

...代码混淆、资源压缩、移除无用资源。Android的SDK提供了ProGuard来实现这一过程。ProGuard会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其成为以变通方式解决64k引用限制的有... 查看详情

android之代码混淆(代码片段)

应用混淆(ProGuard)ProGuard是一个免费的JAVA类文件压缩,优化,混淆器。它探测并删除没有使用的类,字段,方法和属性,它删除没有用的说明并使用字节码得到最大优化,它使用无意义的名字重命... 查看详情

使用 ProGuard 混淆私有字段

】使用ProGuard混淆私有字段【英文标题】:ObfuscateprivatefieldsusingProGuard【发布时间】:2015-08-1202:51:30【问题描述】:我在带有Gradle1.2.3的AndroidStudio1.2.1.1中使用ProGuard。我的Gradle的发布版本配置如下:minifyEnabledtrueproguardFilesgetDefaultP... 查看详情

使用 ProGuard 时是不是可以混淆 GSON 注释中的字符串?

】使用ProGuard时是不是可以混淆GSON注释中的字符串?【英文标题】:IsitpossibletoobfuscateStringsinGSONAnnotationswhileusingProGuard?使用ProGuard时是否可以混淆GSON注释中的字符串?【发布时间】:2017-10-2422:48:39【问题描述】:我正在尝试使用... 查看详情

带有 JavaFX 和 JDOM2 的 ProGuard

】带有JavaFX和JDOM2的ProGuard【英文标题】:ProGuardwithJavaFXandJDOM2【发布时间】:2017-11-0501:35:56【问题描述】:我正在使用ProGuardGUI来混淆我的jar,但我遇到了一些麻烦。我的jar的特别之处在于我使用了javafx和jdom2库。到目前为止我... 查看详情

Proguard 可以保存到 multidex 应用程序吗?

】Proguard可以保存到multidex应用程序吗?【英文标题】:MayProguardsavegoingtomultidexapp?【发布时间】:2016-08-0221:26:43【问题描述】:我有一个带有几个库的应用程序,达到了65536个方法计数的红线。我实现了将应用设置为multidexAPK。为... 查看详情

Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?

】Proguard:如何避免缩小(和混淆)整个包以避免删除(和混淆)“未使用的方法”?【英文标题】:Proguard:Howtoavoidshrinking(andobfuscating)anentirepackagetoavoidremoving(andobfuscating)"unusedmethods"?【发布时间】:2016-07-2115:58:07【问题... 查看详情

proguard指南

...,这些坑中有一个和混淆选项有关,后来发现了Proguard其实是有一个官网的,里面介绍了各种情况。而我们平时开发可能就是单纯的从网上拷贝一个最佳实践的Proguard配置文件,而完全不在意各种配置项是什么意思... 查看详情

防止 Proguard 使用注释混淆子类

】防止Proguard使用注释混淆子类【英文标题】:PreventProguardobfuscatingchildclasseswithannotation【发布时间】:2014-08-0212:03:46【问题描述】:我有一些带有Gson注释的类,我需要避免通过ProGuard混淆。这段代码有效publicabstractclassFacebookIdenti... 查看详情

android混淆其实很简单

...淆工作。在AndroidStudio中配合Gradle很容易完成这个操作。Proguard作用压缩Shrinking:默认是开启的,移除未被使用的类和成员,并且在优化Optimization**工作执行后还会再次执行。优化Optimization:默认是开启的,在字节码级别... 查看详情

为类、成员和参数混淆 Proguard 自定义命名

】为类、成员和参数混淆Proguard自定义命名【英文标题】:Proguardcustomnamingforclasses,membersandparametersobfuscation【发布时间】:2012-04-2003:51:12【问题描述】:有没有简单的描述一下Proguard中字典文件的结构?我已阅读有关-?obfuscationdicti... 查看详情

在没有混淆的情况下使用 Proguard 和 Android

】在没有混淆的情况下使用Proguard和Android【英文标题】:UsingProguardwithAndroidwithoutobfuscation【发布时间】:2012-03-2722:41:33【问题描述】:我在使用-dontobfuscate标志时收到错误消息“转换为Dalvik格式失败,出现错误1”。否则我的应用... 查看详情

关于proguard的一些踩坑总结

...代码混淆、资源压缩、移除无用资源。Android的SDK提供了ProGuard来实现这一过程。ProGuard会检测和移除封装应用中未使用的类、字段、方法和属性,包括自带代码库中的未使用项(这使其成为以变通方式解决64k引用限制的有... 查看详情

proguard 混淆枚举类的字段值

】proguard混淆枚举类的字段值【英文标题】:proguardObfuscatefieldvaluesofenumclass【发布时间】:2021-06-0812:02:27【问题描述】:我想混淆枚举类(Coffee)的字段名和字段值。publicenumCoffeeDUTCH("dutchcoffee"),COLD_BREW("coldbrew");privateStringvalue;Coffee(S... 查看详情