前提
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
生成的安卓平台结构分别为:
image.png
可以看到 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 的新版插件, 只要导入插件后, 将插件对应文件还原到低版本对应路径便可.
举例
示例插件
这里以 https://github.com/jpush/jpush-phonegap-plugin 为例, 这是极光推送 https://www.jiguang.cn/ 官方支持的 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
image.png
导入最新插件后我们再看项目结构, 多出了两个目录, 这就是新插件
image.png
这时如果我们直接跑 sample, 无法获取到 registrationID, 而且原生 log 中抛出 ClassNotFoundException 错误, 无法成功集成推送
image.png
接下来我们还原插件文件对应低版本路径:
将 android/app/src/main/java 下的 cn.jiguang.* 拷贝到 android/src / 目录下
将 android/jniLibs 下的所有文件拷贝到 android/libs / 目录下
删除 android/app 和 android/jniLibs 目录
image.png
再次编译运行成功获取 registrationID, 并且能够成功接收推送, 完美.
image.png
此例适用所有极光 cordova 插件, 比如 https://github.com/jpush/jmessage-phonegap-plugin , https://github.com/jpush/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.
image.png
以上, 谢谢.
来源: http://www.jianshu.com/p/23b117ca27a6