Skip to content

升级 Rhino 到 1.9.2,恢复 UI 控件属性赋值并修复相关问题 - #232

Open
xcl199f wants to merge 4 commits into
aiselp:setup-v7from
xcl199f:pr/rhino-upgrade
Open

xcl199f wants to merge 4 commits into
aiselp:setup-v7from
xcl199f:pr/rhino-upgrade

Conversation

@xcl199f

@xcl199f xcl199f commented Nov 14, 2026

Copy link
Copy Markdown

脚本引擎升级到 Rhino 1.9.2,并补齐新版本下 UI 控件属性赋值的兼容处理。

变更

  • Rhino / Rhino XML / Rhino Tools 从 1.8.1 升级到 1.9.2。
  • 改用 Rhino 原生属性分派,移除自定义的 VMBridge 反射补丁,降低与新版本的兼容风险。

兼容性

  • 脚本侧 API 不变;依赖 UI 控件属性赋值的脚本在升级后行为恢复正常。

- Rhino 1.8.1 -> 1.9.2,适配新的 TypeInfo 类型系统(wrap / wrapAsJavaObject 签名变更)
- 新增 InjectedNativeJavaObject、SimpleTypeInfo,View 对象统一包装后可读写布局属性
- ProxyObject / ProxyJavaObject / NativeJavaObjectWithPrototype / BindingNativeJavaObject 同步重构,移除 VMBridge_custom
- 新增 AttrSupport 接口,13 个 Js* 控件实现,经由 ViewExtras / ViewAttributes 读写属性
- JsSpinner 支持下拉最大高度、条目高度以及选中态/普通态文字与背景色配置
- v6-api 的 ui.ts 暴露控件属性接口
Rhino 1.9.2 把 WrapFactory 调用链统一到 wrap(..., TypeInfo) ->
wrapAsJavaObject(..., TypeInfo),且 VMBridge 整套被移除。原实现为此新增
InjectedNativeJavaObject 在 get() 里手写反射分派 ViewPrototype,并重写
wrap(TypeInfo),带来两类问题:

- 手写 get() 在 prototype 非 null 时对任意属性返回 BaseFunction,
  has()/get() 不一致、拼错属性静默失败;Method.invoke 未做 JS->Java
  参数转换且漏 catch IllegalArgumentException,存在崩溃路径。
- 重写 wrap(TypeInfo) 绕过了 AndroidContextFactory.WrapFactory 的
  wrap(..., Class) 重载,导致 UiObject / UiObjectCollection 的
  UiObjectProxy / bridges.asArray 包装完全失效。

改为最小适配:
- AndroidContextFactory.WrapFactory 把 UiObject 处理迁移到 TypeInfo 签名。
- RhinoJavaScriptEngine.WrapFactory 只重写 wrapAsJavaObject(TypeInfo),
  View 交给 ViewExtras.getNativeView()(NativeJavaObjectWithPrototype 的
  prototype 链);UI 控件方法由 AttrSupport 的 Java 默认方法暴露,
  属性分派与参数转换交回 Rhino LiveConnect。
- 删除 InjectedNativeJavaObject 及所有 WrapFactory 调试日志。

另外:
- VolatileDispose 增加 mSet 标志,使 setAndNotify(null) 不会因 notify
  早于 blockedGet 而丢失唤醒(ui.run 竞态),无需把值改回 true。
- ui.ts 移除 ui.run 的耗时调试日志,保留 setAndNotify(null)。

注意:view.text = 123 这类数字赋值不再自动转字符串,回归 Rhino 原生
JavaBean setter 行为;如依赖该便利行为需另加专门 setter。
从合并后的 setup-v7 取回 3 处只存在于主分支、但落在本 PR 改动
范围内的修复(对应 f8d5722b / 4ca651ee):

- ViewExtras: 静态 ResourceParser 改 WeakReference,避免脚本退出后
  仍静态强持有 ScriptRuntime 资源;按 view 绑定创建时的 parser,
  避免后启动脚本覆盖静态 parser 导致旧脚本控件属性解析落到别的
  运行时;setAttr 统一走 getViewAttributes(view)
- ProxyObject: 属性赋值日志不再打印 value,避免 token 等敏感值进 logcat
- NativeJavaObjectWithPrototype: Rhino 1.9.2 下 JsTextView 同时有
  text()/text(CharSequence),text 被暴露成 NativeJavaMethod,
  super.put() 只写进 JS 属性表会被遮蔽;特判 text + TextView 直接
  落到 TextView.setText,恢复 view.text = "xxx" 属性赋值

ScriptRuntime.java 仅有 import 顺序与一行注释差异,无功能影响,不动。
ScriptRuntime.java 里残留 3 处 CustomToastView 引用(import /
toastX 字段 / 构造函数初始化),是本分支从本地含 custom toast 的
树带进来的;而 CustomToastView.kt 属于 pr/custom-toast,上游基线
4c396b2 全树也没有该类。结果是纯上游单独合并本 PR 会因找不到
CustomToastView 而编译失败。

这里只移除这 3 处,使本 PR 完全不触碰 custom toast(该功能由
pr/custom-toast 单独提供)。保留 rhino/UI 属性注入相关的
ViewExtras.setResourceParser(...) 及 Scriptable import 的清理。
@codacy-production

Copy link
Copy Markdown

Not up to standards ⛔

🔴 Issues 2 high

Alerts:
⚠ 2 issues (≤ 0 issues of at least minor severity)

Results:
2 new issues

Category Results
ErrorProne 1 high
Security 1 high

View in Codacy

🟢 Metrics 65 complexity · -3 duplication

Metric Results
Complexity 65
Duplication -3

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant