针对番石榴的ProGuard配置,具有混淆和优化功能

时间:2012-02-02 21:33:22

标签: java android guava proguard

寻找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.

9 个答案:

答案 0 :(得分:43)

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.txt以及build.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内容。

答案 1 :(得分:19)

建造R8的工程师之一(Stephan Herhut)在this session from Google I/O 2018中列出了最新番石榴(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文档中,或者更好地在未来的番石榴版consumerProguardFiles中发布。这是希望!

答案 2 :(得分:18)

现在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

答案 3 :(得分:11)

对于Guava 20.0,您需要添加

IF new.daily_rate >= 15 THEN 
    INSERT INTO valuable_items (catalogue_id,
    description,
    designer,
    type,
    daily_rate)
    VALUES 
    (new.catalogue_id,
    new.description,
    new.designer,
    new.type,
    new.daily_rate);
END IF;

答案 4 :(得分:7)

This message建议采用以下解决方法:

-dontwarn com.google.common.collect.MinMaxPriorityQueue 

我想认为可以修改Proguard以使其不必要,但我们还没有与其所有者核实过。

答案 5 :(得分:4)

番石榴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 { *; }

答案 6 :(得分:4)

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

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

以下是在proguard-project.txt中处理番石榴。它基本上是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.**

答案 7 :(得分:3)

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

答案 8 :(得分:3)

这些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