From ec64ef07d90e2eb12faaf9f83dca892d46884d2e Mon Sep 17 00:00:00 2001 From: Hermes Date: Mon, 20 Apr 2026 17:48:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(icon):=20=E5=AE=BD=E6=9D=BE=20ShortX=20?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=BA=93=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=A0=87=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 APK 扫描正则从 ic_remix_ 放宽到所有 ic_ 开头的图标 - 反射获取 R 时接受所有 ic_ 开头的字段,不再限\u5b9a ic_remix_ - 弹\u7a97\u9009\u62e9\u5668\u589e\u52a0\u9519\u8bef\u63d0\u793a\u548c\u5f3a\u5236\u91cd\u8bd5\u673a\u5236 --- code/th_06_icon_parser.js | 10 +++++++--- code/th_14_panels.js | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/code/th_06_icon_parser.js b/code/th_06_icon_parser.js index 8ac9066..5b7ff8f 100644 --- a/code/th_06_icon_parser.js +++ b/code/th_06_icon_parser.js @@ -341,7 +341,8 @@ FloatBallAppWM.prototype.scanShortXIconsFromApk = function() { var out = []; var seen = {}; var paths = this.getShortXApkPaths(); - var regex = /^res\/drawable[^\/]*\/(ic_remix_[a-z0-9_]+|ic_shortx|ic_launcher|ic_menu_preferences)\.(xml|png|webp|jpg|jpeg)$/; + // 宽松匹配:匹配 res/drawable* 下所有以 ic_ 开头的图标,不限于 ic_remix_ + var regex = /^res\/drawable[^\/]*\/(ic_[a-z0-9_]+)\.(xml|png|webp|jpg|jpeg)$/; var lastErr = ""; var pi; for (pi = 0; pi < paths.length; pi++) { @@ -355,6 +356,8 @@ FloatBallAppWM.prototype.scanShortXIconsFromApk = function() { var m = regex.exec(name); if (!m) continue; var fullName = String(m[1]); + // 过\u6ee4\u6389\u7cfb\u7edf\u56fe\u6807,只\u4fdd\u7559 ShortX 自\u5b9a\u4e49\u56fe\u6807 + if (fullName.indexOf("ic_launcher") === 0 || fullName.indexOf("ic_menu_") === 0) continue; if (seen[fullName]) continue; seen[fullName] = true; out.push({ @@ -439,6 +442,7 @@ FloatBallAppWM.prototype.getShortXIconCatalog = function(forceReload) { var handle = this.getShortXResHandle(); if (handle && handle.cl) { try { + // 尝试反射获取 R$drawable 类(未混淆时可用) var clz = handle.cl.loadClass(CONST_SHORTX_PACKAGE + ".R$drawable"); var fields = clz.getFields(); var i; @@ -446,7 +450,7 @@ FloatBallAppWM.prototype.getShortXIconCatalog = function(forceReload) { try { var f = fields[i]; var fname = String(f.getName()); - if (fname.indexOf("ic_remix_") !== 0 && fname !== "ic_shortx" && fname !== "ic_launcher" && fname !== "ic_menu_preferences") continue; + if (fname.indexOf("ic_remix_") !== 0 && fname.indexOf("ic_") !== 0) continue; out.push({ name: fname, shortName: (fname.indexOf("ic_remix_") === 0) ? fname.substring("ic_remix_".length) : fname, @@ -455,7 +459,7 @@ FloatBallAppWM.prototype.getShortXIconCatalog = function(forceReload) { } catch (eField) {} } } catch (eClz) { - this._shortxIconCatalogError = String(eClz); + this._shortxIconCatalogError = "reflect: " + String(eClz); safeLog(this.L, 'w', "getShortXIconCatalog reflect failed: " + String(eClz)); } } diff --git a/code/th_14_panels.js b/code/th_14_panels.js index 7d2cf7f..6014e71 100644 --- a/code/th_14_panels.js +++ b/code/th_14_panels.js @@ -3769,8 +3769,20 @@ FloatBallAppWM.prototype.showShortXIconPickerPopup = function(opts) { var catalog = []; try { catalog = self.getShortXIconCatalog() || []; } catch(e) {} if (!catalog.length) { - self.toast("图标库未加载,请检查 ShortX 是否安装"); - return null; + var errMsg = "\u56fe\u6807\u5e93\u672a\u52a0\u8f7d"; + try { errMsg = self._shortxIconCatalogError || errMsg; } catch(e) {} + self.toast("\u56fe\u6807\u5e93\u672a\u52a0\u8f7d: " + errMsg); + // 尝试强\u5236\u91cd\u65b0\u52a0\u8f7d + try { + catalog = self.getShortXIconCatalog(true) || []; + if (!catalog.length) { + try { errMsg = self._shortxIconCatalogError || "\u91cd\u8bd5\u4ecd\u5931\u8d25"; } catch(e) {} + self.toast("\u56fe\u6807\u5e93\u91cd\u8bd5\u5931\u8d25: " + errMsg); + return null; + } + } catch(eRetry) { + return null; + } } var selectedName = currentName;