依赖图决定哪些库能单独处理

应用可能直接加载主库,也可能通过主库继续加载其他依赖。第三方 SDK 还可能携带自己的 Native 组件,并依赖特定的导出符号或初始化顺序。

依赖图至少应列出库名、直接与间接依赖、加载入口、初始化时机和调用方。缺少这张图时,对单个 SO 的改动可能在另一个库加载时才暴露问题。

  • 主库与传递依赖
  • 系统库与第三方库
  • 加载入口与初始化顺序
  • 异常出现的最早阶段

JNI 注册方式影响符号处理

静态注册依赖名称约定,动态注册通常在初始化阶段把 Java 方法与 Native 函数绑定。两种方式对符号可见性、重命名和加载时机的约束不同。

在处理导出或函数表示之前,应确认每个关键入口如何注册、是否被反射或第三方组件调用,以及异常时能否在 Java 与 Native 两侧同时定位。

ABI 不是一个可省略的标签

arm64-v8a、armeabi-v7a 与 x86_64 对应不同的指令、链接产物和依赖组合。某个 ABI 构建成功或在模拟器启动,不能证明另一个目标架构可用。

发布前应检查最终 APK 实际包含的 ABI,并在目标架构上验证库解析、应用启动、关键 JNI 调用、异常捕获与第三方 SDK 路径。

  • 最终包包含目标 ABI
  • 所有依赖都能解析
  • 关键 JNI 路径可重复
  • 未覆盖架构被明确记录

保护强度要和装载稳定性一起验收

删除符号、处理字符串或虚拟化关键函数分别减少不同线索,没有一种动作可以单独代表完整 Native 保护。启动初始化和高频函数还需要额外关注性能与故障半径。

稳妥的做法是从少量高价值、输入输出清楚的函数开始,在同一候选包上逐步扩大范围,并为每次配置变化保留可回退版本。

让建议落到真实应用上

提交技术栈、关键路径、目标系统范围和当前候选包,由御盾给出针对性的保护与兼容性验证建议。