launcher: 进设置页不再同步跑串行网络 popen 与逐套字体 sha256(点设置卡≥5s 修复)

- 设置页入口 s_net_sync_from_sys() 改为 toggle 同步(快)+异步 s_net_refresh_kick();
  wifi/bt 状态与列表由 run_settings_page 主循环逐步骤 s_net_refresh_pump() 填充
  (每步一个带超时 popen、~150ms 一步),draw 用 g_net_* 缓存,数据变化即 need_paint
  → 入口不再被 wpa_cli/bluetoothctl/hcitool 5 条串行 popen(各 1.2~2.5s 有界超时)拖住。
- 进设置页字体重扫 meow_font_scan_presets(0) 跳过逐套 sha256(gbk/full 套数 MB,
  逐套双 sha256 真机耗数秒,入口卡顿主因之一);完整性校验保留给启动/热插拔全量(verify=1)。
- s_net_refresh() 保留同步语义(kick+drain) 供通知中心等调用方;WiFi/BT 子页返回、
  网络下拉后改 kick(由主循环承担异步填充)。
- 设置入口加毫秒级分段日志(font rescan / net toggle-sync+kick / page shown)供真机取证。
- 交叉 -Wall -Wextra 0 warning;launcher 宿主测试全 PASS。launcher md5 fbc78c62
This commit is contained in:
AskaEth committed 2026-09-02 03:18:36 +08:00
1 parent 0294553096
commit 41427fdcb3
6 files changed
+102 -46

No files matched your search

