feat: publish Android 1.0.1 candidate source and acceptance evidence

This commit is contained in:
UCVL Software Automation
2026-09-03 11:07:02 +08:00
commit 0a8bdc9fff
971 changed files with 184984 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
# Android 1.0.1 候选验收 · 2026-09-03
## 已通过
- Release 编译、静态关键检查、26 项 JVM 单元测试(0 失败)。
- 使用准备公开的独立源码副本,重新从上游下载并校验全部 AAR/JNI;在无原目录构建输出的情况下编译成功,26 项单测通过。JDK 21、SDK 37、Gradle 9.4.1,Windows ASCII 路径。
- API 35 / x86_64 模拟器安装原版 1.0.0 → 同证书覆盖通用 1.0.1;加密令牌、设备 ID、登录名均保留。使用合成测试令牌,不是员工密码。测试后清除。
- 登录字段、空表单校验、新用户注册入口、开源许可入口可见。修正 Android 15 状态栏遮挡;`login-1.0.1.png` 为实际模拟器截图。
- 打包的原生内核对 VPN001/002/003、智能/全局模式六组测试通过:Google 204、OpenAI/Codex 未认证接口 401、proxy 计数大于 0。401 表示未登录请求被服务正常拒绝,不表示真实账号任务成功。
- 实际 VpnService + HEV 接管独立测试 App(不同 UID、没有显式 HTTP/SOCKS 代理);智能/全局均显示系统 TRANSPORT_VPN,Google/OpenAI/Codex 及公司平台 HTTP 返回预期状态。
- 点击“断开并退出”,等待后台服务停止,独立 App 的 TRANSPORT_VPN 消失,公司平台继续可访问。
- 临时平台会话撤销后,主界面不在前台,VPN daemon 60 秒轮询停止 VPN、清除加密令牌;在测试框架退出前已验证系统 VPN 消失。
- 修复真实回归:Activity.onDestroy 同步关闭 TLS socket 导致 NetworkOnMainThreadException;清理改为独立后台线程。
## 边界与未完成项
- 没有实体 Android 手机;ARM/ARM64/x86 架构为编译和签名校验,不是各架构实体机测试。
- 没有真实 ChatGPT/Codex 登录任务、长期移动网络/休眠/热点切换测试。不能将 API 401 当成登录验收。
- 本候选尚未实现未知目标失败学习全闭环、连接中故障自动换节点、应用内版本下载/升级流程。因此不是 Windows 全功能等价版,不进入全员正式版通知。
- 退出后原网络不保证直连海外服务;验收要求是恢复测试前的路由状态和本地平台访问,不是退出代理后仍能访问所有海外网站。
- 本轮未改变 Windows 主机的 VPN、DNS、路由、Clash 或公司生产节点配置。测试会话均撤销,临时配置从模拟器和本机临时目录移除。
## 文件
- `native-nodes-1.0.1.json`:原生内核六组结果。
- `system-vpn-1.0.1.json`:独立 UID、退出、后台回收结果。
- `system-vpn-before-close-fix.json`:保留修复前真实失败,不掩盖回归。
- `upgrade-1.0.1.json`:通用 APK SHA256、覆盖升级结果。
- `public-source-scan.json`:公开源码敏感信息排除记录。
通用 APK:64,220,208 字节;SHA256 `87747619f838f432c94c90785e6523bf5a9e82bb3a138b47ba3c9e293e172d45`。
Android APK 使用公司原签名证书;证书 SHA256 `0f1a09870d6ee1e73b62138f99463e7066f4228ce28b7f16ff0aeccca59ea14f`。签名私钥不公开。
Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

