Skip to content

更新日志

v1.0.3(2026 年 5 月)

API 风格统一 + ARM Linux aarch64 平台 — 一次 ship gate 覆盖 Android arm64-v8a + Linux aarch64。

API 变更 — 模板参数槽只接受类型

之前 61 个 op 把 enumboolint 这类非类型参数塞在公共模板签名里。v1.0.3 把它们全部下放成函数运行时参数,并给了合理的默认值。

cpp
// 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.hapi.herr.htypeDef.h

新增:acl::YUVConvertParams 结构

24 个 RGB↔YUV op(rgb2YV12、rgb2NV21、rgb2YUV444、yv122RGB、nv212RGB、yuv4442RGB 以及它们的 _fixed / RGBA 兄弟)原本要塞 7-9 个非类型模板参数。现在整合成一个带默认值的结构体:

cpp
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-v8aNDK 26.3(Clang 17)DX-4 / DX-5 / SD8550 / SD8650
Linux aarch64aarch64-linux-gnu-g++ 9.4qemu-aarch64-static 4.2
  • 两个平台共用同一份 acl:: 公共 API — 单一真源
  • 共用同一份 licenseId 账本、同一份 per-slot key 绑定
  • 两个平台都过 5 轴 stock_qa:zip 结构 / positive init(rv=0)/ negative init(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 代码生成更紧凑):

TierAndroid arm64-v8a ziplibacl.a(Android)Linux aarch64 ziplibacl.a(Linux)
starter1.51 MB6.18 MB0.82 MB3.94 MB
pro1.80 MB7.13 MB1.13 MB4.89 MB
business1.88 MB7.52 MB1.22 MB5.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 名字
corestarter
advancedpro
fullbusiness
trialtrial(不变)

按旧名字发的 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 symbol
  • llvm-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 不匹配语义(core license 链接 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 修复 — gabor vld1_u8、YUV 奇数尺寸、extractPixelPerUxV ceil 边界
  • S64: geometric YUV 接受 YUV_STD + range 模板参数(与 cvtcolor 共享基础设施); BT.601/709/2020 × full/limited 覆盖 24/24 通过
  • S65: cvtcolor roundtripTolerance 3 → 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_verifystrcasecmp_portablelicense_manager.py、遗留 test_license_tier.cpp、过期 build.sh echo
  • Gate 负向测试: acl::init(nullptr) 返回 -1001(DX-5 上用新 binary 验证通过)
  • 4 tier .a 明文审计: ACE11CDA magic 泄漏 0,acl::internal 泄漏 0;仅暴露 mangled C++ 符号(混淆设计预期内可接受)
  • push_test_all.sh SD8550 陷阱定位: 过去一次 adb root push 导致 /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)

各类别算子

类别数量关键算子
滤波18gaussianBlur, boxFilter, medianFilter, bilateralFilter, canny, sobel, morphology, guidedFilter, nlMeansDenoising
色彩转换11RGB/YUV(浮点+定点), Bayer, 灰度, gamma, 通道交换
几何变换7resize(最近邻/双线性/区域), rotate, NV21 复合操作, pyramid
算术运算14threshold, adaptiveThreshold, LUT, normalize, bitwise, addWeighted, inRange
图像分析16histogram, integral, matchTemplate(6种方法), CLAHE, moments, minMaxLoc
特征检测8Harris, ORB, SIFT, SURF, shiTomasiDetect, HOG
变换8warpAffine, warpPerspective, remap, findHomography
数学运算5DFT/IDFT(1D/2D), mulSpectrums

平台支持

  • Android ARM64 (arm64-v8a), NDK r26+
  • ARM Linux (aarch64) — 相同库文件,不同绑定方式

版本层级

层级算子数数据类型
试用版 (Trial)2(gaussianBlur + resize)uint8_t
入门版 (Starter)48uint8_t
专业版 (Pro)71uint8_t, uint16_t, int16_t
商业版 (Business)89uint8_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 支持)