+23 -17
View File
@@ -474,7 +474,7 @@ static void font_tier_marker(const char *charset, int glyph_count, char *out, in
* 输出:label=显示名 `<name> <Weight>(common≈4k)`(如 `MiSans Regular(common≈4k)`);
* charset/glyph_count=档位信息;wtout=weight slug(缺省 "regular")。 */
static int meow_font_probe_weight(const char *dirpath, const char *family, const char *weight,
const char *tier_dir,
const char *tier_dir, int verify_sha,
char *label, int llen,
char *charset, int clen, int *glyph_count,
char *wtout, int wtlen, char *nameout, int namelen)
@@ -506,16 +506,20 @@ static int meow_font_probe_weight(const char *dirpath, const char *family, const
snprintf(label, llen, "%s %s(%s)", name[0] ? name : family, wd, marker);
if (charset) snprintf(charset, clen, "%s", tier);
if (glyph_count) *glyph_count = gc;
/* 完整性校验:仅 WARN,不硬失败;该套仍标记可选。 */
char apng[80] = "", aidx[80] = "";
if (font_sha256_file(ppath, apng, sizeof apng) != 0)
logmsg("fonts: '%s/%s%s%s' sha256(png) 不可用,跳过校验", family, wt, tsep, tiernm);
else if (jsha_png[0] && !font_sha_eq(apng, jsha_png))
logmsg("fonts: '%s/%s%s%s' WARN sha256_png 不匹配(仍可选)", family, wt, tsep, tiernm);
if (font_sha256_file(ipath, aidx, sizeof aidx) != 0)
logmsg("fonts: '%s/%s%s%s' sha256(idx) 不可用,跳过校验", family, wt, tsep, tiernm);
else if (jsha_idx[0] && !font_sha_eq(aidx, jsha_idx))
logmsg("fonts: '%s/%s%s%s' WARN sha256_idx 不匹配(仍可选)", family, wt, tsep, tiernm);
/* 完整性校验:仅 WARN,不硬失败;该套仍标记可选。
* M3:verify_sha=0(进设置页重扫)跳过逐套 sha256sum(gbk/full 套数 MB,逐套双 sha256
* 真机耗数秒,入口卡顿主因之一);完整性校验保留给启动全量扫描(verify_sha=1)。 */
if (verify_sha) {
char apng[80] = "", aidx[80] = "";
if (font_sha256_file(ppath, apng, sizeof apng) != 0)
logmsg("fonts: '%s/%s%s%s' sha256(png) 不可用,跳过校验", family, wt, tsep, tiernm);
else if (jsha_png[0] && !font_sha_eq(apng, jsha_png))
logmsg("fonts: '%s/%s%s%s' WARN sha256_png 不匹配(仍可选)", family, wt, tsep, tiernm);
if (font_sha256_file(ipath, aidx, sizeof aidx) != 0)
logmsg("fonts: '%s/%s%s%s' sha256(idx) 不可用,跳过校验", family, wt, tsep, tiernm);
else if (jsha_idx[0] && !font_sha_eq(aidx, jsha_idx))
logmsg("fonts: '%s/%s%s%s' WARN sha256_idx 不匹配(仍可选)", family, wt, tsep, tiernm);
}
logmsg("fonts: add '%s/%s%s%s' (%s) tier=%s glyph_count=%d", family, wt, tsep, tiernm, label, tier, gc);
return 1;
}
@@ -637,7 +641,7 @@ static int font_presets_add(const char *family, const char *weight, const char *
* 选库)与 meow_font_reload_multifont 在运行期持续读 font_presets_n,清空会造成大字库
* 档位退化(red line「保持档位/多字体行为」)。如需「零驻留」,须把这几个核心路径改为
* 直接读 index(较大重构,超出本批边界,留待后续)。 */
void meow_font_scan_presets_root(const char *card_root)
void meow_font_scan_presets_root(const char *card_root, int verify_sha)
{
font_presets_n = 0;
font_presets[0] = "MeowOS/fonts/default/regular/font.png"; /* 默认字库 = MeowOS/fonts/default/regular */
@@ -684,7 +688,7 @@ void meow_font_scan_presets_root(const char *card_root)
char label[96] = "", cs[8] = ""; int gc = 0; char wt[32] = "", nm[64] = "";
if (access(pngcheck, R_OK) == 0) {
/* 两级(旧结构向后兼容):<family>/<weight>/font.png,tier 读 font.json charset。 */
if (meow_font_probe_weight(dirpath, de->d_name, we->d_name, NULL,
if (meow_font_probe_weight(dirpath, de->d_name, we->d_name, NULL, verify_sha,
label, sizeof label, cs, sizeof cs, &gc,
wt, sizeof wt, nm, sizeof nm) == 0)
continue; /* 缺组件/损坏 → 跳过该套 */
@@ -702,7 +706,7 @@ void meow_font_scan_presets_root(const char *card_root)
strcmp(te->d_name, "full")) continue;
char tpath[420];
snprintf(tpath, sizeof tpath, "%s/%s", dirpath, te->d_name);
if (meow_font_probe_weight(tpath, de->d_name, we->d_name, te->d_name,
if (meow_font_probe_weight(tpath, de->d_name, we->d_name, te->d_name, verify_sha,
label, sizeof label, cs, sizeof cs, &gc,
wt, sizeof wt, nm, sizeof nm) == 0)
continue; /* 缺组件/损坏 → 跳过该 tier 套 */
@@ -728,10 +732,12 @@ void meow_font_scan_presets_root(const char *card_root)
}
/* 设备默认卡根扫描(等价现状:无卡时 opendir 失败 → 仅默认字体)。 */
void meow_font_scan_presets(void)
/* 设备默认卡根扫描(等价现状:无卡时 opendir 失败 → 仅默认字体)。
* verify_sha=1:启动/热插拔全量扫描(含逐套 sha256 完整性校验)。
* verify_sha=0:进设置页重扫(只枚举+读 font.json+落 index,跳过 sha256 —— 入口不许卡数秒)。 */
void meow_font_scan_presets(int verify_sha)
{
meow_font_scan_presets_root("/usr/data/mnt/sd_0");
meow_font_scan_presets_root("/usr/data/mnt/sd_0", verify_sha);
}