使用DataBinding和R8实现Android动态特性

8

我在使用DataBinding时遇到了问题,这与我的动态特性模块有关。

isMinifyEnabled = true时,我无法生成与我的片段相关的绑定对象。

通常情况下,我尝试使用以下代码来完成: val viewDataBinding: FragmentFeature1Binding = DataBindingUtil.inflate(inflater, layoutId, container, false) 但是inflate()返回的值始终为空,并且没有任何其他信息。我尝试直接使用FragmentFeature1Binding来填充布局,但结果相同。

当我将片段移动到app模块时,一切正常。

我的应用程序build.gradle.kts文件:

android {
    compileSdkVersion(AndroidVersions.compileSdk)
    buildToolsVersion(AndroidVersions.buildTools)

    dataBinding.isEnabled = true

    defaultConfig {
        applicationId = ApplicationConfig.id
        minSdkVersion(AndroidVersions.minSdk)
        targetSdkVersion(AndroidVersions.targetSdk)
        versionCode = ReleaseVersions.versionCode
        versionName = ReleaseVersions.versionName
    }
    buildTypes {
        getByName(BuildTypes.debug) {
            isMinifyEnabled = true
            isShrinkResources = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            buildConfigField("Long", "API_TIMEOUT_IN_SECONDS", "30l")
        }
    }

    compileOptions {
        targetCompatibility = JavaVersion.VERSION_1_8
        sourceCompatibility = JavaVersion.VERSION_1_8
    }

    dynamicFeatures = mutableSetOf(Modules.feature1)
}

我的特性1 build.gradle.kts 文件:

android {
    compileSdkVersion(AndroidVersions.compileSdk)

    dataBinding.isEnabled = true

    defaultConfig {
        minSdkVersion(AndroidVersions.minSdk)
        targetSdkVersion(AndroidVersions.targetSdk)
    }

    compileOptions {
        targetCompatibility = JavaVersion.VERSION_1_8
        sourceCompatibility = JavaVersion.VERSION_1_8
    }

    buildTypes {
        create(BuildTypes.instrumentation) {
            buildConfigField("String", "API_ENDPOINT", "\"https://api.github.com/\"")
        }

        getByName(BuildTypes.debug) {
            buildConfigField("String", "API_ENDPOINT", "\"https://api.github.com/\"")
        }

        getByName(BuildTypes.release) {
            buildConfigField("String", "API_ENDPOINT", "\"https://api.github.com/\"")
        }
    }
}

我的proguard-rules.pro
-dontwarn android.databinding.**
-keep class android.databinding.** { *; }

-keep class kotlin.Metadata {
    *;
}

-keepattributes InnerClasses
 -keep class **.R
 -keep class **.R$* {
    <fields>;
}

没有使用 R8 时,一切都正常运作,所以我认为可能缺少某些规则,但我尝试了几种配置,可惜 Google 没有官方配置。


你是否按照我的答案找到了解决方案? - Sanket Vekariya
1
@SanketVekariya 还没有,降级数据绑定不是我的项目的好解决方案 :( - Paweł Dedio
这个问题有任何更新吗?当我使用动态特性时,我也遇到了同样的问题。 - ovluca
@GauravBansal 是的,我已经在所有模块中添加了它。 - Paweł Dedio
@PawełDedio,你找到解决方案了吗? - Rado
显示剩余4条评论
1个回答

0

如果您正在使用 Android Studio 3.2 或更高版本,则会出现此问题...
原因:
从 Android Studio 3.2 版本开始,默认启用了"data-binding v2"
解决方案:
您需要像下面这样从 gradle.properties 启用 data-binding v1。

android.databinding.enable=true

这对我起作用...希望你也能找到解决方案。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接