代码之家  ›  专栏  ›  技术社区  ›  oiyio

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

  •  0
  • oiyio  · 技术社区  · 3 年前

    我有一个活动的视图绑定扩展。以下是实现:

    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 }
        }
    }
    

    当我在debug变体中运行我的应用程序时,一切都很好。

    当我在发行版变体中运行我的应用程序时,在运行时活动启动时,我会得到以下异常:

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

    isMinifyEnabled=true isShrinkResources=true

    我必须混淆我的活动。如何解决这个问题?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Sobat Blog    2 年前

    加载项proguard规则

    -keepclassmembers class ** implements androidx.viewbinding.ViewBinding {
        public static ** bind(***);
        public static ** inflate(***);
    }
    
        2
  •  0
  •   oiyio    2 年前
    bindingClass.getMethod("inflate", LayoutInflater::class.java) 
    

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

    使用R8模糊处理进行模糊处理。因此,我得到了这个例外。我们应该排除对膨胀和绑定方法的混淆。

    因此,必须添加以下内容才能使用片段和活动的视图绑定扩展函数

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

    它解决了我的问题。