DylanCaiCoding/ViewBindingKTX

使用viewbind之后打release包反射报错

iotxc opened this issue · 3 comments

iotxc commented

作者有遇到如下问题吗?
打release包打开app就闪退,
报错内容是 java.lang.ClassCastException: libcore.reflect.WildcardTypeImpl cannot be cast to java.lang.Class
代码很简单:

abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
  protected lateinit var binding: VB

  abstract fun initView()

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)

      val type = javaClass.genericSuperclass as ParameterizedType
      val aClass = type.actualTypeArguments[0] as Class<*>
      val method = aClass.getDeclaredMethod("inflate", LayoutInflater::class.java)
      val cls = method.invoke(null, layoutInflater)
      binding = cls as VB

      setContentView(binding.root)

      initView()
  }
}
class MainActivity : BaseActivity<ActivityMainBinding>() {
  override fun initView() {
  }
}

加了混淆规则还是无效:

-keepclassmembers class * implements androidx.viewbinding.ViewBinding {
  public static * inflate(android.view.LayoutInflater);
  public static * inflate(android.view.LayoutInflater, android.view.ViewGroup, boolean);
  public static * bind(android.view.View);
}

作者有什么解决方法嘛?

iotxc commented

已解决,混淆规则还需要添加下面这句

-keep class  包名.databinding.* {*;}

同样的问题,这种全部不混淆的话,安装包的体积会大很多 @DylanCaiCoding

同样的问题,这种全部不混淆的话,安装包的体积会大很多 @DylanCaiCoding

你试一下下面的混淆规则,有人说用这个解决了。

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

我自己一直是用之前的混淆规则,没遇到混淆问题,有点奇怪。我周末借台电脑来测一下。