使用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.* {*;}
hiddow commented
同样的问题,这种全部不混淆的话,安装包的体积会大很多 @DylanCaiCoding
DylanCaiCoding commented
同样的问题,这种全部不混淆的话,安装包的体积会大很多 @DylanCaiCoding
你试一下下面的混淆规则,有人说用这个解决了。
-keepclassmembers class * implements androidx.viewbinding.ViewBinding {
public static ** bind(***);
public static ** inflate(...);
}
我自己一直是用之前的混淆规则,没遇到混淆问题,有点奇怪。我周末借台电脑来测一下。