当前位置:首页 » 安卓系统 » cordovaforandroid

cordovaforandroid

发布时间: 2023-03-04 14:43:16

Ⅰ ionic3 cordova插件与cordova android版本的兼容性问题

cmdnode -v(检查是否有node,-g表示全局安装,否则要配置环境变量。nodejs在官网下载推荐版recommended for most users)npm install -g cordova ionic(如已安装nodejs,可用npm安装cordova和ionic)(链接不上会报错,重新下载即可,下载太慢可分2步npm install -g cordova 和 npm install -g ionic 下载)

Ⅱ 运行cordova run android时报错,如图所示

g.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78)
at org.gradle.wrapper.Install.createDist(Install.java:47)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:220)
at java.util.zip.ZipFile.(ZipFile.java:150)
at java.util.zip.ZipFile.(ZipFile.java:164)
at org.gradle.wrapper.Install.unzip(Install.java:160)
at org.gradle.wrapper.Install.access$400(Install.java:29)
at org.gradle.wrapper.Install$1.call(Install.java:70)
at org.gradle.wrapper.Install$1.call(Install.java:47)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
... 3 more
E:\cordova\hello\platforms\android\cordova\node_moles\q\q.js:126
throw e;
^
Error code 1 for command: cmd with args: /s /c "E:\cordova\hello\platforms\android\gradlew cdvBuildDebug -b E:\cordova\hello\platforms\android\build.gradle -PcdvBuildArch=arm -Dorg.gradle.daemon=true"
ERROR running one or more of the platforms: Error: E:\cordova\hello\platforms\android\cordova\run.bat: Command failed with exit code 1

Ⅲ crodova怎么直接调用android原生方法

crodova直接调用android原生方法的时候要了解一些东西,你可以看下!我发你看下,
一.总体结构
Cordova的目标是用HTML,JS,来完成手机客户端的开发,并且是只开发一次可以在各种手机平台上跑,所以理想状态是用JS去控制所有事件。Cordova基于WebView组件。每个继承自DroidGap的Activity对应一个独立的CordovaWebView。Cordova提供了一些列的JS接口来访问Android的native。以插件(Plugin)的形式提供自定义接口给JS端访问。
二.一些疑问
1. Cordova框架是如何启动的?
2. 插件是怎么回事?如何工作的。
3. Cordova的官方文档都是说JS如何访问Android的native,那么在Android的native中是否可以访问JS的函数?如何访问?
三.结构解剖
1.Cordova的启动

1) 如何启动

Cordova提供了一个Class(DroidGap)和一个interface(CordovaInterface)来让Android开发者开发Cordova。一般情况下实现DroidGap即可,因为DroidGap类已经做了很多准备工作,可以说DroidGap类是Cordova框架的一个重要部分;如果在必要的情况下实现CordovaInterface接口,那么这个类中很多DroidGap的功能需要自己去实现。

继承了DroidGap或者CordovaInterface的Activity就是一个独立的Cordova模块,独立的Cordova模块指的是每个实现了DroidGap或者CordovaInterface接口的Activity都对应一套独立的WebView,Plugin,PluginManager,没有共享的。(我觉得这样是很不爽的,没有共享,如果plugin和Activity很多的情况下这样是相当的耗资源)

当在实现了DroidGap或者CordovaInterface接口的Activity的onCreate方法中调用DroidGap的loadUrl方法即启动了Cordova框架。

2)启动过程

public class A extends DroidGap{}

a. 在A的onCreate方法中首先调用super. onCreate()

这一步中创建了一个LinearLayout(.class)布局,以及计算这个Layout的大小及显示的一些方式。在后面的过程中会将一个WebView加到这个LinearLayout中。

b. 再次调用DroidGap 的loadUrl()方法

DroidGap. loadUrl()中首先判断A的CordovaWebView是否实例化,如果没有回实例化一个CordovaWebView对象并将该对象添加到父LinearLayout中去,同时将该LinearLayout添加的ContentView。见以下代码:

public void onCreate(Bundle savedInstanceState) {



root = new (this, width, height);



}

public void init() {

CordovaWebView webView = new CordovaWebView(DroidGap.this);

this.init(webView,

new CordovaWebViewClient(this, webView),

new CordovaChromeClient(this, webView));

}

public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) {

this.appView = webView;

this.appView.setId(100);



this.root.addView(this.appView);

setContentView(this.root);

}

