Android 使用 ProGuard 构建可无限期运行 AGP 3.2.0 或更高版本

Android build with ProGuard runs indefinitely with AGP 3.2.0 or later

更新到 Android Gradle 插件 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.**

2018 年 11 月 11 日:更新以包含真正的原因并修复

这个问题一直困扰着我,直到我在 Okio GitHub 页面上偶然发现 this issue

事实证明,在我的情况下,这个问题是由多种因素共同造成的:
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.x.x。
  2. 坚持使用 AGP 3.1.4 或更早版本。
  3. 在您的 ProGuard 配置中使用 -dontoptimize 标志禁用优化。
  4. 使用 R8 代替 ProGuard:
    • 对于 AGP 3.2.x:将 android.enableR8=true 添加到您的 gradle.properties。
    • 对于 AGP 3.3.x:R8默认开启。 注意:您可以使用任何 >= 3.3.0-alpha01 的 AGP,但建议使用最新版本(目前为 3.3.0-beta03)。

每个解决方案都有其缺点,但最适合生产的解决方案可能是 (1) 如果您不需要 v.2.1.0,则使用早期的 Okio 版本,或者(3) 如果您能负担得起更大的 APK,则禁用优化。

更新: 该问题已确认因 ProGuard 而发生,并已在其最新的测试版中得到修复。目前尚不清楚此版本何时会默认合并到 AGP 中,但您现在可以使用它,后果自负(因为它仍处于测试阶段):

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