背景:
这段时间在维护一个Cordova混合项目,以前稍微接触过Cordova,也写过简单的纯纯的Cordova的Demo,但是没有尝试过混合原生的Cordova。
在接到项目后比较了一下项目架构和Cordova的结构,发现其中的差别还是不少,主要差别就在项目是通过原生的Activity去启动CordovaActivity的。经验告诉我:这个Cordova被嵌入了原生当中,这货是个混合App。
由于自己之前没有这样玩过,所以就开始从头学习一下如何去将Cordova嵌入原生做一个最简单的混合App,从简单开始,慢慢迭加。
下面进入正题:
1、 就Android、Cordova的开发环境而言我这里不再详述。
2、确认好环境后,首先建立一个Cordova项目(这个项目只是为了给正式的原生项目提供必要一些必要资源的临时项目),并添加Android平台再编译。指令如下:
$ cordova create CordovaProject
$ cd CordovaProject
$ cordova platform add android
$ cordova build
3、然后使用Android Studio将上述项目中的Android平台所对应的子项目(Cordova\CordovaProject\platforms\android)打开,此时系统会无法正常编译,但是我们可以修改gradle和相关配置文件解决这以问题,然后项目就能正常编译了。
3-1、修改文件gradle-wrapper.properties中的distributionUrl为:distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
3-2、修改build.gradle中的classpath为:
buildscript { repositories { jcenter() maven { url "https://maven.google.com" } } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' } }
3-3、错误:Error:(262, 0) Could not find method implementation() for arguments *****
将gradle中对应的implementation换成compile
3-4、修改相关的js的Builder文件:
1、platforms\android\cordova\lib\builders\StudioBuilder.js:将gradle的zip的版本改为3.3(gradle-3.3-all.zip),将所有的implement替换为compile
2、platforms\android\cordova\lib\builders\GradleBuilder.js:改动同上
4、通过编译后再使用Gradle工具构造我们需要的jar包。
具体步骤:点击Android Studio右方的Gradle工具图标,找到CordovaLib->Tasks->build->assembleRelease,双击。
进入CordovaProject\platforms\android\CordovaLib\build\outputs\aar目录,解压其中的CordovaLib-release.aar文件,得到class.jar,这就是我们需要的jar包,将class.jar改为:cordova-8.0.0.jar。
5、新建一个Android原生项目,项目名为:MyAndroid。将上一步的jar包导入此项目,关于Android Studio中怎样导入第三方jar包的具体操作本文不做介绍。
6、拷贝assets文件。
具体操作:将临时Cordova项目(第2步中建立的项目)中的Android的assets文件(CordovaProject\platforms\android\app\src\main\assets),放入最终项目(第5步建立的项目)对应的目录中(MyAndroid\app\src\main)中。
7、拷贝org文件。
具体操作:将临时Cordova项目(第2步中建立的项目)中的Android的org文件(CordovaProject\platforms\android\app\src\main\java\org),放入最终项目(第5步建立的项目)对应的目录中(MyAndroid\app\src\main\java)中。
8、拷贝config.xml文件。
具体操作:将CordovaProject\platforms\android\app\src\main\res\xml\config.xml拷贝至MyAndroid\app\src\main\res\xml
9、将MainActivity.java改为继承CordovaActivity.java,通过loadUrl(launchUrl)加载html页面。(当然,你也可以选择使用其他的Activity继承CordovaActivity来达到混合目的)。
10、然后编译运行,你将看到如下错误:
Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
解决方案:修改build.gradle(Module: app)中的defaultConfig,在其中加入jack允许:
...
defaultConfig {
...
jackOptions {
enabled true
}
}
11、然后,运行成功。