这次问题发生在 2018 年的 Ionic/Cordova 工程,Android 平台版本为 6.2.0。接入推送后构建失败,Java 编译日志指向 FileTransfer:
package org.apache.cordova.file does not exist
cannot find symbol: FileUtils
错误出现在 file-transfer 的代码里,缺的却是 file 插件提供的类。只修改 import 并不能补上缺失依赖。
安装日志已经留下了线索
回看此前的插件安装过程,可以找到:
Plugin doesn't support this project's cordova-android version.
cordova-android: 6.2.0, failed version requirement: >=6.3.0
Skipping 'cordova-plugin-file' for android
这表示当时解析到的依赖要求 Android 平台至少为 6.3.0,而工程是 6.2.0,因此 file 插件被跳过。安装流程没有整体报错退出,并不意味着每个平台的插件都安装完整。
当时采用的处理
该项目移除了 file-transfer,再安装历史版本 1.6.3,随后构建成功。对应操作记录为:
cordova plugin remove cordova-plugin-file-transfer
cordova plugin add cordova-plugin-file-transfer@1.6.3
以上仅用于说明当时的变更,不是当前项目的安装建议。不能因为构建发生在接入推送之后,就断定推送插件本身破坏了 FileUtils;也不能把一次成功组合当作通用兼容矩阵。
同类错误怎样定位
先保存平台和插件清单:
cordova platform ls
cordova plugin ls
再逐层确认:缺失类由哪个插件提供,该插件有没有进入 Android 平台,安装时是否被版本检查跳过,依赖声明与锁定结果是否一致。
处理时应在版本控制和备份下比较升级平台与采用兼容依赖的方案,并重新验证整个应用。不要直接往生成的 Java 文件里补类,也不要为消除一条编译错误盲目降低安全相关依赖版本。