使用ProGuard的Android版本可在AGP 3.2.0或更高版本中无限期运行

时间:2018-10-12 06:57:56

标签: android android-gradle proguard

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

1 个答案:

答案 0 :(得分:1)

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。 注意:您可以使用任何AGP> = 3.3.0-alpha01,但建议使用最新版本(目前为3.3.0-beta03)。

每种解决方案都有其缺点,但是如果您不需要特别是v.2.1.0或( 3),则使用较早的Okio版本对生产最友好的可能是( 1 ),如果您有能力拥有更大的APK,请禁用优化功能。

更新: 该问题已确认是由于ProGuard导致的,并且已在其最新的Beta版本中修复。目前尚不清楚该版本默认情况下何时会合并到AGP中,但是您现在就可以自担风险使用它(因为它仍处于beta状态):

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