diff --git a/.github/release-notes/versions/1.8.3.md b/.github/release-notes/versions/1.8.3.md new file mode 100644 index 0000000..2768829 --- /dev/null +++ b/.github/release-notes/versions/1.8.3.md @@ -0,0 +1,12 @@ +### PVM2 引用与短方法兼容修复 + +- 修复独立方法因对象、数组参数被过度排除的问题。符合条件的引用透传、空值判断和引用身份比较可继续进入 PVM2 转换与产物核验。 +- 修复单条 `return` 方法被旧式原地回填长度检查拦截的问题,覆盖对象、数组和基本类型/宽值参数透传;PVM2 仍须通过完整跳板及加密镜像验证。 +- 细分继承/接口虚方法契约、同步、异常处理区及指令限制,避免把所有兼容排除都显示为生命周期问题。零转换、必保方法未覆盖仍明确失败,跳过项仍计入完整覆盖率。 +- 修复 APK、AAB 和签名任务失败后仍显示“执行中”的进度标题,补齐结束计时和失败步骤标记;明确基础预检通过不代表方法覆盖已通过。 + +### 验证与使用说明 + +- 已完成自建 APK 的加固、签名和产物复核,以及生产 Native 解释器三种 ISA 下 666 次引用语义检查。旧版为零转换的引用样本在修复后验证了 18/21 个方法,3 个构造器明确保留;继承契约负例仍正确失败。 +- 本次未新增 Android 真机回归,宿主 JVM/JNI 测试不能代替 ART 真机验收。没有客户 APK 和方法体时,不能据此保证其具体方法全部兼容。 +- 升级后需要重新加固,已有 APK 不会自动获得本次修复。逐方法报告包含业务标识,分享前请手动脱敏。 diff --git a/Cargo.lock b/Cargo.lock index 75aa77c..1f00c7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2201,7 +2201,7 @@ dependencies = [ [[package]] name = "mocika-shield" -version = "1.8.2" +version = "1.8.3" dependencies = [ "dunce", "reqwest 0.12.28", @@ -2229,7 +2229,7 @@ dependencies = [ [[package]] name = "mocikashield" -version = "1.8.2" +version = "1.8.3" dependencies = [ "cc", "chacha20poly1305", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "shield-cli" -version = "1.8.2" +version = "1.8.3" dependencies = [ "anyhow", "clap", @@ -3653,7 +3653,7 @@ dependencies = [ [[package]] name = "shield-core" -version = "1.8.2" +version = "1.8.3" dependencies = [ "anyhow", "chacha20poly1305", diff --git a/apps/shield-cli/Cargo.toml b/apps/shield-cli/Cargo.toml index beb2cfd..665a553 100644 --- a/apps/shield-cli/Cargo.toml +++ b/apps/shield-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shield-cli" -version = "1.8.2" +version = "1.8.3" edition = "2021" authors = ["MocikaDev"] license = "MIT OR Apache-2.0" diff --git a/apps/shield-gui/package-lock.json b/apps/shield-gui/package-lock.json index 16d9e21..156a019 100644 --- a/apps/shield-gui/package-lock.json +++ b/apps/shield-gui/package-lock.json @@ -1,12 +1,12 @@ { "name": "mocika-shield-gui", - "version": "1.8.2", + "version": "1.8.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mocika-shield-gui", - "version": "1.8.2", + "version": "1.8.3", "license": "MIT OR Apache-2.0", "dependencies": { "@radix-ui/react-dialog": "^1.1.19", diff --git a/apps/shield-gui/package.json b/apps/shield-gui/package.json index dc7867a..40b524f 100644 --- a/apps/shield-gui/package.json +++ b/apps/shield-gui/package.json @@ -1,6 +1,6 @@ { "name": "mocika-shield-gui", - "version": "1.8.2", + "version": "1.8.3", "license": "MIT OR Apache-2.0", "private": true, "type": "module", diff --git a/apps/shield-gui/src-tauri/Cargo.toml b/apps/shield-gui/src-tauri/Cargo.toml index 62104a0..66a7cd9 100644 --- a/apps/shield-gui/src-tauri/Cargo.toml +++ b/apps/shield-gui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mocika-shield" -version = "1.8.2" +version = "1.8.3" edition = "2021" license = "MIT OR Apache-2.0" publish = false diff --git a/apps/shield-gui/src-tauri/tauri.conf.json b/apps/shield-gui/src-tauri/tauri.conf.json index a01932a..99bc4ba 100644 --- a/apps/shield-gui/src-tauri/tauri.conf.json +++ b/apps/shield-gui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Shellsmith", - "version": "1.8.2", + "version": "1.8.3", "identifier": "dev.mocika.shield-gui", "build": { "beforeDevCommand": "npm run dev -- --host 127.0.0.1", diff --git a/apps/shield-gui/src/components/app/protect-progress-panel.tsx b/apps/shield-gui/src/components/app/protect-progress-panel.tsx index 08b947d..ddc31fa 100644 --- a/apps/shield-gui/src/components/app/protect-progress-panel.tsx +++ b/apps/shield-gui/src/components/app/protect-progress-panel.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { Check, Loader2 } from "lucide-react"; +import { Check, CircleX, Loader2 } from "lucide-react"; import { stepLabels } from "@/components/app/branding"; import { t, type Locale } from "@/lib/i18n"; @@ -24,10 +24,10 @@ export function ProtectProgressPanel({ }) { const [tick, refresh] = useState(0); useEffect(() => { - if (!startedAt || finishedAt) return; + if (state !== "running" || !startedAt || finishedAt) return; const timer = window.setInterval(() => refresh((value) => value + 1), 1000); return () => window.clearInterval(timer); - }, [finishedAt, startedAt]); + }, [state, finishedAt, startedAt]); const currentIndex = steps.indexOf(currentStep); const percent = state === "done" ? 100 : currentIndex < 0 ? 0 : Math.min(99, Math.round(((currentIndex + 0.5) / steps.length) * 100)); const elapsed = (() => { @@ -39,7 +39,7 @@ export function ProtectProgressPanel({ return (