Android Kotlin ProGuard规则错误?
目前,我有一个库将被多个其他项目使用,但是在使用.aar时,我遇到了代码混淆的问题,尤其是在某些类中: 这是一个用来处理后端响应或异步任务等Android Kotlin ProGuard规则错误?,android,kotlin,gradle,proguard,Android,Kotlin,Gradle,Proguard,目前,我有一个库将被多个其他项目使用,但是在使用.aar时,我遇到了代码混淆的问题,尤其是在某些类中: 这是一个用来处理后端响应或异步任务等 sealed class Result<out T : Any> { open class Success<out T : Any>(val data: T) : Result<T>() open class Error(val error: ErrorModel) : Result<Nothing
sealed class Result<out T : Any> {
open class Success<out T : Any>(val data: T) : Result<T>()
open class Error(val error: ErrorModel) : Result<Nothing>()
}
我使用的规则是:
#noinspection ShrinkerUnresolvedReference
-keep class com.cross.project.compilation.testlib.response.** { *; }
-keep class com.cross.project.compilation.testlib.LibApp.** { *; }
目前我有3种构建类型和2种风格:
buildTypes {
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
releaseDebug{
debuggable true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug{
debuggable true
minifyEnabled false
}
}
flavorDimensions "libFlavors"
productFlavors {
dev {
}
prod {
}
}
当我在consumer项目中检查反编译源中的版本变体时,我得到:
结果获取从成功返回中剥离的public sealed class Result<out T : kotlin.Any> private constructor() {
public open class Error public constructor(error: com.cross.project.compilation.testlib.response.ErrorModel) : com.cross.project.compilation.testlib.response.Result {
public final val error: com.cross.project.compilation.testlib.response.ErrorModel /* compiled code */
}
public open class Success<out T : kotlin.Any> public constructor(data: T) : com.cross.project.compilation.testlib.response.Result {
public final val data: T /* compiled code */
}
}
为此:
return when (val response = accountService.getAccountData()) {
is Result.Success<*> -> ConsumerResult.Success((response.data as AccountData))
is Result.ErrorModel -> ConsumerResult.Failure(response.errorModel)
}
并将@Keep注释添加到类中的每个级别,如:
@Keep class LibApp private constructor(
...
@Keep
companion object {
...
@Keep
fun init(
...
但是,我没有幸修改规则以保持结果的一般返回。成功,知道我做错了什么吗
作为补充信息,我正在使用和构建maven publish插件:
Android Gradle插件4.0.1
梯度包装6.1.1
此问题似乎是在我从以下位置升级后出现的:
Android Gradle插件3.6.3
Gradle Wrapper 5.6.4结果中不键入任何内容。错误在R8模糊处理时被清除。尝试在build.gradle文件中添加以下内容:
-keepclasseswithmembers class com.cross.project.compilation.testlib.LibApp {
public *;
}
-keep @interface kotlin.Metadata {
*;
}
-keepattributes RuntimeVisibleAnnotations
buildscript {
repositories {
// other repos are omitted
maven { url 'https://storage.googleapis.com/r8-releases/raw' }
}
dependencies {
classpath 'com.android.tools:r8:2.1.68'
// other dependencies are omitted
在proguard文件中声明要防止混淆的结果类型
-keep class [path_to_class].Result { *; }
-keep class [path_to_class].Result$** { *; }
buildscript {
repositories {
// other repos are omitted
maven { url 'https://storage.googleapis.com/r8-releases/raw' }
}
dependencies {
classpath 'com.android.tools:r8:2.1.68'
// other dependencies are omitted
-keep class [path_to_class].Result { *; }
-keep class [path_to_class].Result$** { *; }