public void loadUrl(String url) {

if (this.appView == null) {

this.init();

}



}

这样就完成了我们在一般开发中使用的模式:
public void onCreate(Bundle savedInstanceState) {

super. onCreate(Bundle savedInstanceState);

setContentView(resID);



}

在初始化完CordovaWebView后调用CordovaWebView.loadUrl()。此时完成Cordova的启动。

c. 在实例化CordovaWebView的时候, CordovaWebView对象会去创建一个属于当前CordovaWebView对象的插件管理器PluginManager对象,一个消息队列NativeToJsMessageQueue对象,一个JavascriptInterface对象ExposedJsApi,并将ExposedJsApi对象添加到CordovaWebView中,JavascriptInterface名字为:_cordovaNative。

d. Cordova的JavascriptInterface

在创建ExposedJsApi时需要CordovaWebView的PluginManager对象和NativeToJsMessageQueue对象。因为所有的JS端与Android native代码交互都是通过ExposedJsApi对象的exec方法。

在exec方法中执行PluginManager的exec方法,PluginManager去查找具体的Plugin并实例化然后再执行Plugin的execute方法,并根据同步标识判断是同步返回给JS消息还是异步。由NativeToJsMessageQueue统一管理返回给JS的消息。

e. 何时加载Plugin,如何加载

Cordova在启动每个Activity的时候都会将配置文件中的所有plugin加载到PluginManager。那么是什么时候将这些plugin加载到PluginManager的呢?

在b中说了最后会调用CordovaWebView.loadUrl(),对,就在这个时候会去初始化PluginManager并加载plugin。PluginManager在加载plugin的时候并不是马上实例化plugin对象,而是只是将plugin的Class名字保存到一个hashmap中,用service名字作为key值。

当JS端通过JavascriptInterface接口的ExposedJsApi对象请求Android时,PluginManager会从hashmap中查找到plugin,如果该plugin还未实例化,利用java反射机制实例化该plugin,并执行plugin的execute方法。

2.Cordova插件

在‘1’中已经接触了些Cordova插件的东西,这里总结下Cordova的插件

Cordova插件只是一个普通的java类,没有什么特殊之处。插件中的execute方法只是Cordova框架的一个规定。

Cordova为了方便于插件的管理,所以引进了一个PluginManager来管理插件。在ExposedJsApi中,PluginManager起一个代理作用。

在原生态的WebView开发中,我们可以给WebView添加一个JavascriptInterface对象来使JS可以访问android的代码;在Cordova也有一个这样的对象ExposedJsApi。

在ExposedJsApi中,它将请求转发给我们的PluginManager,这个时候PluginManager会根据给的service的名字来查找具体的Plugin并执行。

所以,我认为Cordova插件是android端的API,提供给JS。

在Cordova虽然有JavascriptInterface对象ExposedJsApi,但在JS端并不是真正通过android提供的window.JavascriptInterface.request这种方式来请求。在JS端,Cordova是通过JS的prompt()函数触发ChromeClient中的onJsPrompt方法,通过onJsPrompt去获取到请求,再将请求转发给ExposedJsApi。

注:在Cordova中,Java端和JavaScript端都准备了代码来使用特殊URL('http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson;)的方式交互请求,但并没有真正使用。

3.Cordova的数据返回

Cordova中通过exec()函数请求android插件,数据的返回可同步也可以异步于exec()函数的请求。

在开发android插件的时候可以重写public boolean isSynch(String action)方法来决定是同步还是异步。

Cordova在android端使用了一个队列(NativeToJsMessageQueue)来专门管理返回给JS的数据。

1)同步

Cordova在执行完exec()后,android会马上返回数据,但不一定就是该次请求的数据,可能是前面某次请求的数据;因为当exec()请求的插件是允许同步返回数据的情况下,Cordova也是从NativeToJsMessageQueue队列头pop头数据并返回。然后再根据callbackID反向查找某个JS请求,并将数据返回给该请求的success函数。

2)异步

Cordova在执行完exec()后并不会同步得到一个返回数据。Cordova在执行exec()的同时启动了一个XMLHttpRequest对象方式或者prompt()函数方式的循环函数来不停的去获取NativeToJsMessageQueue队列中的数据,并根据callbackID反向查找到相对应的JS请求,并将该数据交给success函数。

