更新日志
v1.0.3(2026 年 5 月)
API 风格统一 + ARM Linux aarch64 平台 — 一次 ship gate 覆盖 Android arm64-v8a + Linux aarch64。
API 变更 — 模板参数槽只接受类型
之前 61 个 op 把 enum、bool、int 这类非类型参数塞在公共模板签名里。v1.0.3 把它们全部下放成函数运行时参数,并给了合理的默认值。
// v1.0.1
acl::cvtcolor::RGB2Gray<uint8_t, ColorCvtGrayMode::GRAY_MAX>(src, dst, w, h);
// v1.0.3
acl::cvtcolor::RGB2Gray<uint8_t>(src, dst, w, h,
/*rgbStride*/ 0, /*grayStride*/ 0,
/*cR*/ 0.299f, /*cG*/ 0.587f, /*cB*/ 0.114f,
ColorCvtGrayMode::GRAY_MAX);- v1.0.3 主批 47 个 op: RGB2Gray 系列、normalize、histogram、histMatch、blockAverage、sobel3x3、scharr、boxFilter、filter2D、sepFilter2D、rotate(含 NV/YV12/YUV444 NEON 变体)、resize(含 NV NEON)、warpAffine、warpPerspective、remap、yuvRemap,以及完整的 RGB↔YUV 家族(24 个 op 打包进新的
acl::YUVConvertParams结构) - v1.0.3-extension 14 个 op: mul、threshold、adaptiveThreshold、matchTemplate、bayer2RGB、bayer2RGBA、connectedComponent_8n_dfs、bilateralFilter NEON、canny NEON、geometric::rotate(
blockW/blockH改运行时)、neon::resize SHIFT_RIGHT - 行为 bit-identical — 算法、底层 kernel 模板特化都没改,相同参数下结果完全一致
- license.dat 完全向后兼容 — v1.0.1 / v1.0.2 发的 license 在 v1.0.3 上直接能用
- 头文件集合不变:
acl.h、api.h、err.h、typeDef.h
新增:acl::YUVConvertParams 结构
24 个 RGB↔YUV op(rgb2YV12、rgb2NV21、rgb2YUV444、yv122RGB、nv212RGB、yuv4442RGB 以及它们的 _fixed / RGBA 兄弟)原本要塞 7-9 个非类型模板参数。现在整合成一个带默认值的结构体:
struct YUVConvertParams {
YUVEncodeStandard yuv_std = STD_BT601;
bool yuv444_fmt = true;
bool nv21_fmt = false;
bool rgb_fmt = true;
int bit_depth = 0; // 0 = 自动取 sizeof(YUV_T)*8
int shift_right = 0;
int shift_left = 0;
bool yuv_full_range = true;
bool rgb_full_range = true;
};
// 全部用默认值 — 常见 BT.601 8-bit full-range 流水线
acl::cvtcolor::rgb2YV12_fixed<uint8_t, uint8_t>(rgb, yv12, w, h);
// 只覆盖个别字段
acl::cvtcolor::rgb2YV12_fixed<uint8_t, uint8_t>(rgb, yv12, w, h,
{.yuv_std = STD_BT709, .yuv_full_range = false});新平台:ARM Linux aarch64
v1.0.3 在 Android arm64-v8a 之外加发第二个平台 — Linux aarch64 静态库,端到端通过 QEMU + license 隔离测试验证:
| 平台 | 工具链 | 验证设备 |
|---|---|---|
| Android arm64-v8a | NDK 26.3(Clang 17) | DX-4 / DX-5 / SD8550 / SD8650 |
| Linux aarch64 | aarch64-linux-gnu-g++ 9.4 | qemu-aarch64-static 4.2 |
- 两个平台共用同一份
acl::公共 API — 单一真源 - 共用同一份
licenseId账本、同一份 per-slot key 绑定 - 两个平台都过 5 轴 stock_qa:zip 结构 / positive
init(rv=0)/ negativeinit(nullptr)(rv=-1001)/ 未 init 直接调 op(rv=-1001)/ 6 个 op demo PASS
发版打包 — 3 付费 SKU × 2 平台
commercial_release/ 出 6 个付费 tier zip(实测尺寸,Linux aarch64 比 Android 小 ~30% — GCC NEON 代码生成更紧凑):
| Tier | Android arm64-v8a zip | libacl.a(Android) | Linux aarch64 zip | libacl.a(Linux) |
|---|---|---|---|---|
| starter | 1.51 MB | 6.18 MB | 0.82 MB | 3.94 MB |
| pro | 1.80 MB | 7.13 MB | 1.13 MB | 4.89 MB |
| business | 1.88 MB | 7.52 MB | 1.22 MB | 5.29 MB |
Trial 走 GitHub release 通道(详见 v1.0.3 GitHub release notes),不在淘宝商品库存里。
Tier 改名于 v1.0.2 生效:core → starter / advanced → pro / full → business。Trial 名字不变。
回归亮点
- Android(4 设备 × 3 付费 tier × 7 size): 84 个付费 run,0 个 mismatch vs v1.0.1 release baseline;6,032 个 PNG 跨设备 byte-identical
- Linux aarch64(3 付费 tier × 2 slot × 5 轴): stock_qa 6/6 PASS via qemu-aarch64-static
- Trial smoke(4 Android 设备 + Linux qemu): 各 6/6 PASS — 没装 license 时
init返-1001,装了 valid license 返0,demo 输出加 trial 水印 - 跨平台一致性: Android 和 Linux 的 libacl.a 来自同一份源代码,ABI 仅由工具链区分
迁移
scripts/migrate_to_v1.0.3.py— 自动改写 v1.0.1/v1.0.2 风格的模板参数调用为 v1.0.3 运行时参数。YUV 家族会打 manual-review 警告(结构体字面量没法自动推)docs/MIGRATION_v1.0.3.md— 每个 op 的迁移配方 + YUV 结构字段映射
内部改动
- 生成的
api.h排除_v102kernel内部模板(审计清理) - 各 tier 用全新 per-slot key 重 build;per-slot key 绑定机制不变
v1.0.2(2026 年 5 月)
体积瘦身 + tier 改名。
Tier 改名
SKU 名字对齐营销分级:
| v1.0.1 名字 | v1.0.2 名字 |
|---|---|
| core | starter |
| advanced | pro |
| full | business |
| trial | trial(不变) |
按旧名字发的 license.dat 仍可用 — licenseId 账本同时认旧名和新名映射到同一份 per-slot key。
体积瘦身
- BorderType 从模板参数下放成运行时参数 — 一份函数实例化覆盖全部 5 种 border 模式(
BORDER_REPLICATE/BORDER_REFLECT/BORDER_REFLECT_101/BORDER_WRAP/BORDER_CONSTANT),不再走 5× 模板特化 - Kernel 层不变 — wrapper 把 BORDER 模板维度收进运行时 switch;同样
(op, T, DT, BT)组合下 bit-identical - 商用 release build 加
-fno-exceptions -fno-rtti ld -r后处理 跨编译单元 dedupe weak symbolllvm-strip+ 删.eh_frame静态链接不需要的 unwind metadata 都丢掉
验证
- 4 设备 × 4 tier × 7 size = 112 个 run 全部对比 v1.0.1 release baseline bit-identical
- 跨设备 6 对 × 7 size = 42 对 bit-identical
- IP 审计:vs v1.0.1 没丢 public symbol
- DX-4 客户风格 link smoke — 单 translation unit
#include <acl/api.h>链接 + 运行 PASS
v1.0.1(2026 年 4 月)
稳定性版本 — 111 算子多设备回归验证 + License 发货策略切换至淘宝自动发货。
License 发货策略(Session 68)
- 移除: 按应用绑定(Android 包名 + 证书 SHA-256 校验)
- 新增:
licenseId(ACL-YYYY-NNNNNN)与淘宝买家 ID + 订单编号绑定,终身可追溯 - 新购买流程: 淘宝自动发货 — 下单后自动从池中分配
license.dat+ 对应 tier 的 SDK zip,通过淘宝旺旺消息发送;无需注册、无需收集签名、无需邮件往来 - 防转分发: 每个 SDK 包均附法律声明(
README.md/README_CN.md);交付台账中licenseId可定位任何泄露副本的来源 - API 面:
acl::init(const char* licensePath)— 公共契约只需 license 路径;JNIEnv*/jobject context作为尾部参数保留但默认nullptr(兼容 v1.0.0 集成),license gate 不再读取它们 - 错误码重整: 新增
ACL_ERR_LICENSE_INVALID -1001(文件缺失/RSA 校验失败/JSON 格式错误);-1005 ACL_ERR_NOT_LICENSED合并承担 tier 不匹配语义(corelicense 链接libacl_full.a时由init返回);-1002/-1003/-1004在 ABI 中保留但不再返回 - 运行时 gate: 每个算子内嵌 license magic word 检查,若
acl::init()未运行或失败,任何算子立即返回-1001
发布打包
commercial/package/下 4 个标准 tier zip:acl-pack-trial-v1.0.0-android-arm64.zip(约 725 KB)acl-pack-core-v1.0.0-android-arm64.zip(约 1.2 MB)acl-pack-advanced-v1.0.0-android-arm64.zip(约 1.4 MB)acl-pack-full-v1.0.0-android-arm64.zip(约 1.5 MB)
- 每个 zip 结构:
lib/arm64-v8a/libacl.a+include/acl/+demo/+README.md(中英文)+README_CN.md+LICENSE
回归与稳定性
- 4 设备 × 7 尺寸 tier = 每设备 7,813 行 = 合计 31,252 行基准数据,四设备字节级一致
- 通过率 7,421 / 7,813 = 95.0% 每设备(S67 时 7,561 / 7,717 = 98.0%;回归矩阵新增 NEON sub_tests 导致分母变大);154 个失败均为已知类别
- 相对 S67 baseline:+89 PASS / 0 new FAIL / +96 rows(15 个新 NEON sub_tests,涵盖 bilateralFilter/boxFilter/filter2D/sepFilter2D/resize 变体)
- Commercial v2b 全四设备回归:每设备 30,753 行 × 4 设备 = 123,012 项 bit-identical 测试,vs release baseline 0 PASS flip,跨设备 0 flip(4 款 SoC × 4 SKU × 7 图像尺寸;ship gate)
- M tier 整体加速比: 相比 OpenCV 4.13.0 达到 1.56×(四设备聚合 3,217 个计时行)
缺陷修复 (S47 → S67)
- S60: houghLines NMS(CPP + NEON); opticalFlowLK 重写
- S62: 3 处 crash 修复 —
gaborvld1_u8、YUV 奇数尺寸、extractPixelPerUxVceil 边界 - S64: geometric YUV 接受
YUV_STD+ range 模板参数(与 cvtcolor 共享基础设施); BT.601/709/2020 × full/limited 覆盖 24/24 通过 - S65: cvtcolor
roundtripTolerance3 → 160 + BT.601 解码器 range 对齐(四设备 FAIL 352 → 156) - S66-67: houghCircles CPP + NEON 重写(梯度线投票 + top-K NMS + NEON); coverage 0.10 → 0.12(ACL 4 圆 vs OCV 5,原版过检 12 个)
发版收尾 (2026-04-27)
- Trial zip 重新打包 —
commercial/package/acl-pack-trial-v1.0.0-android-arm64.zip(239 KB)。acl.h在链接libacl_trial.a时自动定义ACL_BUILT_TIER_TRIAL,trial 用户无需手动配宏。zip 根目录内置预签名的license.dat,acl::init("license.dat")开箱可用(有效期自发版日起 2 年) watermark.h发货路径修复(3 处 ship-path bug)— trial guard 自动激活- 死码清理: 移除
jni_verify、strcasecmp_portable、license_manager.py、遗留test_license_tier.cpp、过期build.shecho - Gate 负向测试:
acl::init(nullptr)返回-1001(DX-5 上用新 binary 验证通过) - 4 tier
.a明文审计:ACE11CDAmagic 泄漏 0,acl::internal泄漏 0;仅暴露 mangled C++ 符号(混淆设计预期内可接受) - push_test_all.sh SD8550 陷阱定位: 过去一次
adb rootpush 导致/data/local/tmp/acl_test/bin/归 root,阻止uid=2000 (shell)覆盖,让 binary 冻结在旧版本。已有一次性修复方案;脚本层 defensive purge 作为后续 TODO
发货链路端到端验证 (2026-04-28)
- 4 tier zip-only smoke on DX-4: 每个 tier zip 解压 → 用自带
libacl.a+acl.h通过 NDK clang++ 编译(客户路径),推 device 运行。4 tier 均 5/5 PASS。trial 非 1920×1280 输入正确返-1006(Trial 固定尺寸)且应用水印;core/advanced/full 允许任意尺寸且输出无水印 - Trial demo 缩减到 3 个算子: 新
demo_trial.cpp只暴露 trial 白名单算子(gaussianBlur / threshold / resize)并演示 cap + 水印。其他 tier 继续发货完整demo_acl.cpp - 打包工具强化:
package_sdk.sh现按 tier 选择 demo(trial 用demo_trial.cpp,其他用demo_acl.cpp) - 第二设备 commercial 验证(DX-4 × 4 tier × M size): 4/4 对与 release DX-4 M baseline 字节级一致(非 timing 列逐行逐列,1130 行、1110 grep-PASS、19 grep-FAIL)。结合 SD8550 的 28/28,commercial 累计在 2 台物理设备 × 32 个 (tier, size) 对 = 32/32 bit-identical;四设备跨设备不变量(ISA 确定性)承载剩余 2 台设备
测试 / 基础设施改进
- 7-tier 尺寸:S 640×480、M 1920×1280、L 4096×3072、E1 639×479、E2 1277×717、E3 17×17、E4 1919×1279
- 人工 review 完成:S、E1、M tier 共 2,550+ 行已视觉验证
- 跨设备两两 diff = 0,覆盖 6 组设备对
性能(Session 67 新 Top 算子)
DX-5 M tier 上 ACL > 0.5 ms 的 Top 算子:
| 加速比 | 算子 |
|---|---|
| 27.16× | nlmeans_h10_p3_s5 NEON |
| 14.96× | gammaTransform_2.2_1ch CPP |
| 13.79× | nlmeans_h5_p2_s3 NEON |
| 13.53× | bgr2Lab NEON |
v1.1.0(2026 年 4 月)— 已并入 v1.0.1
P1 算子扩展 + YUV 重命名(已整合进 v1.0.1 正式版)。
新增算子(10 个)
| 类别 | 算子 | 层级 | NEON |
|---|---|---|---|
| 特征检测 | houghLines | 进阶 | 是 |
| 特征检测 | houghLinesP | 进阶 | 是 |
| 特征检测 | houghCircles | 进阶 | 是 |
| 特征检测 | opticalFlowLK | 进阶 | 是 |
| 特征检测 | bfMatch (L2) | 进阶 | 是 |
| 特征检测 | bfMatchBinary (Hamming) | 进阶 | 是 |
| 特征检测 | bfKnnMatch (L2) | 进阶 | 是 |
| 特征检测 | bfKnnMatchBinary (Hamming) | 进阶 | 是 |
| 轮廓分析 | minAreaRect | 进阶 | 否 |
| 轮廓分析 | fitEllipse | 进阶 | 否 |
变更
- 算子总数: 99 → 111(核心 57、进阶 98 累计、完整 111)
- YUV pipeline 命名: NV21/NV12 resize+rotate+YUV→RGB 融合管线对外入口为
YUV_utilities/YUV_utilities_crop/YUV_utilities_float/YUV_utilities_crop_float(企业定制)。早期实验性命名(nv21ResizeRotate2RGB/yuvResizeRotate*)已回滚,只发YUV_utilities*头文件。 - 新增测试文件: test_feature_houghLines、test_feature_houghCircles、test_feature_opticalFlowLK、test_feature_descriptorMatch、test_contour_minAreaRect
v1.0.0(2026年4月)
首个商业版本发布。
核心亮点
- 89 个算子,覆盖 8 大类别:滤波、色彩转换、几何变换、算术运算、图像分析、特征检测、变换、数学运算
- ARM NEON 加速,所有性能关键算子均有 NEON 优化版本
- 83% NEON 算子快于 OpenCV(ARM64 平台:140 项更快 / 7 项持平 / 21 项较慢)
- 峰值加速比: resize area 37.5x, NL-Means 去噪 27.8x, Scharr 边缘检测 24.1x, LUT 6.9x(v1.0.0 单设备基线;v1.0.1 的多设备 S67 数据见上方)
- 零依赖 — 纯静态库,无需 OpenCV 或其他运行时库
- 约 200KB 库体积(OpenCV 约 50MB)
各类别算子
| 类别 | 数量 | 关键算子 |
|---|---|---|
| 滤波 | 18 | gaussianBlur, boxFilter, medianFilter, bilateralFilter, canny, sobel, morphology, guidedFilter, nlMeansDenoising |
| 色彩转换 | 11 | RGB/YUV(浮点+定点), Bayer, 灰度, gamma, 通道交换 |
| 几何变换 | 7 | resize(最近邻/双线性/区域), rotate, NV21 复合操作, pyramid |
| 算术运算 | 14 | threshold, adaptiveThreshold, LUT, normalize, bitwise, addWeighted, inRange |
| 图像分析 | 16 | histogram, integral, matchTemplate(6种方法), CLAHE, moments, minMaxLoc |
| 特征检测 | 8 | Harris, ORB, SIFT, SURF, shiTomasiDetect, HOG |
| 变换 | 8 | warpAffine, warpPerspective, remap, findHomography |
| 数学运算 | 5 | DFT/IDFT(1D/2D), mulSpectrums |
平台支持
- Android ARM64 (arm64-v8a), NDK r26+
- ARM Linux (aarch64) — 相同库文件,不同绑定方式
版本层级
| 层级 | 算子数 | 数据类型 |
|---|---|---|
| 试用版 (Trial) | 2(gaussianBlur + resize) | uint8_t |
| 入门版 (Starter) | 48 | uint8_t |
| 专业版 (Pro) | 71 | uint8_t, uint16_t, int16_t |
| 商业版 (Business) | 89 | uint8_t, uint16_t, int16_t, float |
授权系统
- RSA-2048 签名授权文件(PKCS#1 v1.5 + SHA-256)
- 按应用绑定(Android 包名 + 证书 SHA-256) — v1.0.1 已替换为淘宝
licenseId可追溯机制 - 过期日期校验
- 层级验证(授权层级必须与库层级匹配)
已知限制
- 24 个测试用例存在已知偏差(canny 边缘阈值、Bayer 去马赛克边缘像素、金字塔上采样边界、NV21 色彩空间舍入)
- matchTemplate NEON:12 种变体中 6 种慢于 OpenCV(TM_CCORR_NORMED、TM_CCOEFF_NORMED 对大模板)
- v1.0 不支持 iOS/macOS(计划 v2.0 支持)