Cordova CLI 项目在工具链升级后忽略 build-extras

Cordova CLI project ignores build-extras after toolchain upgrade

直到最近我一直在使用以下

构建我的混合 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 构建。在这个过程中我已经升级到

我一步一步的完成了重构整个项目的过程

  1. 创建一个新的 Cordova CLI 项目cordova create myapp ext.example.myproj MyApp
  2. 添加 Android 平台 cordova platform add android 添加 Cordova Android 7.0.0
  3. 构建这个虚拟应用程序cordova build android --debug:工作
  4. 用我的版本(如上所示)替换默认的 Cordova config.xml 减去对我的自定义插件的引用
  5. 再次构建 - 仍在工作
  6. 将我原来的 build-extras.gradle 文件复制到 myapp/platforms/android
  7. 再次构建 - 仍在工作
  8. 添加我的自定义插件cordova plugin add 'path:\to\my\plugin
  9. 发出 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 在依赖项中被弃用,取而代之的是一系列全新的指令,例如 implementationapi。我尝试在我自己的 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