Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.37k stars 1.29k forks source link

Databinding 无法调用到 Layout 上的控件 #1253

Closed LeonWu6 closed 2 months ago

LeonWu6 commented 8 months ago

这可能是跟 Shadow 框架不相关的异常,但由于研究多天找不到原因,跑来此论坛请教大佬!

问题描述: 我应用是导入 shadow 框架插件化改造过的应用。 在宿主 app 和 插件 app 分别都使能 dataBinding,但出现了在插件 app 无法使用 binding对象调用 layout上控件的异常。

  1. 我的工程目录:

    projectRoot
    -app                //宿主app
    -buildSrc
    -host-lib
    -pluginmanager
    -splitApk                  // 这个目录下包含以下四个moudle
     -CellularApp        //插件app
     -CellularLoader
     -CellularRuntime
     -rfkitlib
    -utils
  2. 在所有 moudle 中使能 dataBinding和viewBinding

    
    apply plugin: 'kotlin-kapt'
    apply plugin: 'kotlin-parcelize'

android { buildFeatures { viewBinding true dataBinding true } }


3. 在插件app中写一个databinding的layout

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
   **<!--TextView 有绑定数据 -->**
    <TextView
        android:id="@+id/test_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="@{testviewString}" />
    **<!--Button  无绑定数据 -->**
    <Button
        android:id="@+id/test_bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>


4. Activity 的测试代码如下:

override fun onCreate(p0: Bundle?) { super.onCreate(p0) mLogger.debug("onCreate") mBinding = DataBindingUtil.setContentView(this, R.layout.activity_test) if (mBinding.testTv == null) { // mBinding.testTv 不会等于空 mLogger.error("onCreate mBinding.testTv == null") } else { mLogger.debug("onCreate mBinding.testTv != null") } if (mBinding.testBt == null) { // mBinding.testBt 等于空,无法用mBinding获得button控件 mLogger.error("onCreate mBinding.testBt == null") } else { mLogger.debug("onCreate mBinding.testBt != null") } }

对应用的日志打印:

D onCreate D onCreate mBinding.testTv != null E onCreate mBinding.testBt == null



5. 总结描述:
在我的插件app CellularApp中,如果在dataBinding Layout中,一个没有绑定 variable的控件,无法用dataBinding的对象获取到。但在宿主app 中,没有这个异常,正常来说,无论一个控件有没有绑定变量,都应该可以用 dataBinding的对象获得。

请问您知道这是什么问题吗?
totallyScum commented 1 month ago

这个问题同样复现了 能给解决一下吗?

shifujun commented 1 month ago

基于sample提供最小改动的复现代码,我可以一起看看原因。

totallyScum commented 1 month ago

git@github.com:totallyScum/plugin-project-demo-1.git 基于maven工程创建了插件的复现代码 现在发现只要开启additionalParameters "--package-id", "0x80", "--allow-reserved-package-id" 就会出现NPE问题

shifujun commented 1 month ago

git@github.com:totallyScum/plugin-project-demo-1.git 基于maven工程创建了插件的复现代码 现在发现只要开启additionalParameters "--package-id", "0x80", "--allow-reserved-package-id" 就会出现NPE问题

你完全新建个仓库,看不出你改了什么。你得fork一下,然后添加一些可以复现问题的改动。比如像这样https://github.com/Tencent/Shadow/compare/master...AndroidMuggle:Shadow:test_reflection_android_muggle

totallyScum commented 1 month ago

git@github.com:totallyScum/plugin-project-demo-1.git 基于maven工程创建了插件的复现代码 现在发现只要开启additionalParameters "--package-id", "0x80", "--allow-reserved-package-id" 就会出现NPE问题

你完全新建个仓库,看不出你改了什么。你得fork一下,然后添加一些可以复现问题的改动。比如像这样master...AndroidMuggle:Shadow:test_reflection_android_muggle

基本没任何改变 就是打开了databinding 然后xml里面写了个textview 再修改报名id,普通应用package-id改变后,也无法使用databinding直接调用控件的形式

totallyScum commented 1 month ago

问题已经解决,plugin设置package-id大于0x7f的原因,设置过大导致int类型溢出 view绑定出问题