前提
Cordova Android 7.0.0 开始改变了项目安卓平台的架构。新建一个空项目分别添加 Android 6.4.0 和 Android 7.0.0 平台:
cordova platform add android@6.4.0
cordova platform add android@7.0.0
生成的安卓平台结构分别为:
可以看到 Cordova 从 7.0.0 项目结构开始和原生 Android 项目保持一致:
- 将 AndroidManifest.xml,assets,res,libs 资源目录整合到 src 目录下
- 将 src 放入一个 app 模块,app 模块由单独的 gradle 文件配置
导致的问题
因为项目结构的改变,很多插件也开始修改集成方式以支持 7.0.0 的使用,并在此基础上进行插件更新操作。
而很多针对低版本开发的项目比如 Cordova-Android 6.4.0,如果无法直接升级项目版本,只能选择集成老版本的插件,得不到最新支持。
解决办法
我们已经知道了 7.0.0 开始结构的主要变化,而低版本和高版本的插件集成无非就是拷贝文件的路径不同罢了,核心代码使用都是同一套。
所以低版本项目想要集成只支持 7.0.0 的新版插件,只要导入插件后,将插件对应文件还原到低版本对应路径便可。
举例
示例插件
这里以 jpush-phonegap-plugin为例,这是极光推送官方支持的 PhoneGap/Cordova 插件,插件从 v3.4.0 开始支持 cordova-android 7.0.0。
集成
我们要在低版本的项目集成此插件该怎么做:
- 老版本插件符合要求,直接集成 v3.4.0 以下的插件版本。
- 需要集成最新的功能,集成最新版本,自己手动配置。
第一种就不说了,我们直接进行第二种方式集成:
- 以我们最开始 Cordova-Android 6.4.0 的空项目为例,并使用官方 sample 作为测试依据
- 通过 Cordova Plugins 安装
cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_jpush_appkey
-
导入最新插件后我们再看项目结构,多出了两个目录,这就是新插件
-
这时如果我们直接跑 sample,无法获取到 registrationID,而且原生 log 中抛出 ClassNotFoundException 错误,无法成功集成推送
-
接下来我们还原插件文件对应低版本路径:
- 将 android/app/src/main/java 下的 cn.jiguang.* 拷贝到 android/src/ 目录下
- 将 android/jniLibs 下的所有文件拷贝到 android/libs/ 目录下
-
删除 android/app 和 android/jniLibs 目录
-
再次编译运行成功获取 registrationID,并且能够成功接收推送,完美。
此例适用所有极光 Cordova 插件,比如 jmessage-phonegap-plugin,cordova-plugin-janalytics
总结
- Cordova Android 7.0.0 结构调整主要体现在资源文件和 src 目录,目录结构开始贴近原生。
- Cordova Android 7.0.0 以下版本集成最新插件只需将插件对应文件还原到低版本对应路径便可。
- 同理,如果项目是 7.0.0 往上的,而插件还没针对 7.0.0 进行升级,又需要在项目中使用插件怎么办?是否可以根据这篇文章反其道行之呢?留给读者去验证
补充
为何文中 JniLibs 文件要拷贝到 libs 下呢?
-
因为 Cordova Android 7.0.0 以下的版本在根目录 build.gradle 中配置了JniLibs 引用路径为 libs。
推荐阅读:
Android 如何修改编译 Java 源文件的 JDK 版本 原生和 Cordova 为例
React Native,Cordova 小PK!