+78
View File
@@ -0,0 +1,78 @@
{
"timestamp": "2026-09-03T10:40:44.937013+08:00",
"scope": "Android packaged native core, explicit HTTP proxy, public DNS/NPM/VLESS/egress",
"host_network_changed": false,
"full_vpn_service_tested": false,
"authenticated_codex_task_tested": false,
"results": [
{
"node": "VPN002",
"mode": "smart",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 25016
},
{
"node": "VPN002",
"mode": "global",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 38464
},
{
"node": "VPN001",
"mode": "smart",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 25965
},
{
"node": "VPN001",
"mode": "global",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 40268
},
{
"node": "VPN003",
"mode": "smart",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 25830
},
{
"node": "VPN003",
"mode": "global",
"pass": true,
"http_statuses": [
204,
401,
401
],
"proxy_bytes": 41800
}
],
"passed": 6,
"total": 6,
"instrumentation_passed": true
}
+37
View File
@@ -0,0 +1,37 @@
{
"files_scanned": 968,
"known_credentials_found": false,
"private_keys_found": false,
"private_server_source_included": false,
"upstream_history_copied": false,
"source_snapshots": [
{
"path": ".",
"upstream_commit": "39d2513df157047f3acfc1d85f3ea18197e7b98d"
},
{
"path": "AndroidLibXrayLite",
"upstream_commit": "4c3a3cd051ac6a10d27ba1347a05fff2697ea272"
},
{
"path": "hev-socks5-tunnel",
"upstream_commit": "dfabaa9cadf8894eb8ebfa0f75b1fee331869b34"
},
{
"path": "hev-socks5-tunnel/src/core",
"upstream_commit": "4be2e621813ba0315cfacd995bf501bde91d6996"
},
{
"path": "hev-socks5-tunnel/third-part/hev-task-system",
"upstream_commit": "8d83bbbf79557138726c8ee5a5fae99cbb978d61"
},
{
"path": "hev-socks5-tunnel/third-part/lwip",
"upstream_commit": "8c69dfbe537835d5f2a5fd8c08c859f667b108ea"
},
{
"path": "hev-socks5-tunnel/third-part/yaml",
"upstream_commit": "efa36117a8646d26d12b58e05bac472d7854a70d"
}
]
}
+14
View File
@@ -0,0 +1,14 @@
{
"date": "2026-09-03",
"source": "independent sanitized Android publication snapshot",
"dependencies_downloaded_again": true,
"aar_and_jni_sha256_verified": true,
"clean_release_build": true,
"jvm_tests": 26,
"failures": 0,
"errors": 0,
"apk_contents_compared": true,
"different_zip_entries": [],
"host_network_changed": false,
"note": "Unsigned APK entries compared before signing; this does not assert identical ZIP container metadata or third-party reproducibility on every environment."
}
+151
View File
@@ -0,0 +1,151 @@
{
"timestamp": "2026-09-03T11:03:38.116633+08:00",
"host_network_changed": false,
"separate_uid_no_explicit_proxy": true,
"physical_android_device_tested": false,
"results": [
{
"mode": "smart",
"connected_probe": {
"transport_vpn": true,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"status": 204,
"pass": true
},
{
"target": "api.openai.com",
"status": 401,
"pass": true
},
{
"target": "chatgpt.com",
"status": 401,
"pass": true
},
{
"target": "vpn.toplc.cn",
"status": 200,
"pass": true
}
]
},
"after_exit_probe": {
"transport_vpn": false,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"status": 204,
"pass": true
},
{
"target": "api.openai.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "chatgpt.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "vpn.toplc.cn",
"status": 200,
"pass": true
}
]
}
},
{
"mode": "global",
"connected_probe": {
"transport_vpn": true,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"status": 204,
"pass": true
},
{
"target": "api.openai.com",
"status": 401,
"pass": true
},
{
"target": "chatgpt.com",
"status": 401,
"pass": true
},
{
"target": "vpn.toplc.cn",
"status": 200,
"pass": true
}
]
},
"after_revocation_probe": {
"transport_vpn": false,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"status": 204,
"pass": true
},
{
"target": "api.openai.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "chatgpt.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "vpn.toplc.cn",
"status": 200,
"pass": true
}
]
},
"background_revocation_pass": true
}
],
"pass": true,
"baseline": {
"transport_vpn": false,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "api.openai.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "chatgpt.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "vpn.toplc.cn",
"status": 200,
"pass": true
}
]
}
}
@@ -0,0 +1,31 @@
{
"timestamp": "2026-09-03T10:45:25.110065+08:00",
"host_network_changed": false,
"separate_uid_no_explicit_proxy": true,
"physical_android_device_tested": false,
"results": [],
"pass": false,
"baseline": {
"transport_vpn": false,
"uid": 10150,
"explicit_proxy": false,
"results": [
{
"target": "www.google.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "api.openai.com",
"pass": false,
"error_type": "ConnectException"
},
{
"target": "chatgpt.com",
"pass": false,
"error_type": "ConnectException"
}
]
},
"error": "Instrumentation failed: s.NetworkOnMainThreadException\n\tat android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1692)\n\tat com.android.org.conscrypt.Platform.blockGuardOnNetwork(Platform.java:408)\n\tat com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.writeInternal(ConscryptEngineSocket.java:704)\n\tat com.android.org.conscrypt.ConscryptEngineSocket$SSLOutputStream.-$$Nest$mwriteInternal(Unknown Source:0)\n\tat com.android.org.conscrypt.ConscryptEngineSocket.drainOutgoingQueue(ConscryptEngineSocket.java:632)\n\tat com.android.org.conscrypt.ConscryptEngineSocket.close(ConscryptEngineSocket.java:539)\n\tat okhttp3.internal._UtilJvmKt.closeQuietly(-UtilJvm.kt:278)\n\tat okhttp3.internal.connection.RealConnectionPool.evictAll(RealConnectionPool.kt:167)\n\tat okhttp3.ConnectionPool.evictAll(ConnectionPool.kt:93)\n\tat com.v2ray.ang.ucvl.UcvlApiClient.close(UcvlApiClient.kt:103)\n\tat com.v2ray.ang.ucvl.UcvlMainActivity.onDestroy(UcvlMainActivity.kt:468)\n\tat android.app.Activity.performDestroy(Activity.java:9293)\n\tat android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1561)\n\tat androidx.test.runner.MonitoringInstrumentation.callActivityOnDestroy(MonitoringInstrumentation.java:753)\n\tat android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5950)\n\tat android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5995)\n\tat android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:46)\n\tat android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60)\n\tat android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:225)\n\tat android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:107)\n\tat android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:81)\n\tat android.app.ActivityThread$H.handleMessage(ActivityThread.java:2636)\n\tat android.os.Handler.dispatchMessage(Handler.java:107)\n\tat android.os.Looper.loopOnce(Looper.java:232)\n\tat android.os.Looper.loop(Looper.java:317)\n\tat android.app.ActivityThread.main(ActivityThread.java:8705)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)\n\nINSTRUMENTATION_STATUS: test=connectFromDashboard\nINSTRUMENTATION_STATUS_CODE: -2\nINSTRUMENTATION_RESULT: shortMsg=Process crashed.\nINSTRUMENTATION_CODE: 0\n"
}
+16
View File
@@ -0,0 +1,16 @@
{
"timestamp": "2026-09-03T10:58:13.337134+08:00",
"platform": "API 35 x86_64 emulator",
"old_version": "1.0.0",
"new_version": "1.0.1",
"same_certificate_cover_install": true,
"encrypted_session_preserved": true,
"device_id_preserved": true,
"login_name_preserved": true,
"login_ui_pass": true,
"empty_form_validation_pass": true,
"synthetic_fixture_cleared": true,
"physical_device_tested": false,
"sha256": "87747619f838f432c94c90785e6523bf5a9e82bb3a138b47ba3c9e293e172d45",
"size": 64220208
}