Cordova CLI 项目在工具链升级后忽略 build-extras
Cordova CLI project ignores build-extras after toolchain upgrade
直到最近我一直在使用以下
- 科尔多瓦 Android 6.3.0
- Gradle 4.9
- 节点 8.9.2
构建我的混合 Android 应用程序,该应用程序使用一个自定义插件——即由我编写的插件。该插件又具有许多外部依赖项,我通过下面列出的 myapp/platforms/android/build-extras.gradle 文件指定了这些依赖项
ext.postBuildExtras =
{
android
{
dependencies
{
compile 'com.squareup.duktape:duktape-android:1.3.0'
compile 'net.zetetic:android-database-sqlcipher:3.5.9@aar'
compile 'co.realtime:messaging-android:2.1.+'
compile 'com.google.android.gms:play-services-location:15.0.1'
compile 'com.android.installreferrer:installreferrer:1.0'
}
defaultConfig
{
jackOptions {enabled true}
}
compileOptions
{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
allprojects
{
compileOptions
{
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
}
}
我的目标是 Android SDK 26,最低 SDK 级别设置为 23。我的 Cordova config.xml
文件如下所示
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="1190" android-versionName="Etoile-2"
id="my.app.id" version="1.1.9" xmlns="http://www.w3.org/ns/widgets"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>My App</name>
<description>My App</description>
<author email="someone@gmail.com" href="https://example.org">My Name.
</author>
<content src="index.html" />
<access origin="*" />
<icon platform="android" qualifier="mdpi" src="res/mdpi.png" />
<icon platform="android" qualifier="hdpi" src="res/hdpi.png" />
<icon platform="android" qualifier="xhdpi" src="res/xhdpi.png" />
<icon platform="android" qualifier="xxdpi" src="res/xxdpi.png" />
<icon platform="android" qualifier="xxxdpi" src="res/xxxdpi.png" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<FrameLayout android:focusable="true"
android:focusableInTouchMode="true"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
</FrameLayout>
<preference name="android-minSdkVersion" value="23" />
<preference name="android-targetSdkVersion" value="26" />
</platform>
<preference name="Orientation" value="portrait" />
<plugin name="ext.org.plugin" spec="path:\to\my\plugin" />
<engine name="android" spec="^7.0.0" />
</widget>
我正在配置更现代的 Windows PC 来执行我的 Android 构建。在这个过程中我已经升级到
- 科尔多瓦 Android 7.0.0
- Gradle 4.10.0(通过 Scoop 安装)
- 节点 10.10.0
我一步一步的完成了重构整个项目的过程
- 创建一个新的 Cordova CLI 项目
cordova create myapp ext.example.myproj MyApp
- 添加 Android 平台
cordova platform add android
添加 Cordova Android 7.0.0
- 构建这个虚拟应用程序
cordova build android --debug
:工作
- 用我的版本(如上所示)替换默认的 Cordova
config.xml
减去对我的自定义插件的引用
- 再次构建 - 仍在工作
- 将我原来的
build-extras.gradle
文件复制到 myapp/platforms/android
- 再次构建 - 仍在工作
- 添加我的自定义插件
cordova plugin add 'path:\to\my\plugin
发出 cordova clean
后跟 cordova build android
这会导致
的错误
:app:compileDebugJavaWithJavac 路径:\to\my\app\platforms\android\app\src\main\java\ext\example\plugin\BCTrailer.java:4: 错误:包 net.sqlcipher 不存在
导入 net.sqlcipher.Cursor;
这似乎暗示我的 build-extras.gradle
文件的内容在构建期间未被使用。我故意通过遗漏大括号使 XML 无效来破坏该文件。如果正在读取文件,我预计 Gradle 会抱怨。相反,它只是继续并发出相同的错误,例如 package net.sqlcipher
不存在等
我注意到有人说 compile
在依赖项中被弃用,取而代之的是一系列全新的指令,例如 implementation
和 api
。我尝试在我自己的 build-extras.gradle
文件中用 implementation
替换 compile
但无济于事。
很明显,我在这里做错了,这与 Gradle 中的更改有关。
虽然我仍然不明白我 运行 在尝试升级 Android APK 构建工具链时遇到的问题的根本原因,但我现在有一个解决方案,我在这里分享发现此主题的其他人的好处。
- 使用 Cordova Android 7.0.0(与我之前使用的 6.3.1 相反)
myapp/platforms/android
文件夹中的 build-extras.gradle
被忽略。
- 在任何情况下,通过 APK 项目本身中的
build-extras
文件开始声明插件依赖项都是不正确的。
- 虽然在这次工具链升级之前这一直对我有用,但我发现 运行ge 在
build-extras.gradle
**ext.postBuildExtras**
中声明的依赖项正在努力在外部分叉到那时,人们会认为已经内置到应用程序中的插件中的依赖项。
- 我尝试将依赖项声明切换到实际 插件 中的
build.gradle
文件。但是,这并没有改变结果——依赖项没有进入构建,结果插件中 Java 单元中的各种 import path.to.external.dependency
声明抛出了错误。
- 我删除了
build.gradle
文件并通过 plugin.xml
文件中的一系列 <framework src='path/to/dependency' />
依赖语句声明了依赖关系,Bingo! - 一切正常。
附带说明 - 使用 Cordova Android 7 和任何高于 Node 9.0 的版本,您不再需要使用现已弃用的 Jack 编译器或做任何其他事情来说服 Gradle/Android/Cordova 使用Java 8. 我现在不再在我的应用程序中使用 build-extras.gradle
文件或在我的插件中使用 build.gradle
文件。
更新:已在 cordova-android 7.1.3
中修复
在 cordova-android 7.1.3 中包含了我的拉取请求,因此 问题已解决 请参阅 release notes
对于 cordova-android >= 7.0.0 但 < 7.1.3
将 build-extras.gradle
移动(或复制)到 platforms/android/app/
旧答案:
我遇到了类似的问题。从 cordova-android 7.0 cordova 开始更改了目录结构并遗漏了其中代码中的一些更改。
要让 build-extras.gradle
再次工作,只需将其移动或更好地将其复制(当 cordova-android 再次遵循其文档时)到 platforms/android/app/
.
这是issue and here is related pull request
直到最近我一直在使用以下
- 科尔多瓦 Android 6.3.0
- Gradle 4.9
- 节点 8.9.2
构建我的混合 Android 应用程序,该应用程序使用一个自定义插件——即由我编写的插件。该插件又具有许多外部依赖项,我通过下面列出的 myapp/platforms/android/build-extras.gradle 文件指定了这些依赖项
ext.postBuildExtras =
{
android
{
dependencies
{
compile 'com.squareup.duktape:duktape-android:1.3.0'
compile 'net.zetetic:android-database-sqlcipher:3.5.9@aar'
compile 'co.realtime:messaging-android:2.1.+'
compile 'com.google.android.gms:play-services-location:15.0.1'
compile 'com.android.installreferrer:installreferrer:1.0'
}
defaultConfig
{
jackOptions {enabled true}
}
compileOptions
{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
allprojects
{
compileOptions
{
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
}
}
我的目标是 Android SDK 26,最低 SDK 级别设置为 23。我的 Cordova config.xml
文件如下所示
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="1190" android-versionName="Etoile-2"
id="my.app.id" version="1.1.9" xmlns="http://www.w3.org/ns/widgets"
xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>My App</name>
<description>My App</description>
<author email="someone@gmail.com" href="https://example.org">My Name.
</author>
<content src="index.html" />
<access origin="*" />
<icon platform="android" qualifier="mdpi" src="res/mdpi.png" />
<icon platform="android" qualifier="hdpi" src="res/hdpi.png" />
<icon platform="android" qualifier="xhdpi" src="res/xhdpi.png" />
<icon platform="android" qualifier="xxdpi" src="res/xxdpi.png" />
<icon platform="android" qualifier="xxxdpi" src="res/xxxdpi.png" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<FrameLayout android:focusable="true"
android:focusableInTouchMode="true"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
</FrameLayout>
<preference name="android-minSdkVersion" value="23" />
<preference name="android-targetSdkVersion" value="26" />
</platform>
<preference name="Orientation" value="portrait" />
<plugin name="ext.org.plugin" spec="path:\to\my\plugin" />
<engine name="android" spec="^7.0.0" />
</widget>
我正在配置更现代的 Windows PC 来执行我的 Android 构建。在这个过程中我已经升级到
- 科尔多瓦 Android 7.0.0
- Gradle 4.10.0(通过 Scoop 安装)
- 节点 10.10.0
我一步一步的完成了重构整个项目的过程
- 创建一个新的 Cordova CLI 项目
cordova create myapp ext.example.myproj MyApp
- 添加 Android 平台
cordova platform add android
添加 Cordova Android 7.0.0 - 构建这个虚拟应用程序
cordova build android --debug
:工作 - 用我的版本(如上所示)替换默认的 Cordova
config.xml
减去对我的自定义插件的引用 - 再次构建 - 仍在工作
- 将我原来的
build-extras.gradle
文件复制到 myapp/platforms/android - 再次构建 - 仍在工作
- 添加我的自定义插件
cordova plugin add 'path:\to\my\plugin
发出
的错误cordova clean
后跟cordova build android
这会导致:app:compileDebugJavaWithJavac 路径:\to\my\app\platforms\android\app\src\main\java\ext\example\plugin\BCTrailer.java:4: 错误:包 net.sqlcipher 不存在 导入 net.sqlcipher.Cursor;
这似乎暗示我的 build-extras.gradle
文件的内容在构建期间未被使用。我故意通过遗漏大括号使 XML 无效来破坏该文件。如果正在读取文件,我预计 Gradle 会抱怨。相反,它只是继续并发出相同的错误,例如 package net.sqlcipher
不存在等
我注意到有人说 compile
在依赖项中被弃用,取而代之的是一系列全新的指令,例如 implementation
和 api
。我尝试在我自己的 build-extras.gradle
文件中用 implementation
替换 compile
但无济于事。
很明显,我在这里做错了,这与 Gradle 中的更改有关。
虽然我仍然不明白我 运行 在尝试升级 Android APK 构建工具链时遇到的问题的根本原因,但我现在有一个解决方案,我在这里分享发现此主题的其他人的好处。
- 使用 Cordova Android 7.0.0(与我之前使用的 6.3.1 相反)
myapp/platforms/android
文件夹中的build-extras.gradle
被忽略。 - 在任何情况下,通过 APK 项目本身中的
build-extras
文件开始声明插件依赖项都是不正确的。 - 虽然在这次工具链升级之前这一直对我有用,但我发现 运行ge 在
build-extras.gradle
**ext.postBuildExtras**
中声明的依赖项正在努力在外部分叉到那时,人们会认为已经内置到应用程序中的插件中的依赖项。 - 我尝试将依赖项声明切换到实际 插件 中的
build.gradle
文件。但是,这并没有改变结果——依赖项没有进入构建,结果插件中 Java 单元中的各种import path.to.external.dependency
声明抛出了错误。 - 我删除了
build.gradle
文件并通过plugin.xml
文件中的一系列<framework src='path/to/dependency' />
依赖语句声明了依赖关系,Bingo! - 一切正常。
附带说明 - 使用 Cordova Android 7 和任何高于 Node 9.0 的版本,您不再需要使用现已弃用的 Jack 编译器或做任何其他事情来说服 Gradle/Android/Cordova 使用Java 8. 我现在不再在我的应用程序中使用 build-extras.gradle
文件或在我的插件中使用 build.gradle
文件。
更新:已在 cordova-android 7.1.3
中修复在 cordova-android 7.1.3 中包含了我的拉取请求,因此 问题已解决 请参阅 release notes
对于 cordova-android >= 7.0.0 但 < 7.1.3
将 build-extras.gradle
移动(或复制)到 platforms/android/app/
旧答案:
我遇到了类似的问题。从 cordova-android 7.0 cordova 开始更改了目录结构并遗漏了其中代码中的一些更改。
要让 build-extras.gradle
再次工作,只需将其移动或更好地将其复制(当 cordova-android 再次遵循其文档时)到 platforms/android/app/
.
这是issue and here is related pull request