1

更新到 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.**
4

1 回答 1

1

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

这个问题一直困扰着我,直到我在 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:
    • 对于 AGP 3.2.x:添加android.enableR8=true到您的 gradle.properties。
    • 对于 AGP 3.3.x:默认情况下启用 R8。注意:您可以使用任何 AGP >= 3.3.0-alpha01,但建议使用最新的(目前是 3.3.0-beta03)。

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

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

buildscript {
    configurations.all {
        resolutionStrategy {
            force 'net.sf.proguard:proguard-gradle:6.1.0beta1'
        }
    }
}
于 2018-10-12T06:57:55.827 回答