Конфигурация ProGuard для Guava с запутыванием и оптимизацией

Ищете конфигурацию ProGuard для Guava, которая будет запутываться и оптимизироваться, поскольку по умолчанию она предоставляется на веб-сайте.

Мало того, что я не могу получить его для экспорта моего 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. 

Solutions Collecting From Web of "Конфигурация ProGuard для Guava с запутыванием и оптимизацией"

Начиная с 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 использует аннотации , которые не являются частью среды выполнения Android (android.jar). В этом случае прекрасно отключить предупреждения.)

Если вы используете Gradle в качестве инструмента сборки , вышеуказанный proguard-project.txt и следующий в build.gradle создает оптимизированный и запутанный APK при использовании Guava.

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

В качестве альтернативы вы можете включить dependecy в jsr305.jar в зависимостях build.gradle :

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

… с только -dontwarn sun.misc.Unsafe в конфигурации ProGuard, но я предпочел использовать -dontwarn также для javax .

Теперь, когда Guava 19.0 выпущен , я обнаружил, что должен был добавить эти правила.

 -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 20.0 вам также нужно добавить:

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

Это сообщение предлагает следующее обходное решение:

 -dontwarn com.google.common.collect.MinMaxPriorityQueue 

Мне хотелось бы думать, что Proguard можно было бы изменить, чтобы сделать это ненужным, но мы не проверили его владельцев.

Файлы jar guava создавались компилятором java, который (в отличие от javac) содержал дополнительные ссылки на частные встроенные константы в постоянном пуле ссылок на классы в том же исходном файле, который терпит неудачу только с помощью proguard 4.7, который, как представляется, оптимизирует определения частных констант , Не оптимизируя ссылки. Будущие файлы java guar не будут иметь таких постоянных ссылок на пул, но, вероятно, есть ошибка в proguard 4.7, которая не отображается с файлами jar, создаваемыми стандартным javac.

Общее правило proguard для 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 { *; }