标签: android-r8

Firebase Crashlytics Minify R8 Android

该应用程序在正常情况下运行良好,但当我尝试实现 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,但是当我调试时工作正常。

android gradle firebase crashlytics android-r8

20
推荐指数
1
解决办法
1267
查看次数

R8 导致 Gradle Daemon 在 Github Hosted Action Runner 上消失

我在尝试编译应用程序的发布版本时遇到了 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

15
推荐指数
1
解决办法
1159
查看次数

使用代码收缩器R8与Android Studio 3.4一起构建时出现OutofMemory问题

我正在使用最新的稳定版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)

android android-gradle-plugin android-r8

13
推荐指数
1
解决办法
440
查看次数

在android kotlin应用程序中启用R8导致库类android.content.res.XmlResourceParser实现程序类org.xmlpull.v1.XmlPullParser

我启用了 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

13
推荐指数
2
解决办法
3004
查看次数

基线配置文件 x R8/Proguard

我一直在尝试使用 Android 的 Baseline Profile 和 MacroBenchmark 库来提高应用程序性能。

我的问题是,建议MacroBenchmark 的构建类型尽可能接近构建release,但符合-dontobfuscateproguard 规则。
如果生产应用程序将通过obfuscatedminification那么 Baseline Profiler 如何帮助提高应用程序性能,因为baseline-prof.txt应用程序classes.dex文件中的类可能完全不同。

Profiler 和 Proguard/R8 之间是否存在某种内部映射?

android proguard android-r8 androidx baseline-profile

12
推荐指数
1
解决办法
1228
查看次数

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)

android proguard kotlin android-r8

12
推荐指数
3
解决办法
1万
查看次数

在 Kotlin 编写的 Android 库的公共 API 中处理 R8 + JvmStatic Annotation + Lambda

首先,请注意,我不期待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,一切都很好,并调用代码来自JavaKotlin预期被写入。

但是现在我想在打开时释放库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)

我是在某处犯了错误还是预期这是某种限制?

我尝试了什么?

  1. 删除 …

obfuscation android-library kotlin android-r8

11
推荐指数
1
解决办法
691
查看次数

Android Gradle Build Plugin 4.0.0 &amp; R8 Desugaring 不适用于 API 19

我正在将一个 Android 应用程序从使用 Proguard 的 desugaring 切换到 Android Gradle Build Plugin 4.0.0 中可用的新 R8 desugaring。

我已按照官方文档中详述的步骤启用 Java 8 库脱糖:

gradle.properties

projectJavaVersion = 1.8
android.useAndroidX=true
android.enableJetifier=true
Run Code Online (Sandbox Code Playgroud)

应用程序构建.gradle

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

11
推荐指数
1
解决办法
2236
查看次数

java.lang.ClassCastException:java.lang.Class无法使用retrofit2转换为java.lang.reflect.ParameterizedType

我有这个代码:

    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

11
推荐指数
2
解决办法
4265
查看次数

D8和R8 android之间的区别

随着android studio推出了两款新工具D8和R8.根据谷歌文档D8是一个dex工具,R8是一个progourd工具,但由于他们的解释两​​者都做了几乎相同的事情如下:

D8是一个将java字节代码转换为dex代码的dexer.

R8是一个java程序缩小和缩小工具,它将java字节代码转换为优化的dex代码.

它似乎都将java字节代码逐字转换为dex代码.那么,实际上他们在转换dex代码时是在内部做什么的?

android dex android-d8 android-r8

10
推荐指数
3
解决办法
8113
查看次数