注:Cordova对本地的HTML文件(file:// 开头的URL)或者手机设置有代理的情况下使用XMLHttpRequest方式获取返回数据,其他则使用prompt()函数方式获取返回数据。

4.Android代码访问JS

翻了Cordova的官方文档和Cordova代码,发现Cordova并未提供一种方式来让我们在Android中去访问JS。现在想来可能是这样的道理(个人观点),因为Cordova框架的性质就是一个用HTML+JS来开发APP的,相当于java用的虚拟机层(比喻不是很恰当),所以Cordova未提供Android访问JS的方式。

如果需要Android访问JS,只有使用原生态WebView开发的方式

loadUrl(“javascript:xxx”)

因为在Cordova框架中需要访问JS的时候也是使用的这种方式,如下(Activity的onResume事件):

public void handleResume(boolean keepRunning, boolean activityResultKeepRunning)

{

// Send resume event to JavaScript

this.loadUrl("javascript:try{cordova.fireDocumentEvent('resume');}catch(e){console.log('exception firing resume event from native');};");

// Forward to plugins

if (this.pluginManager != null) {

this.pluginManager.onResume(keepRunning);

}

// Resume JavaScript timers (including setInterval)

this.resumeTimers();

paused = false;

}

Ⅳ android studio集成cordova和安装cordova有什么不同

一般Android项目结构和目录结构一样,是这样的:
MyApp
|--build.gradle
|--settings.gradle
|--app
|-- build.gradle
|-- build
|-- libs
|-- src
|-- main
|--java
| |-- com.package.myapp
|--res
|-- drawable
|-- layout
|-- etc

由Cordova创建的项目的目录结构是这样的(项目结构见上图)

看起来很乱是不是。但是不影响使用,实际上也没必要非要改成标准格式。因为Gradle已经帮我们在配置脚本中写好了相关配置,它知道如何找到需要的文件。
按照标准的Gradle教程,项目即使没有任何模块(mole),Android Studio也会为我们生成一个对应于项目的build.gradle脚本文件的。而观察图1,Android Studio打开的Cordova项目中却没有,编译构建工作也可以正常进行,说明这个文件不是必须的。
它是在andorid、CordovaLib模块中的build.gradle脚本中的android任务的sourceSets的main属性,其中定义了Android Studio项目目录结构和真实目录的对应关系。比如android模块下的build.gradle是这样的:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}

详细请参考G文第一篇 '保持旧的Eclipse文件结构' 部分。
可以看到,Android Studio中目录的逻辑结构和系统中的文件夹结构是分离的,依靠的就是Gradle的配置能力。对比标准的项目目录结构,Cordova项目把android模块直接放在了项目的根下,而不是其他模块那样(比如CordovaLib模块)作为子文件夹存在,这也说明了它为什么不需要项目的build.gradle脚本,因为项目的脚本就是android模块的脚本。之后添加的模块,都是作为根目录的子文件夹存在的。
此外还有一个多出来的cordova.gradle,以及和G文名称不一致的local.properties。
Gradle脚本的详细说明
上面部分让我们对用Android Studio打开的Cordova项目有了些感性了解。它有其自已的独特性:一方面Cordova创建的项目有自己的Gradle配置脚本,另一方面又保留了自己独特的结构。接下来让我们对Gradle脚本的各个部分作较为详细的了解,同样的基础知识请参考G文或《Gradle for Android》一书。
我们看到Gradle脚本相关的文件有build.gradle(CordovaLib模块)、build.gradle(android模块)、cordova.gradle(CordovaLib模块)、settings.gradle(项目)、local.properties(SDK Location)。看起来有些不一样。
不过没关系,我们知道Gradle构建时首先要去找build.gradle脚本的。通过上面的项目结构知道,首先执行的应该是逻辑上属于android模块,但实际上位于项目根目录下的build.gradle。就从这里开始。
android模块的build.gradle脚本
打开build.gradle。首先看到一些Cordova生成的一些注释。原文就不照抄了,大意是一些授权说明信息。最后的单行注释很关键:"生成文件!请不要编辑!"。 虽然不能编辑,但一则其他的文件并没有这么写,二则做为入口文件,我们还是需要对它做一个了解。
注释后紧接着就是buildscript方法。在它里面首先是repositories方法,它告诉我们使用的库是mavenCentral。接下来是依照已经在本地安装的gradle的版本选择使用的Gradle插件版本,并且语句上面有注释可以参考,以后几乎在每条语句上面都有注释帮助我们理解并告诉我们相关参考资料的位置。
// 列表1-1。
buildscript {
repositories {
mavenCentral()
}

// Switch the Android Gradle plugin version requirement depending on the
// installed version of Gradle. This dependency is documented at
// http://tools.android.com/tech-docs/new-build-system/version-compatibility
// and https://issues.apache.org/jira/browse/CB-8143
if (gradle.gradleVersion >= "2.2") {
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0+'
}
} else if (gradle.gradleVersion >= "2.1") {
dependencies {
classpath 'com.android.tools.build:gradle:0.14.0+'
}
} else {
dependencies {
classpath 'com.android.tools.build:gradle:0.12.0+'
}
}
}

