kotlin NoSuchMethodException:com.x.y.z.j.h1.inflate [class android.view.LayoutInflater] -查看绑定扩展

n9vozmp4  于 2023-08-06  发布在  Kotlin
关注(0)|答案(3)|浏览(96)

我有一个Activity的视图绑定扩展。实现如下:

inline fun <reified T : ViewBinding> Activity.viewBinding() = ActivityViewBindingDelegate(T::class.java)

class ActivityViewBindingDelegate<T : ViewBinding>(private val bindingClass: Class<T>) : ReadOnlyProperty<Activity, T> {
    /**
     * initiate variable for binding view
     */
    private var binding: T? = null

    @Suppress("UNCHECKED_CAST")
    override fun getValue(thisRef: Activity, property: KProperty<*>): T {
        binding?.let { return it }

        /**
         * inflate View class
         */
        val inflateMethod = bindingClass.getMethod("inflate", LayoutInflater::class.java)

        /**
         * Bind layout
         */
        val invokeLayout = inflateMethod.invoke(null, thisRef.layoutInflater) as T

        /**
         * Set the content view
         */
        thisRef.setContentView(invokeLayout.root)

        return invokeLayout.also { this.binding = it }
    }
}

字符串
当我在调试变量中运行我的应用程序时,一切正常。
当我在版本变量中运行我的应用时,在运行时Activity启动时,我会遇到以下异常:

Caused by: java.lang.NoSuchMethodException: com.x.y.z.j.h1.inflate [class android.view.LayoutInflater]


isMinifyEnabled = true isShrinkResources = true是否已启用最小化= true是否收缩资源= true
我必须混淆我的活动。如何解决这一问题?

cbeh67ev

cbeh67ev1#

添加proguard-rules

-keepclassmembers class ** implements androidx.viewbinding.ViewBinding {
    public static ** bind(***);
    public static ** inflate(***);
}

字符串

3npbholx

3npbholx2#

bindingClass.getMethod("inflate", LayoutInflater::class.java)

字符串
和/或

bindingClass.getMethod("bind", View::class.java)


使用R8混淆进行混淆。所以我得到了这个例外。我们应该排除对inflate和bind方法的混淆。
因此,必须添加以下内容以使用片段和活动的视图绑定扩展函数

-keep class com.sample.myapplication.databinding.* {
    public static ** inflate( ** );
    public static ** bind( ** );
}


它解决了我的问题。

n1bvdmb6

n1bvdmb63#

-keep,allowoptimization class * implements androidx.viewbinding.ViewBinding {
   public static *** bind(android.view.View);
   public static *** inflate(...);
 }

字符串

相关问题