Files
Spine_lab/tools/deobf/anchors.tsv
T
tianmo f40979f965 对照表:补 WidgetGroup 尺寸读取(min/pref/maxW/H) + 对话框显示不全/闪左下角的两个修正
- 弹窗建出来默认 150x150,正文和按钮被裁 → 显式设 width/height=max(pref,min,下限) 再 invalidate
- '先左下角再跳中间' = addActor 后过一帧才居中;改成尺寸+居中在同一次渲染回调里做完
names.tsv 338 条,payload-named.zip 已重产(5617 处引用)
2026-10-16 19:31:04 +08:00

18 KiB

1# 名字映射锚点(只放**已确定**的;每条都要能说清依据,依据写进 混淆名对照表.md)
2# 列:ownernamedescnewName (desc 写 * 表示该 owner 下所有同名成员)
3#
4# ---- libGDX:Table(载荷名 et);依据 Obf.java + 直读字节码 ----
5etD(Ldl;)LdR;add
6etD([Ldl;)Let;addAll
7etI()LdR;row
8etZ(Z)VsetFillParent
9etSourceFile()VclearChildren
10etD(Ljava/lang/CharSequence;)LdR;addLabel
11# ---- libGDX:Cell(载荷名 dR)----
12dRStackMapTable()LdR;expand
13dRD()LdR;fill
14dRC()LdR;left
15dRS()LdR;top
16# ---- libGDX:Button / Label(保名类)----
17com/badlogic/gdx/scenes/scene2d/ui/ButtonString()ZisChecked
18com/badlogic/gdx/scenes/scene2d/ui/ButtonI(Z)VsetChecked
19com/badlogic/gdx/scenes/scene2d/ui/ButtonB(ZZ)VsetCheckedAndFire
20com/badlogic/gdx/scenes/scene2d/ui/Buttona_(Z)VsetDisabled
21com/badlogic/gdx/scenes/scene2d/ui/LabelD(Ljava/lang/CharSequence;)VsetText
22com/badlogic/gdx/scenes/scene2d/ui/LabelD()Ljava/lang/StringBuilder;getTextBuilder
23# ---- libGDX:SelectBox(载荷名 KP);依据 DumpSites 解出的 (Ljava/lang/String;)V ----
24KPB(Ljava/lang/String;)VsetSelected
25KPB()Ljava/lang/String;getSelected
26KPB(I)VsetSelectedIndex
27# ---- 场景模型:Gp = 骨骼;依据 gp_2.java 的 toString()/D(String,boolean)V ----
28GpDLjava/lang/String;name
29GpD(Ljava/lang/String;Z)VsetName
30# ---- 场景模型:Gp = 骨骼的变换字段 ----
31# 证据:用户在编辑器里把 root 转到 341.456 / 平移(-168,-116) / 缩放(0.8799,0.572) / 斜切(-52.221,-28.63),
32# 面板 Inspector 同步显示 Z=-168.00009 V=-116.0 F=33.676704 Code=0.8799178 SourceFile=0.5720396
33# StackMapTable=-52.220505 LineNumberTable=-28.629883 —— 一一对应,故确定语义。
34GpZFx
35GpVFy
36GpFFrotation
37GpCodeFscaleX
38GpSourceFileFscaleY
39GpStackMapTableFshearX
40GpLineNumberTableFshearY
41# C 只能是 length,故整组推断不成立;这些字段的语义**目前未定**,不写进表里(宁可显示混淆名也不写错名)。
42# GpDFsetupX
43# GpBFsetupY
44# GpLFsetupRotation
45# GpIFsetupScaleX
46# GpSFsetupScaleY
47# 引用类字段:skeleton 由 hd.D(set, bone.D)+GP.D(LGp;) 的用法确定;parent 由创建骨骼时 bone.D=parent 确定
48GpDLGP;skeleton
49GpDLGp;parent
50GpBLcom/badlogic/gdx/graphics/Color;color
51# ---- 2026-10-16 setup pose 实测补充(用户拍照:root/bone/slot/region 四种对象)----
52# 其中 length 已被 JSON 导出器改成 Gp.C:F(导出器写 length 时读的就是 C)。
53# 剩下 Class/Ljava/java/init/String 这几个 float 导出器一个都没用,语义未定,不写进表。
54# GU(插槽):面板 Slot 属性只有 Name/Color;Inspector 里 String D=mega_dg4、Gp D=所属骨骼
55GUDLjava/lang/String;name
56GUDLGp;bone
57# GO(region 附件 mega_dg4):面板只有 Image path/Color;Inspector 六个 float 与
58# Region 附件的 旋转49.00014 / 缩放(1.997,1.335) / 宽高(157,154) 一一对应
59GOSFrotation
60GOLFscaleX
61GOIFscaleY
62GOCFwidth
63GOZFheight
64# ---- ScrollPane(保名类 com/badlogic/gdx/scenes/scene2d/ui/ScrollPane)----
65# 依据:MapMethods 对 gdx-1.11.0 指纹比对(tools/deobf/anchors-libgdx.tsv 自动生成),
66# 并且**踩过一次**:一直以为 B(ZZ)V 是 setForceScroll,传了 (false,true),
67com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneB(ZZ)VsetScrollingDisabled
68com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneL(FFFF)VscrollTo
69com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneD(Ldl;)VaddActor
70com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneD(Ldl;Z)ZremoveActor
71# ---- ScrollPane / Cell 的滚动与尺寸方法(用于把面板列表改成可滚动;依据:MapMethods 指纹比对)----
72# ScrollPane:B(ZZ)V=setScrollingDisabled、I(ZZ)V=setForceScroll、L(ZZ)V=setOverscroll
73#(候选顺序 size/… 已核对;踩坑:把 B(ZZ) 当 setForceScroll 用,等于关掉纵向滚动)
74com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneI(ZZ)VsetForceScroll
75com/badlogic/gdx/scenes/scene2d/ui/ScrollPaneL(ZZ)VsetOverscroll
76# Cell 的 (F)LdR; 成组按声明顺序:B=size L=width I=height S=minWidth C=minHeight Z=prefWidth V=prefHeight
77dRB(F)LdR;size
78dRL(F)LdR;width
79dRI(F)LdR;height
80dRS(F)LdR;minWidth
81dRC(F)LdR;minHeight
82dRZ(F)LdR;prefWidth
83dRV(F)LdR;prefHeight
84# ---- Actor 的 Touchable(点击/进入命中相关;用于让 ScrollPane 收到鼠标进入→拿到 scroll focus)----
85# 定位方式(不靠名字):`Actor.getTouchable()` = **无参且返回枚举**的那个方法;枚举类 = dv;
86# libGDX Touchable 声明顺序 enabled/disabled/childrenOnly → 第 0 个常量就是 enabled。
87# 现象佐证:ScrollPane 默认 childrenOnly 时自己不是命中目标,收不到 enter → 滚轮事件不会送到它,
88# 但程序化 scrollY() 是生效的(实测 before=0 after=200)。
89dlL(Ldv;)VsetTouchable
90# ---- Cell.height(2026-10-16 实测确认)----
91# Cell.I(900) -> root 高度 580 -> 1080(其它候选 L/B/Z/V/C/S/F 都没这个效果)
92# => Cell.I(float) 就是 height(float);现象佐证:设了它之后列表区出现滚动条、可滚。
93dRI(F)LdR;height
94# ---- Stage 宽高(2026-10-16 实测)----
95# 依据:编辑器窗口 4K 下读 Stage 的无参 float 只有两个:B=2044、D=3726(高<宽),
96# 故 B()F = getHeight、D()F = getWidth。
97dtB()FgetHeight
98dtD()FgetWidth
99# ---- 图片附件 GO 的 7 个 float 字段(2026-10-16 确认,两条独立证据)----
100# 证据 1:编辑器自己的 JSON 写入器 sb_0.java:669-675(写 region 时依次读)
101# x=GO.D y=GO.B scaleX=GO.L scaleY=GO.I rotation=GO.S width=GO.C height=GO.Z
102# 旁证:width/height 与图片实际像素一致(mega_dg4.png = 157x154,运行时读到的 C=157.0 Z=154.0)
103# 证据 2:GO 自己的 setTransform 字节码 javap -c GO 的 D(FFFFF)V:
104# putfield D(第1个参数) -> putfield B(2) -> putfield S(3) -> putfield L(4) -> putfield I(5)
105# => D(float) = x、B(float) = y(这两个字段名与别的字段重复,必须按类型取 float 那个)
106GODFx
107GOBFy
108GOD(FFFFF)VsetTransform
109# 图片附件没有 shear 字段:region 只有 x/y/rotation/scaleX/scaleY(+ 只读的 width/height)
110# ---- 附件删除(编辑器自己的删除流程)----
111# 证据:javap -c Gn 的 L()V => this.GU.skeleton.removeAttachment(this, true, true)
112# GP 的 D(Gn,ZZ)V 字节码里 getfield L:LfI; fI.B(Object,boolean) 把它从附件表移除,
113# 并同步清掉 GU 上指向它的引用(同一方法里遍历 Z:LfI 即插槽表)。
114GnL()Vdelete
115GPL(LGn;ZZ)VremoveAttachment
116GPLLfIattachments
117GPZLfIslots
118# ---- 附件种类 / 占位附件 ----
119GnI()Ljava/lang/String;type
120# 附件上指向自己所属占位附件的引用:GP.removeAttachment 的占位分支按它级联删除
121GnDLHi;placeholderRef
122# ============================================================================
123# 【权威来源】编辑器自带的 JSON 导出器(载荷类 sB,2026-10-16)
124# ----------------------------------------------------------------------------
125# 为什么权威:导出 JSON 时**每个 key 后面紧跟被读的那个字段**,key 名就是字段语义。
126# 证据链(两处独立,顺序逐条一致):
127# 1) 可读载荷 ~/Desktop/spine398/spine398.jar(DecAll 产出:ldc 密文已换明文、解密调用已换 nop)
128# 2) 未解密载荷 (payload-public.zip) 的 strings.tsv(class sB, method D):同一(类,方法)内
129# 密文顺序 = 字节码顺序,281 条与可读副本里的 key 顺序逐条对得上(含三组解密器)。
130# 导出器方法:sB.D(GP,boolean,boolean,gy,StringBuilder)=骨架;sB.D(gy,String,Gn,boolean)=附件。
131# 字段名重复(D/B/L/I/S…)时**必须按描述符取**,表里已经带描述符。
132# ============================================================================
133GpCFlength
134# ^ length 是 C(之前写的 Class:F 是错的,已作废)
135GpDLiC;transform
136# ^ iC = 继承模式枚举(normal/onlyTranslation/noScale…)
137GpStringZskinOverride
138GUBLcom/badlogic/gdx/graphics/Color;color
139GUILcom/badlogic/gdx/graphics/Color;darkColor
140GUIZhasDarkColor
141GUBLGn;attachment
142GUDLiz;blend
143# ^ iz = 混合模式枚举
144# ---- Gn = 附件基类 ----
145GnDLjava/lang/String;name
146# ---- GO = 图片(region)附件 ----
147GODLcom/badlogic/gdx/graphics/Color;color
148GOBLjava/lang/String;path
149# ---- GE = 点(point)附件 ----
150GEBLcom/badlogic/gdx/graphics/Color;color
151GEDFx
152GEBFy
153GELFrotation
154# ---- Gx = 网格(mesh / linkedmesh)附件 ----
155GxBLcom/badlogic/gdx/graphics/Color;color
156GxBLjava/lang/String;path
157GxDLga;uvs
158GxDLhp;triangles
159GxBLHl;vertices
160GxLIhull
161# ^ 导出器写 hull = Gx.L / 2
162GxDLgf;edges
163GxStackMapTableZdeform
164GxDFwidth
165# ^ 只在导出器带 extra 标志时写
166GxBFheight
167GxDLGx;parentMesh
168GxDLGT;skin
169GxDLHi;parentPlaceholder
170# ^ 父网格的占位附件(Hi)
171GxDLjava/lang/String;parentName
172# ---- Gr = 包围盒(boundingbox)附件 ----
173GrILga;vertexCount
174GrBLHl;vertices
175GrBLcom/badlogic/gdx/graphics/Color;color
176# ---- Gs = 裁剪(clipping)附件 ----
177GsILga;vertexCount
178GsBLHl;vertices
179GsBLcom/badlogic/gdx/graphics/Color;color
180GsBLGU;end
181# ^ 裁剪结束的那个插槽
182# ---- Gw = IK 约束 ----
183GwDLjava/lang/String;name
184GwDLGp;target
185GwDFmix
186GwLFsoftness
187GwFZuniform
188GwSZstretch
189GwZZcompress
190# ---- GX = 变换(transform)约束 ----
191GXDLjava/lang/String;name
192GXBLGp;target
193GXSourceFileFrotation
194GXSZlocal
195GXCZrelative
196GXLFx
197GXIFy
198GXStackMapTableFscaleX
199GXinitFscaleY
200GXLineNumberTableFshearY
201GXSFrotateMix
202GXDFtranslateMix
203GXZFscaleMix
204GXFFshearMix
205# ---- GD = 路径(path)约束 ----
206GDDLjava/lang/String;name
207GDDLGU;target
208GDDLjm;positionMode
209GDDLjo;spacingMode
210GDDLjn;rotateMode
211GDZFrotation
212GDDFposition
213GDVFspacing
214GDSFrotateMix
215GDLFtranslateMix
216# ============================================================================
217# 场景:点面板按钮 → 弹名称输入面板 → 按名字匹配附件 → 在当前选中骨骼下建 15 根骨骼,
218# 每根 1 插槽 1 附件(输入的附件名),位移 xy 0~500 随机、缩放 1、旋转/斜切 0,
219# 插槽 alpha 0.5~1 随机、blend normal/additive 随机、附件在插槽上变换 0/0/0/1/1。
220# 证据:`javap -p -c` 字节码 + attach 到运行进程逐条实测(每个 API 都真跑过并核对过结果)。
221# ============================================================================
222# UH = OG 的模型编辑助手(OG.D:LUH;)。下面两个都实测建出来过:
223UHD(LGU;LGp;Z;LfI;)LGU;addSlot
224# ^ 加插槽:参数(插槽模板, 父骨骼, ?, 不重名用列表)。⚠️ 它会把模板插槽**整个复制**,连模板插槽上挂的附件一起复制(实测踩到过)
225UHD(LGn;LGU;ZZLfI;)LGn;addAttachmentCopy
226# ^ 加附件:参数(附件模板, 插槽, ?, ?, 列表);内部就是 `Gn.D(LGP;)LGn;` 复制一份模板附件,并挂到该插槽
227GPD(LGp;)VaddBone
228# ^ 加骨骼:字节码 `bone.B = array.size; array.add(bone)`(骨架的骨骼表)
229OGD(Ljava/lang/String;LfI;LGU;)Ljava/lang/String;uniqueName
230GUD(LGn;Z)VsetAttachment
231# ^ 设插槽的当前附件:第二参=是否记撤销;内部按 `Editor.V`(animate/setup)只写 `D:LGn;` 或 `B:LGn;` 其中一个 ——
232GUDLGn;attachmentAnimate
233# ^ 与 `GU.B:LGn;` 成对:`D` 是 animate 模式用的当前附件,`B` 是 setup/非 animate 用的(JSON 导出器读的是 B)
234VZD(LGP;ZZ)Vrefresh
235# ^ 改完模型重建层级树节点(本次每批建完都调它)
236unD()VundoBegin
237unB()VundoCommit
238# ^ 撤销帧的 开始/提交(改模型前 D()、改完 B())
239unZ()Vundo
240# ^ ★ 撤销一步:实测有效(`up.D:` 栈 23→22、redo 栈 0→1,场景对象数同步回退)。
241# 本次误删骨骼后就是用连点 un.Z() 一键一键撤回来的。另外 un.S()/un.C()/un.V()/un.I() 不是撤销:
242# S=跳到历史某下标、C=置标志、V=按当前下标重放、I=up.D()(无效果)
243# ---- 名称输入面板(编辑器自带的那套对话框)----
244xlL(Ljava/lang/Object;)VonOkCancel
245# ^ 对话框的 OK/Cancel 总回调:收到 Boolean(TRUE=OK、FALSE=Cancel)。
246# OK 时它会读名字框、去重校验,然后调下面的抽象方法;Cancel 直接 return
247xlL(Ljava/lang/String;)VonNameEntered
248# ^ **抽象方法**:OK 且名字合法时被调用,参数就是输入的名字。想拿名字就子类化它(本次是 ASM 现生成子类)
249xlD(Ldt;)LvH;show
250# ^ 显示对话框。⚠️ 实测:**光调它窗口不会挂进 Stage**(parent 一直 null、屏幕上什么都不出现),
251# 必须再显式 `dt.D(Ldl;)V`(Stage.addActor)挂上去,然后自己 setPosition
252xlDLKp;nameField
253# ^ 对话框里的名字输入框(Kp = TextField 子类):构造时会用它填入默认名,OK 时从它读名字
254vHB(Ljava/lang/Object;)VokPressed
255# ^ OK 按钮的回调:唯一会去调 `L(Object)` 的地方(javap -c vH 可见)
256vHL(Ljava/lang/Object;)VonOkCancelNoop
257# ^ 空实现(xl 覆盖了它)
258KpB()Ljava/lang/String;getText
259KpB(Ljava/lang/String;)VsetText
260# ^ 名字框取/填文字(xl/xp 的构造与 L(Object) 里就是这么用的)
261# ---- Actor / Stage / WidgetGroup(定位、挂载、删除)----
262dtD(Ldl;)VaddActor
263# ^ Stage.addActor:字节码就是 `this.D:Ldo;.addActor(actor)`(root.addActor)。
264# ⚠️ 用它把对话框挂上屏幕(配合 xl.D(dt));也踩过坑:它会把 Actor 从原父级摘走(当年把面板列表搬出面板就是它)
265dlDLdo;parent
266dlDLdt;stage
267# ^ Actor 上的两个同名字段:`do` 类型的是父控件,`dt` 类型的是所在 Stage。按类型取,别按名字取
268dlD()Ldt;getStage
269dlb_()Zremove
270eXb_()Vinvalidate
271eXV(Z)VsetFillParent
272dlc_()FgetX
273dld_()FgetY
274dlL()FgetWidth
275dlI()FgetHeight
276dlS()FgetTop
277dlC()FgetRight
278# ^ Actor 的几何读取(都在 dl 上用 `javap -p -c` 对出来的:c_=x、d_=y、L=width、I=height、S=y+h、C=x+w)。
279# ⚠️ `et`(Table) 自己还声明了 `int L()`/`int I()`(列数/行数),所以按名字取必须**同时按返回类型 float 过滤**
280dlD(FFI)VsetPosition
281# 本次要把对话框摆屏幕正中就是靠这个:直接传 Stage 中心即可
282# ---- 混合模式枚举(插槽 blend)----
283izDLiz;normal
284izBLiz;additive
285izLLiz;multiply
286izILiz;screen
287# ---- 面板自己那套(本次复用的)----
288com.spineview.ObjectPanelwire(Ljava/lang/ClassLoader;Ljava/lang/Object;Ljava/lang/Runnable;)VwireButton
289# ^ 把按钮接上点击(轮询 isChecked + 路由线程)——新按钮直接复用它,不用自己写监听
290com.spineview.SceneObjectslistAllNodes(Ljava/lang/ClassLoader;)Ljava/util/List;listAllNodes
291com.spineview.SceneActionsdelete(Ljava/lang/ClassLoader;Ljava/lang/Object;)Zdelete
292# ---- WidgetGroup 的尺寸读取(本次用来把对话框撑到合适大小)----
293eXLineNumberTable()FgetMinWidth
294eXString()FgetMinHeight
295eXStackMapTable()FgetPrefWidth
296eXinit()FgetPrefHeight
297eXLjava()FgetMaxWidth
298eXClass()FgetMaxHeight
299# ^ 六个 Layout 方法按 eX 声明顺序对应 minWidth/minHeight/prefWidth/prefHeight/maxWidth/maxHeight
300# (面板日志里一直用的 `init` 读出来就是 prefHeight;本次实测对话框 pref=399x166)
301# ^ ⚠️ 窗口刚建出来时的尺寸是默认的 150x150(所以正文/按钮会被裁),
302# 要显式 `Actor.width/height = max(pref, min, 下限)` + `eX.b_()V`(invalidate) 才会按 pref 撑开