Сборка Android с ProGuard работает неопределенно долго с AGP 3.2.0 или более поздней версии - PullRequest
0 голосов
/ 12 октября 2018

После обновления до Android Gradle Plugin 3.2.0 или 3.3.0-alpha13 мои сборки, в которых включен ProGuard, продолжают работать бесконечно.
Если я возвращаюсь к AGP 3.1.4 или более ранней версии, сборка завершается как следует.
Если я отключаю оптимизацию с флагом -dontoptimize, сборка также завершается успешно.

Тип сборки настраивается следующим образом:

release {
  minifyEnabled true
  useProguard true
  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

proguard-rules.pro:

-optimizations !code/allocation/variable,!method/removal/parameter
-repackageclasses ''

-dontwarn javax.annotation.**
-dontwarn okio.**
-keepattributes Exceptions

# Crashlytics
-keepattributes SourceFile, LineNumberTable
-keepclassmembers public class * extends java.lang.Exception
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**

1 Ответ

0 голосов
/ 12 октября 2018

11/11/2018: Обновлено с учетом реальной причины и исправления

Эта проблема не давала мне покоя, пока я случайно не наткнулся на эту проблему на странице Okio GitHub.

Оказывается, что в моем случае эта проблема была вызвана комбинацией вещей:
Okio 2.1.0 + AGP >= 3.2.0 + ProGuard (<6.1.0-beta1) with optimizations = Infinite execution of optimization step (build never finishes)

Если вы должны были принятьиз любой части этого уравнения все будет работать нормально.

Возможные решения в деталях:

  1. Используйте Okio 2.0.0 или 1.xx
  2. Придерживайтесь AGP 3.1.4 или более ранней версии.
  3. Отключите оптимизацию с флагом -dontoptimize в конфигурации ProGuard.
  4. Используйте R8 вместо ProGuard:
    • Для AGP3.2.x: добавьте android.enableR8=true к вашим gradle.properties.
    • Для AGP 3.3.x: R8 включен по умолчанию. Примечание: Вы можете использовать любой AGP> = 3.3.0-alpha01, но рекомендуется самое последнее (на данный момент это 3.3.0-beta03).

У каждого решения есть свои недостатки, но наиболее удобными для производства являются ( 1 ), использующие более ранние версии Okio, если вам специально не нужен v.2.1.0, или ( 3 ) отключение оптимизаций, если вы можете позволить себе иметь немного больший APK.

ОБНОВЛЕНИЕ: Проблема подтверждена из-за ProGuard и исправлена ​​в последней бета-версии.Не ясно, когда эта версия будет включена в AGP по умолчанию, но вы можете использовать ее прямо сейчас на свой страх и риск (учитывая, что она все еще находится в бета-версии):

buildscript {
    configurations.all {
        resolutionStrategy {
            force 'net.sf.proguard:proguard-gradle:6.1.0beta1'
        }
    }
}
...