feat: publish Android 1.0.1 candidate source and acceptance evidence
This commit is contained in:
@@ -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 |
@@ -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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user