具有 DataBinding 和 R8 的 Android 动态功能

标签 android android-databinding android-r8 dynamic-feature-module

在我的 Dynamic Feature module 中使用 DataBinding 时遇到问题.

isMinifyEnabled = true 时,我无法生成与我的 fragment 相关的绑定(bind)对象

通常我尝试使用以下代码来做到这一点:val viewDataBinding: FragmentFeature1Binding = DataBindingUtil.inflate(inflater, layoutId, container, false)但是 inflate() 返回的值在没有任何附加消息的情况下始终为 null。我尝试使用 FragmentFeature1Binding 扩展布局直接,但我得到了相同的结果。

当我将 fragment 移动到 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,一切都会正常工作,所以我认为缺少一些规则,但我尝试了一些配置,遗憾的是谷歌没有官方配置。

最佳答案

如果您使用的是 android studio 3.2 或更高版本,则会出现此问题...
原因:
来自android studio 3.2+, “数据绑定(bind) v2” 默认启用..
解决方案
您必须从 gradle.properties 启用数据绑定(bind) v1,如下所示

android.databinding.enable=true

它对我有用......希望你能找到解决方案。 :)

关于具有 DataBinding 和 R8 的 Android 动态功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59175153/

相关文章:

android - 如何在 Jetpack Compose 中使用参数进行导航?

java - SQLite Android 根据今天是哪一天获取数据库信息

android - 编译应用程序时,R8 程序类型已存在错误

android - R8 说类型被多次定义 : in build\. 转换和在 build\tmp\kotlin-classes

android - 在我失去连接之前,有没有办法通过蓝牙发送命令

javascript - React Native - 如何检查 UI/元素?

android - 如何将架构组件与 android 上的数据绑定(bind)相结合?

android-recyclerview - 双向数据绑定(bind)、RecyclerView、ViewModel、Room、LiveData、Oh My

Android 数据绑定(bind) @{} 与 @={}

android - R8 在构建时静默崩溃