该应用程序在正常情况下运行良好,但当我尝试实现 minify 和 R8 时。这会引发以下错误。
* What went wrong:
Execution failed for task ':app:uploadCrashlyticsMappingFileAlpha'.
> Failed to calculate the value of task ':app:uploadCrashlyticsMappingFileAlpha' property 'googleServicesResourceRoot'.
> Could not get unknown property 'intermediateDir' for task ':app:processAlphaGoogleServices' of type com.google.gms.googleservices.GoogleServicesTask.
Run Code Online (Sandbox Code Playgroud)
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:uploadCrashlyticsMappingFileAlpha'.
//..... More Error Line
Run Code Online (Sandbox Code Playgroud)
我收到上述错误,并且完全不知道发生了什么。
buildTypes {
getByName("debug") {
applicationIdSuffix = ".sandbox"
debuggable true
}
alpha {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
versionNameSuffix ".alpha"
}
}
Run Code Online (Sandbox Code Playgroud)
这是我使用的上面的代码,我正在尝试构建 Alpha,但是当我调试时工作正常。
我在尝试编译应用程序的发布版本时遇到了 Githubs 操作运行程序的问题。我的应用程序有 8 种不同的风格,我们在 Play 商店上构建和提供,几个月前,我能够使用 Github Actions 在一个跑步者上同时构建多达 3 种风格。如果我们尝试一次执行超过 3 种风格,大约 15 分钟后,构建将失败并显示
FAILURE: Build failed with an exception.
* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
Gradle 日志除了指出当时正在运行哪个任务之外,并没有真正的帮助(minify r8)
当我继承这个代码库时,我发现我们将 jvm 参数中的最大堆大小设置为 6 GB,如果我完全降低该值,则在 r8 运行时最终会出现内存不足错误。对我来说,r8 会占用这么多内存,这似乎有点疯狂,而且最重要的是,github 托管的运行程序只有 7 GB 的 RAM 可供使用。因此,如果我们将 r8 在 gradle 守护进程中使用的内容结合起来,并且知道 kotlin 守护进程也在运行,我认为运行程序正在终止 gradle 守护进程的内存使用,或者它因内存不足而死亡。
自从我们添加 Jetpack Compose 库以来,我们现在无法一次构建超过一种风格的应用程序,而且我担心由于 r8 造成的内存占用而失去在 github 运行器上构建的能力。
这就是我当前的 gradle.properties 的样子:
org.gradle.jvmargs=-Xms1024m -Xmx6144m -XX:-UseGCOverheadLimit -XX:+HeapDumpOnOutOfMemoryError …
android gradle android-gradle-plugin android-r8 android-jetpack-compose
我正在使用最新的稳定版Android Studio-3.4。当我构建一个调试apk(不带proguard)时,它工作正常。但是问题出在发布版本时。默认情况下,它使用最新的R8收缩器。
它给了我一个内存不足的错误。我尝试更改gradle.properties文件中的值,如下所示,这在执行transformClassesAndResourcesWithR8ForRelease任务时发生。
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Run Code Online (Sandbox Code Playgroud)
它仍然给我同样的错误。
最后,我尝试通过在gradle.properties文件中使用此行来禁用R8,
android.enableR8=false
Run Code Online (Sandbox Code Playgroud)
但是仍然在构建任务中,我可以看到它正在执行此任务transformClassesAndResourcesWithR8ForRelease并给我同样的错误。
这些是错误日志
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':appName:transformClassesAndResourcesWithR8ForRelease'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193) …Run Code Online (Sandbox Code Playgroud) 我启用了 R8 插件以进行混淆
当我尝试生成签名的 apk 时出现异常
"Library class android.content.res.XmlResourceParser implements program class org.xmlpull.v1.XmlPullParser"
Run Code Online (Sandbox Code Playgroud)
我已将以下 proGuard 规则添加到 proguard-rules.pro 文件中
-dontwarn org.xmlpull.v1.**
-dontnote org.xmlpull.v1.**
-keep class org.xmlpull.** { *; }
-keepclassmembers class org.xmlpull.** { *; }
Run Code Online (Sandbox Code Playgroud)
和我的发布构建规范
buildTypes {
release {
useProguard false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
Run Code Online (Sandbox Code Playgroud)
帮助解决这个问题
proguard kotlin android-studio android-gradle-plugin android-r8
我一直在尝试使用 Android 的 Baseline Profile 和 MacroBenchmark 库来提高应用程序性能。
我的问题是,建议MacroBenchmark 的构建类型尽可能接近构建release,但符合-dontobfuscateproguard 规则。
如果生产应用程序将通过obfuscated,minification那么 Baseline Profiler 如何帮助提高应用程序性能,因为baseline-prof.txt应用程序classes.dex文件中的类可能完全不同。
Profiler 和 Proguard/R8 之间是否存在某种内部映射?
使用 r8 时收到这些警告
Missing class org.bouncycastle.jsse.BCSSLParameters (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 1 other context)
Missing class org.bouncycastle.jsse.BCSSLSocket (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List) and 5 other contexts)
Missing class org.bouncycastle.jsse.provider.BouncyCastleJsseProvider (referenced from: void okhttp3.internal.platform.BouncyCastlePlatform.<init>())
Missing class org.conscrypt.Conscrypt$Version (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int))
Missing class org.conscrypt.Conscrypt (referenced from: boolean okhttp3.internal.platform.ConscryptPlatform$Companion.atLeastVersion(int, int, int) and 4 other contexts)
Missing class org.conscrypt.ConscryptHostnameVerifier (referenced from: okhttp3.internal.platform.ConscryptPlatform$DisabledHostnameVerifier)
Missing class org.openjsse.javax.net.ssl.SSLParameters (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, java.lang.String, java.util.List))
Missing class org.openjsse.javax.net.ssl.SSLSocket (referenced from: void okhttp3.internal.platform.OpenJSSEPlatform.configureTlsExtensions(javax.net.ssl.SSLSocket, …Run Code Online (Sandbox Code Playgroud) 首先,请注意,我不期待why do you want to obfuscate library评论。这是我要问的真正问题。
我在使用 Kotlin 编写的 Android 库处理 R8/混淆时遇到了问题。
我有一个带有注释的公共 API 方法,@JvmStatic该方法将 aLambda作为参数。
例如,看看下面的代码,
typealias MyLambdaCallback = (String, Map<String, Any>) -> Unit
@Keep
object MyApi {
private var callback: MyLambdaCallback? = null
@JvmStatic
fun setCallback(callback: MyLambdaCallback) {
this.callback = callback
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了@Jvmstatic以便Java调用代码可以静态调用该方法而不是执行MyApi.INSTANCE.setCallback()
当我松开图书馆没有minification,一切都很好,并调用代码来自Java和Kotlin预期被写入。
但是现在我想在打开时释放库minification。
这就产生了一个问题。
这是错误
java.lang.IncompatibleClassChangeError: 方法 'void setCallback(kotlin.jvm.functions.Function2)' 预期为虚拟类型,但被发现为静态类型(出现 'com.demo.basic.Application' 声明在/data/app/com.demo.basic-_0uJXPbtfs3UZ2Rp2h-RdQ==/base.apk!classes2.dex)
我是在某处犯了错误还是预期这是某种限制?
我尝试了什么?
删除 …
我正在将一个 Android 应用程序从使用 Proguard 的 desugaring 切换到 Android Gradle Build Plugin 4.0.0 中可用的新 R8 desugaring。
我已按照官方文档中详述的步骤启用 Java 8 库脱糖:
projectJavaVersion = 1.8
android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
buildToolsVersion '29.0.2'
compileSdkVersion 29
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility projectJavaVersion
targetCompatibility projectJavaVersion
}
kotlinOptions {
jvmTarget = projectJavaVersion
}
defaultConfig {
multiDexEnabled true
minSdkVersion 19
targetSdkVersion 23
applicationId = 'com.example.app'
}
buildTypes {
release {
...
minifyEnabled true
}
debug {
debuggable true …Run Code Online (Sandbox Code Playgroud) android java-8 android-gradle-plugin android-r8 jdk-desugaring
我有这个代码:
val profile: UserProfile = userApi.profile()
@GET("users/profile")
suspend fun profile(): UserProfile
Run Code Online (Sandbox Code Playgroud)
当我运行 userApi.profile() 时,我收到此错误:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Run Code Online (Sandbox Code Playgroud)
详细信息:我更新了 gradle、一些库、kotlin 版本和 android studio。该代码在更新之前曾经有效。后端方面没有任何变化。
更新:看起来所有 api 调用都会发生这种情况,而不仅仅是这个。
retrofitVersion = 2.9.0
kotlinVersion = 1.8.10
gradle = 8.0
Run Code Online (Sandbox Code Playgroud) android classcastexception android-gradle-plugin retrofit2 android-r8
随着android studio推出了两款新工具D8和R8.根据谷歌文档D8是一个dex工具,R8是一个progourd工具,但由于他们的解释两者都做了几乎相同的事情如下:
D8是一个将java字节代码转换为dex代码的dexer.
R8是一个java程序缩小和缩小工具,它将java字节代码转换为优化的dex代码.
它似乎都将java字节代码逐字转换为dex代码.那么,实际上他们在转换dex代码时是在内部做什么的?
android-r8 ×10
android ×8
kotlin ×3
proguard ×3
gradle ×2
android-d8 ×1
androidx ×1
crashlytics ×1
dex ×1
firebase ×1
java-8 ×1
obfuscation ×1
retrofit2 ×1