Skip to content

1.3.4.3

Choose a tag to compare

@ShirosakiMio ShirosakiMio released this 30 Oct 01:34
· 38 commits to main since this release

中文

✨ 新功能

  1. 内置 MobileGlues 与 SimpleFPEWrapper 渲染器 (#1971):新增两个内置渲染器——MobileGlues(走 POJAV_RENDERER=opengles3_mobileglues,MG_DIR_PATH 指向应用私有目录)与 SimpleFPEWrapper(走 POJAV_RENDERER=opengles3_sfpew,SFPEW_RELAXED_CONTEXT 单线程单上下文优化默认开启);内置渲染器列表行尾新增齿轮入口,支持配置环境变量与 MobileGlues 全量运行时选项(enableANGLE、enableNoError、angleDepthClearFixMode、customGLVersion、maxGlslCacheSize、三扩展开关、FSR1 超分等),启动时仅把显式配置过的键合并写入 files/mobileglues/config.json(保留 MG 自管键)经 MG_DIR_PATH 生效;环境变量对话框支持可选说明文字渲染;顺带加固 gl_bridge 对 LIBGL_ES 缺省的空值处理(原 strtol(NULL) 在 gl_init_context SEGV)
  2. 皮肤 3D 预览恢复体素化实心第二层(复刻 3D Skin Layers):1.3.4.2 回归 GLES 渲染器时第二层退化为 OverlayExtrusion 边缘挤出(仅 0.5px 侧壁),3D 皮肤层开关开/关几乎无差别;现恢复体素化实现——第二层每个全不透明像素(alpha=255)生成六面贴图立方体,相邻面剔除、UV 内缩 1/4096 防渗色、头 1.05/四肢 1.02 缩放校正,并增补方向光照(环境光 0.70 + 漫反射 0.42);两遍绘制:体素层先画写深度,第二层零厚度面片后画(关深度写)仅呈现半透明像素;开关关闭时第二层整体回落平面;slim 模型切换同步重建手臂体素层
  3. 控件编辑跨组能力 (#1763):单控件跨组复制/移动——编辑栏新增「跨组」按钮,先选复制/移动再从目标组列表点选执行(复制生成新控件 id,移动保留 id 并先删后加避免同 id 双渲染);控件组合并——控件组编辑对话框新增「把该组控件合并到其他组」,全部控件转移至目标组(保留控件 id),原组保留但清空,双方数据未加载时自动按需加载;多组同看同改——左侧编辑菜单新增「跨组编辑」开关(默认关闭),开启后参考组(ghost)控件开放选中/拖动/缩放/编辑,视图持有归属组真实数据对象引用,改动直接写入归属组;绑定控件组显隐指定状态——绑定对话框逐组四态(不绑定/按下切换/按下显示/按下隐藏),绑定串以 id:show / id:hide 后缀扩展,旧配置向后兼容

⚡ 优化

  1. OSMesa 剥离为渲染器插件 (#1959):移除随包内置的 libOSMesa_8/81、libvirgl_test_server、libvirglrenderer_1 与内置 Freedreno/VirGL 渲染器条目,OSMesa 改由 FCLRendererPlugin 插件提供,保留全部原生加载通路并为插件渲染器补全 VIRGL_TEST_SERVER / VTEST_SOCKET_NAME / MESA_GLSL_CACHE_DIR 运行时路径;顺带修复插件渲染器三处 native 缺陷——dlsym_OSMesa 优先读 LIB_MESA_NAME(裸库名 dlopen 在类加载器命名空间下搜不到插件目录致 SIGSEGV)、virglMakeCurrent 的 OSMesa 颜色缓冲误传 libc setbuffer 函数地址(bionic API23+ 声明,首帧 flush 写只读代码页 SIGSEGV,改为按保存的宽高分配真实缓冲区)、virgl_ensure_framebuffer 先分配后释放(calloc 失败时保留旧缓冲并返回 NULL,避免 OOM 时向 OSMesaMakeCurrent 传 NULL)

🐛 修复

  1. 版本列表切换版本异常跳动 (#1974):三处跳动源一并修复——分类 Tab 栏 scrollFlags 含 enterAlways|snap,点按条目的微小纵向漂移即触发嵌套滚动,AppBarLayout 展开又 snap 回弹致整列表上下窜动(改为仅 scroll,上滑仍可收起);diff 内容变化返回 null payload 触发整行重绑与交叉淡出/入场动画重播,一次刷新可见条目集体横滑闪烁(改为 PAYLOAD_CONTENT 局部重绑,复用 ViewHolder 只刷数据字段无动画);render 定位选中项在已可见时仍拽动视口(改为仅不可见时才滚动)
  2. Cleanroom 原版音效全失 (#1969/#1980):两处独立根因——jsound 桥接每次后端调用都 alcMakeContextCurrent 抢占进程全局 current 并清空调用线程 TLS,paulscode 线程上的 AL 调用全部落进桥接 context(source ID 失效),其自身 context 被判孤儿遭 OpenAL Soft 1.25+ alcCloseDevice 隐式销毁后静默切换 No Sound,现改走 alcSetThreadContext 线程局部激活(守卫式 enter/leave 保存还原旧 TLS current,无扩展兜底路径同样保存/还原全局 current);Cleanroom 替换 destroy() 后 AL.create() 在 alcDevice 为空时崩溃,更新 lwjgl-openal.jar 补充 alcDevice 判空
  3. 26.4 快照 JNA 5.19.1 启动崩溃:jna.boot.library.path 落空后 JNA 从 MC jar 抽取 glibc 版 libjnidispatch.so,在 Android 上 dlopen 必崩;fetch-jna.sh 版本范围扩展到 5.19.1(官方 AAR 为 natives 正源),assets 补齐 5.19.1 当前架构 natives(version 哈希随新产物自动更新触发重装),并新增 JnaNatives 兜底——assets 快路径缺失时从阿里云/华为/repo1 下载 jna AAR 提取对应架构库到 RUNTIME_DIR/jna/<版本>/
  4. BMCLAPI 无显式校验值下载报 NoSuchFileException:1.3.4.2 慢速节点切换功能引入的 FileDownloadTask 兜底校验在 close() 里重读 temp 文件,但 FileUtils.moveFile(copy 后删除源文件)在校验前已把 temp 删除,BMCLAPI 链路且无显式 IntegrityCheck 的下载(如 OptiFine 安装)在文件成功落位后 100% 报错,并随重试反复完整重下仍失败;改为 getContext 创建增量 MessageDigest、write() 边写边喂、close() 直接比对内存摘要,零额外 I/O 且与 integrityCheck 路径同构
  5. 主题背景偶发绘制崩溃:Glide 加载的 centerCrop 产物位图归位图池所有,视图 detach、同视图再次加载或 trimMemory 池回收时被 recycle,而背景仍被视图持续绘制,主线程抛 "Canvas: trying to use a recycled bitmap";改为复制自持位图后再设背景,MainActivity/Splash/ThemeEngine.applyBackground/GameMenu 四处调用点一并修复
  6. Actinium 标题界面把窗口设成 0×0:GLFW 拦截非正尺寸窗口调用,不再向下游传递非法尺寸
  7. 下载页条目透出侧滑收藏按钮:主题色透明度<100% 时 SwipeMenuLayout 垫底的收藏按钮透出;关闭态隐藏菜单层(INVISIBLE 保测量)
  8. 用户协议/隐私页链接隐形:链接色与主题色背景同色时不可见;改为按背景亮度取主色的暗/亮变体
  9. MioLibPatcher 系统信息报错:内置 MioLibPatcher 所带 oshi-core-ffm 7.x 在 bionic 缺 utmpx 符号,SystemReport 三组信息报错;符号桩兜底 + HAS_UDEV 直置

English

✨ New Features

  1. Two new built-in renderers: MobileGlues and SimpleFPEWrapper (#1971): MobileGlues (via POJAV_RENDERER=opengles3_mobileglues, with MG_DIR_PATH pointing at the app's private directory) and SimpleFPEWrapper (via POJAV_RENDERER=opengles3_sfpew, with the SFPEW_RELAXED_CONTEXT single-thread/single-context optimization on by default); a gear entry was added at the end of each built-in renderer row, opening configuration for environment variables and the full set of MobileGlues runtime options (enableANGLE, enableNoError, angleDepthClearFixMode, customGLVersion, maxGlslCacheSize, three extension toggles, FSR1 upscaling, etc.) — at launch only explicitly configured keys are merged into files/mobileglues/config.json (MG-managed keys are preserved) and applied via MG_DIR_PATH; the environment-variable dialog now renders an optional description line; also hardened gl_bridge against an empty LIBGL_ES (the previous strtol(NULL) SEGV'd in gl_init_context)
  2. The 3D skin preview restored its voxelized solid second layer (replicating 3D Skin Layers): When 1.3.4.2 returned to the GLES renderer, the second layer had degraded to OverlayExtrusion edge extrusion (only 0.5px side walls), making the 3D skin layer toggle nearly indistinguishable on/off; the voxelized implementation is restored — every fully opaque pixel (alpha=255) of the second layer generates a six-face textured cube with adjacent-face culling, UV inset of 1/4096 against color bleeding, and head 1.05 / limbs 1.02 scale correction, plus directional lighting (ambient 0.70 + diffuse 0.42); two draw passes: the voxel layer draws first writing depth, then the second layer's zero-thickness faces draw with depth writes off, showing only translucent pixels; with the toggle off the second layer falls back to flat; slim-model switching rebuilds the arm voxel layer accordingly
  3. Cross-group capabilities in the control editor (#1763): Cross-group copy/move of a single control — a new "cross-group" button in the edit bar, pick copy/move then tap a target group (copy generates a new control id, move keeps the id and deletes-then-adds to avoid double rendering); group merging — the group-edit dialog gains "merge this group's controls into another group", transferring all controls (ids preserved) while keeping the emptied source group, loading either side's data on demand when missing; viewing and editing multiple groups at once — a "cross-group editing" toggle in the left edit menu (off by default) makes reference-group (ghost) controls selectable/draggable/scalable/editable, with views holding real references to the owning group's data so edits write through; binding a control group to show/hide with an explicit state — the bind dialog now offers four states per group (none / toggle on press / show on press / hide on press), encoded as id:show / id:hide suffixes, backward compatible with old configurations

⚡ Improvements

  1. OSMesa split out into a renderer plugin (#1959): The bundled libOSMesa_8/81, libvirgl_test_server and libvirglrenderer_1 and the built-in Freedreno/VirGL renderer entries were removed; OSMesa is now provided by an FCLRendererPlugin, keeping the full native loading path and completing VIRGL_TEST_SERVER / VTEST_SOCKET_NAME / MESA_GLSL_CACHE_DIR runtime paths for plugin renderers; three native defects were fixed along the way — dlsym_OSMesa now prefers LIB_MESA_NAME (a bare-soname dlopen can't find the plugin directory under the classloader namespace and SIGSEGVs), virglMakeCurrent no longer passes libc's setbuffer function address as the OSMesa color buffer (declared since bionic API23+; the first flush wrote to a read-only code page and SIGSEGV'd — now a real buffer is allocated from the saved dimensions), and virgl_ensure_framebuffer allocates before freeing (on calloc failure the old buffer is kept and NULL returned, avoiding passing NULL to OSMesaMakeCurrent on OOM)

🐛 Bug Fixes

  1. Version list jumping abnormally when switching versions (#1974): Three jump sources fixed together — the category tab bar's scrollFlags included enterAlways|snap, so a tiny vertical drift while tapping triggered nested scrolling and the AppBarLayout expanded then snapped back, bouncing the whole list (now scroll-only; swiping up still collapses it); diff content changes returned a null payload, rebinding whole rows and replaying cross-fade/entry animations so every visible row slid and flickered on each refresh (now PAYLOAD_CONTENT partial rebinds that reuse the ViewHolder and refresh only data fields); render scrolled to the selected entry even when it was already visible (now scrolls only when it's out of view)
  2. Cleanroom losing all vanilla sound (#1969/#1980): Two independent root causes — the jsound bridge called alcMakeContextCurrent on every backend call, hijacking the process-global current and clearing the calling thread's TLS, so AL calls on paulscode's thread all landed in the bridge's context (invalidating source IDs) while its own context was orphaned and implicitly destroyed by OpenAL Soft 1.25+'s alcCloseDevice, silently switching to No Sound; activation now goes through alcSetThreadContext (guard-style enter/leave that saves and restores the old TLS current, with the fallback path likewise saving/restoring the global current); and after Cleanroom replaced destroy(), AL.create() crashed on a null alcDevice — lwjgl-openal.jar was updated with the null check
  3. Startup crash on 26.4 snapshots (JNA 5.19.1): When jna.boot.library.path missed, JNA extracted the glibc build of libjnidispatch.so from the MC jar, which always fails to dlopen on Android; fetch-jna.sh now covers 5.19.1 (the official AAR is the natives source of truth), the assets carry the 5.19.1 natives for the current ABI (the version hash updates with the new artifact to trigger reinstall), and a new JnaNatives fallback downloads the jna AAR from Aliyun/Huawei/repo1 and extracts the matching-architecture library into RUNTIME_DIR/jna// when the assets fast path is missing
  4. NoSuchFileException when downloading via BMCLAPI without an explicit checksum: The FileDownloadTask fallback check introduced with 1.3.4.2's slow-node switching re-read the temp file in close(), but FileUtils.moveFile (copy then delete source) had already removed it, so any BMCLAPI-chain download without an explicit IntegrityCheck (e.g. OptiFine installs) failed 100% of the time after successfully landing, then re-downloaded in full on every retry; the hash is now computed incrementally — a MessageDigest is created via getContext, write() feeds it as data arrives, and close() compares the in-memory digest — with zero extra I/O and the same structure as the integrityCheck path
  5. Occasional theme-background drawing crashes: The centerCrop bitmap Glide produced belonged to its bitmap pool; on view detach, another load into the same view, or pool recycling during trimMemory it got recycled while the background kept drawing it, throwing "Canvas: trying to use a recycled bitmap" on the main thread; the background is now set from a copied, self-owned bitmap, fixed at all four call sites (MainActivity/Splash/ThemeEngine.applyBackground/GameMenu)
  6. Actinium's title screen setting the window to 0×0: GLFW now intercepts non-positive window size calls instead of passing them downstream
  7. Download-page items showing the underlying swipe favorite button: With theme-color opacity below 100%, the favorite button behind SwipeMenuLayout showed through; the menu layer is now hidden in the closed state (INVISIBLE to preserve measurement)
  8. Invisible links on the user agreement/privacy pages: Link color could match the theme-color background; links now pick a dark/light variant of the primary color based on background luminance
  9. MioLibPatcher system report errors: The bundled MioLibPatcher's oshi-core-ffm 7.x references utmpx symbols missing on bionic, failing three sections of SystemReport; symbol stubs plus a fixed HAS_UDEV now cover it