随后又使用了一个repositories任务。注释说:允许插件通过build-extras.gradle声明Maven依赖。通过extra这个名字,以及前面不要编辑的警告,它的作用可能是对这个build.gradle文件的修改或补充。其实在下面的代码中可以看到更多这方面的信息。
// 列表1-2。
repositories {
mavenCentral()
}

接下来有一个wrapper任务,查阅文档得知它用于定制Gradle Wrapper的。如果对Wrapper不了解,请参考《G》文的第一篇"使用Gradle Wrapper"部分。
// 列表1-3。
task wrapper(type: Wrapper) {
gradleVersion = '2.2.1'
}

接下来定义了一个ext属性,其中定义了一些额外属性。注释也说明了其中定义的属性需要通过环境变量、build-extras.gradle或gradle.properties设置。
ext属性中首先引用了cordova.gradle。这样就知道项目中这个文件用在哪里了。但下面并没有用到它。通过后面的代码推测它可能是供build-extras.gradle调用的。接下来一系列条件判断语句分别定义了一些属性并把它们初为null。这些属性是都以cdv开头,表示一些Cordova构建属性。接下来的代码中会看到它们的作用。最后定义了一个cdvPluginPostBuildExtras数组变量,用来向里面追加Gradle插件扩展。
// 列表1-4。
ext {
apply from: 'CordovaLib/cordova.gradle'
// The value for android.compileSdkVersion.
if (!project.hasProperty('cdvCompileSdkVersion')) {
cdvCompileSdkVersion = null;
}
// The value for android.buildToolsVersion.
if (!project.hasProperty('cdvBuildToolsVersion')) {
cdvBuildToolsVersion = null;
}
// Sets the versionCode to the given value.
if (!project.hasProperty('cdvVersionCode')) {
cdvVersionCode = null
}
// Sets the minSdkVersion to the given value.
if (!project.hasProperty('cdvMinSdkVersion')) {
cdvMinSdkVersion = null
}
// Whether to build architecture-specific APKs.
if (!project.hasProperty('cdvBuildMultipleApks')) {
cdvBuildMultipleApks = null
}
// .properties files to use for release signing.
if (!project.hasProperty('')) {
= null
}
// .properties files to use for debug signing.
if (!project.hasProperty('cdvDebugSigningPropertiesFile')) {
cdvDebugSigningPropertiesFile = null
}
// Set by build.js script.
if (!project.hasProperty('cdvBuildArch')) {
cdvBuildArch = null
}

// Plugin gradle extensions can append to this to have code run at the end.
cdvPluginPostBuildExtras = []
}

接下来这部分代码,首先判断build-extras.gradle文件是否存在,如果存在则把它应用到构建脚本中。下面的判断语句检查build-extras.gradle是否定义了列表1-4的属性。如果有就使用build-extras.gradle中的,如果没有,则按下面语句设置:
// 列表1-5。
// Set property defaults after extension .gradle files.
if (ext.cdvCompileSdkVersion == null) {
ext.cdvCompileSdkVersion = privateHelpers.getProjectTarget()
}
if (ext.cdvBuildToolsVersion == null) {
ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
}
if (ext.cdvDebugSigningPropertiesFile == null && file('debug-signing.properties').exists()) {
ext.cdvDebugSigningPropertiesFile = 'debug-signing.properties'
}
if (ext. == null && file('release-signing.properties').exists()) {
ext. = 'release-signing.properties'
}

// Cast to appropriate types.
ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? null : Integer.parseInt('' + cdvMinSdkVersion)
ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)

