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)
如果你从这个等式中去掉任何部分,一切都会正常。
可能的解决方案详细信息:
- 使用 Okio 2.0.0 或 1.x.x。
- 坚持使用 AGP 3.1.4 或更早版本。
- 在您的 ProGuard 配置中使用
-dontoptimize
标志禁用优化。
- 使用 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'
}
}
}
更新到 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)
如果你从这个等式中去掉任何部分,一切都会正常。
可能的解决方案详细信息:
- 使用 Okio 2.0.0 或 1.x.x。
- 坚持使用 AGP 3.1.4 或更早版本。
- 在您的 ProGuard 配置中使用
-dontoptimize
标志禁用优化。 - 使用 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)。
- 对于 AGP 3.2.x:将
每个解决方案都有其缺点,但最适合生产的解决方案可能是 (1) 如果您不需要 v.2.1.0,则使用早期的 Okio 版本,或者(3) 如果您能负担得起更大的 APK,则禁用优化。
更新: 该问题已确认因 ProGuard 而发生,并已在其最新的测试版中得到修复。目前尚不清楚此版本何时会默认合并到 AGP 中,但您现在可以使用它,后果自负(因为它仍处于测试阶段):
buildscript {
configurations.all {
resolutionStrategy {
force 'net.sf.proguard:proguard-gradle:6.1.0beta1'
}
}
}