上述代码表示如果没有设置列表1-4中的属性时设置它们,其中调用了cordova.gradle脚本中的方法。如前所述之后会说明这些变量的作用。
接下来这段代码,注释告诉我们,要让cdvBuild的任务依赖于debug/arch-specific,即平台相关,解决的是不同平台构建的问题。首先分成debug和release版,然后根据前面遇到过的cdvBuildMultipleApks和cdvBuildArch的变量判断是否是跨平台构建,如果是则返回一个根据架构名生成的结果。注意到这个cdvBuildArch变量,在上面列表1-4的注释中标明它由build.js设置。这个脚本位于项目目录的cordova/lib/文件夹中,没有纳入到构建中,是cordova cli构建脚本,在这里先不做探讨。
def computeBuildTargetName(debugBuild) {
def ret = 'assemble'
if (cdvBuildMultipleApks && cdvBuildArch) {
def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch
ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1);
}
return ret + (debugBuild ? 'Debug' : 'Release')
}

// Make cdvBuild a task that depends on the debug/arch-sepecific task.
task cdvBuildDebug
cdvBuildDebug.dependsOn {
return computeBuildTargetName(true)
}

task cdvBuildRelease
cdvBuildRelease.dependsOn {
return computeBuildTargetName(false)
}

接下来定义了一个任务,显然作用是输出列表1-4以及后面定义过的属性值。
task cdvPrintProps << {
println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
println('cdvVersionCode=' + cdvVersionCode)
println('cdvMinSdkVersion=' + cdvMinSdkVersion)
println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
println('=' + )
println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
println('cdvBuildArch=' + cdvBuildArch)
println('computedVersionCode=' + android.defaultConfig.versionCode)
android.proctFlavors.each { flavor ->
println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
}
}

接下来就是构建的核心部分,每个使用android插件构建都会有的android方法。里面对android的构建定义了一些配置。这些配置的做用可以参考相关文章,这里就不赘述了。之后是在任务准备就绪后,对需要验证的任务进行验证。再下来定义的addSigningProps函数被android方法调用,用来在需要验证时,为属性文件添加验证配置。最后配置了构建后要执行的方法,并且添加了在自定义配置文件build-extras.gradle中配置的构建后执行方法的入口。
总结
综上,在Cordova项目中的android文件夹中的默认两个模块的内容作为容器和插件的源代码,有其相对于普通Gradle Android特殊的目录结构。android模块把CordovaLib和web内容结合在一起生成Crodova应用,android模块和CordovaLib通过使用共同的配置变量,保证了包括编译SDK版本在内的一致性,并提供了额外配置的入口。但万变不离其宗,这一切都是建立在了解Gradle构建工具的基础上的。
望采纳,谢谢

Ⅳ Android高版本http网络请求失败的Cordova配置处理

问题出现的原因是因为Android高版本(Android 6.0)以上默认使用TLS保护用户信息,详见以下文档:
Transport Layer Security

摘录关键信息如下:

简单地说,在Android高版本对非加密的明文传输有要求,也即默认启用了TLS保护,使得该应用无法进行http网络请求,而https则不会受影响,同样地,如果应用嵌套了webview也会受这限制。

针对这种情况,有以下解决方案:

然后在AnroidManifest.xml中的application添加指向该文件的设置项:
android:networkSecurityConfig="@xml/network_security_config"

综合考量,第3种方案个人认为会好点,Cordova配合其使用也很简单:

在config.xml文件中,在 <platform name="android"/> 节点内添加配置项即可:

这样Cordova build的时候就会把上面配置合并到AnroidManifest.xml中。

热点内容
我的世界如何保留已玩过的服务器 发布:2025-05-11 19:12:14 浏览:231
固定ip如何自建服务器 发布:2025-05-11 19:12:10 浏览:629
如何恢复儿童储蓄密码箱原始密码 发布:2025-05-11 18:57:10 浏览:286
javajdk区别 发布:2025-05-11 18:45:21 浏览:35
如何防止apk被反编译 发布:2025-05-11 18:45:16 浏览:152
安卓什么功能好 发布:2025-05-11 18:21:31 浏览:354
我的世界2b2t服务器中国版 发布:2025-05-11 18:16:35 浏览:693
萌将风云脚本 发布:2025-05-11 18:07:14 浏览:745
密码锁aid代表什么 发布:2025-05-11 18:00:01 浏览:757
编程的组成 发布:2025-05-11 17:58:34 浏览:809