OracleJet:无法使用平台Android构建应用程序?

发布于 2025-02-01 08:51:23 字数 19167 浏览 3 评论 0原文

昨天,我使用平台Android构建了我的OracleJet应用程序,但我收到了此错误:

    > npx @oracle/[email protected] serve android --device
    Task index.html theme path injection finished.
    Injecting index.html with cordova script.
    Error: TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Document

我尝试了什么:

  1. remove node_modules文件夹并运行nmp install

  2. 升级节点至最新版本18.2.0

,但没有成功的

OracleJet版本:8.0.0 CORDOVA版本:11.0.0

package.json:

{
 "name": "mobile-electronic",
 "version": "1.0.0",
 "description": "An Oracle JavaScript Extension Toolkit (JET) mobile app",
 "dependencies": {
      "@oracle/oraclejet": "~5.0.0"
 },
 "devDependencies": {
      "fs-extra": "0.30.0",
      "grunt": "^1.0.1",
      "@oracle/oraclejet-tooling": "~8.0.0",
      "@oracle/grunt-oraclejet": "~5.0.0",
      "load-grunt-config": "0.19.2",
      "qunit-reporter-junit": "^1.1.1",
      "qunit": "^2.4.1"
 },
 "engines": {
      "node": ">=0.10.0"
 },
 "private": true

}

index.html:

    <!DOCTYPE html>
<!--
 Copyright (c) 2014, 2018, Oracle and/or its affiliates.
 The Universal Permissive License (UPL), Version 1.0
 -->

<!-- ************************ IMPORTANT INFORMATION ************************************
  This hybrid navigation drawer template is provided as an example of how to configure
  a JET hybrid mobile application with a navigation drawer as a single page application
  using ojRouter and oj-module.  It contains the Oracle JET framework and a default
  requireJS configuration file to show how JET can be setup in a common application.
  This project template can be used in conjunction with demo code from the JET
  website to test JET component behavior and interactions.

  Any CSS styling with the prefix "demo-" is for demonstration only and is not
  provided as part of the JET framework.

  Please see the demos under Cookbook/Patterns/App Shell: Hybrid Mobile and the CSS documentation
  under Support/API Docs/Non-Component Styling on the JET website for more information on how to use 
  the best practice patterns shown in this template.

  Aria Landmark role attributes are added to the different sections of the application
  for accessibility compliance. If you change the type of content for a specific
  section from what is defined, you should also change the role value for that
  section to represent the appropriate content type.
  ***************************** IMPORTANT INFORMATION ************************************ -->
<html lang="en-us">
  <head>
    <title>Oracle JET Starter Template - Hybrid Nav Drawer</title>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' *.oracle.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' *.oracle.com  'unsafe-inline'; img-src * data:">
    <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
    <link rel="icon" href="css/images/favicon.ico" type="image/x-icon" />

    <!-- This is the main css file for the default Alta theme -->
    <!-- injector:theme -->
    <link rel="stylesheet" href="css/libs/oj/v5.0.0/alta/oj-alta-min.css" type="text/css"/>
    <!-- endinjector -->
    <!-- This contains icon fonts used by the starter template -->
    <link rel="stylesheet" href="css/demo-alta-site-min.css" type="text/css"/>

    <!-- This is where you would add any app specific styling -->
    <link rel="stylesheet" href="css/app.css" type="text/css"/>

  </head>
  <body>
    <!-- template for rendering navigation items in the drawer -->
    <script type="text/html" id="navTemplate">
      <li><a href="#">
        <span :class="[[$data['iconClass']]]"></span>
        <oj-bind-text value="[[$data['name']]]"></oj-bind-text>
      </a></li>
    </script>
    
    <div id="globalBody" class="oj-offcanvas-outer-wrapper oj-offcanvas-page">
      <!--
         ** Oracle JET V5.0.0 hybrid mobile application navigation drawer pattern.
         ** Please see the demos under Cookbook/Patterns/App Shell: Hybrid Mobile 
         ** and the CSS documentation under Support/API Docs/Non-Component Styling
         ** on the JET website for more information on how to use this pattern.
      -->
      <div id="navDrawer" role="navigation" class="oj-hybrid-applayout-offcanvas oj-contrast-marker oj-offcanvas-start">
        <!-- User Profile -->
        <img alt="profile image" src="css/images/james_avatar.png" class="demo-james-icon">
        <h2 class="demo-profile-name">James</h2>
        <!-- Navigation -->
        <oj-navigation-list class="oj-navigationlist-stack-icon-label"
                            data="[[navDataSource]]"
                            edge="start"
                            item.renderer="[[oj.KnockoutTemplateUtils.getRenderer('navTemplate', true)]]"
                            on-click="[[toggleDrawer]]"
                            selection="{{router.stateId}}">
        </oj-navigation-list>
        <div class="oj-flex-bar oj-sm-justify-content-center">
          <h2 class="demo-app-name">Oracle App Name</h2>
        </div>
      </div>
   
      <oj-module id="pageContent" config="[[moduleConfig]]"></oj-module>

    </div>
    
    <script type="text/javascript" src="js/libs/require/require.js"></script>
    <script type="text/javascript" src="js/main.js"></script>

  </body>

</html>

在文件夹平台 - &gt; android build.gradle


buildscript {
    apply from: 'CordovaLib/cordova.gradle'
    apply from: 'repositories.gradle'
    repositories repos
    dependencies {
        classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${cordovaConfig.KOTLIN_VERSION}"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    def hasRepositoriesGradle = file('repositories.gradle').exists()
    if (hasRepositoriesGradle) {
        apply from: 'repositories.gradle'
    } else {
        apply from: "${project.rootDir}/repositories.gradle"
    }

    repositories repos
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

上,在文件夹平台上 - &gt; android&gt; app build.gradle:gradle:gradle:gradle:gradle:gradle:

/*
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
*/

apply plugin: 'com.android.application'

if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
  apply plugin: 'kotlin-android'
  apply plugin: 'kotlin-android-extensions'
}

buildscript {
  apply from: '../CordovaLib/cordova.gradle'

  // Checks if the kotlin version format is valid.
  if(cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
      if(!cdvHelpers.isVersionValid(cordovaConfig.KOTLIN_VERSION)) {
          throw new GradleException("The defined Kotlin version (${cordovaConfig.KOTLIN_VERSION}) does not appear to be a valid version.")
      }
  }

  apply from: 'repositories.gradle'
  repositories repos

  dependencies {
      classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}"

      if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
          classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${cordovaConfig.KOTLIN_VERSION}"
      }

      if(cordovaConfig.IS_GRADLE_PLUGIN_GOOGLE_SERVICES_ENABLED) {
          // Checks if the kotlin version format is valid.
          if(!cdvHelpers.isVersionValid(cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION)) {
              throw new GradleException("The defined Google Services plugin version (${cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION}) does not appear to be a valid version.")
          }

          // Create the Google Services classpath and set it.
          String gradlePluginGoogleServicesClassPath = "com.google.gms:google-services:${cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION}"
          println "Adding classpath: ${gradlePluginGoogleServicesClassPath}"
          classpath gradlePluginGoogleServicesClassPath
      }
  }
}

// Allow plugins to declare Maven dependencies via build-extras.gradle.
allprojects {
  def hasRepositoriesGradle = file('repositories.gradle').exists()
  if (hasRepositoriesGradle) {
      apply from: 'repositories.gradle'
  } else {
      apply from: "${project.rootDir}/repositories.gradle"
  }

  repositories repos
}

task wrapper(type: Wrapper) {
  gradleVersion = cordovaConfig.GRADLE_VERSION
}

// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
ext {
  apply from: '../CordovaLib/cordova.gradle'

  // Sets the versionCode to the given value.
  if (!project.hasProperty('cdvVersionCode')) {
      cdvVersionCode = null
  }
  // Whether to build architecture-specific APKs.
  if (!project.hasProperty('cdvBuildMultipleApks')) {
      cdvBuildMultipleApks = null
  }
  // Whether to append a 0 "abi digit" to versionCode when only a single APK is build
  if (!project.hasProperty('cdvVersionCodeForceAbiDigit')) {
      cdvVersionCodeForceAbiDigit = null
  }
  // .properties files to use for release signing.
  if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) {
      cdvReleaseSigningPropertiesFile = 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 = []
}

// PLUGIN GRADLE EXTENSIONS START
// PLUGIN GRADLE EXTENSIONS END

def hasBuildExtras1 = file('build-extras.gradle').exists()
if (hasBuildExtras1) {
  apply from: 'build-extras.gradle'
}

def hasBuildExtras2 = file('../build-extras.gradle').exists()
if (hasBuildExtras2) {
  apply from: '../build-extras.gradle'
}

// Apply updates that might come from build-extra.
privateHelpers.applyCordovaConfigCustomization()

// Set property defaults after extension .gradle files.
if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists()) {
  ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties'
}
if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists()) {
  ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties'
}

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

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)
}

task cdvPrintProps {
  doLast {
      println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
      println('cdvVersionCode=' + cdvVersionCode)
      println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit)
      println('cdvSdkVersion=' + cdvSdkVersion)
      println('cdvMinSdkVersion=' + cdvMinSdkVersion)
      println('cdvMaxSdkVersion=' + cdvMaxSdkVersion)
      println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
      println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
      println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
      println('cdvBuildArch=' + cdvBuildArch)
      println('computedVersionCode=' + android.defaultConfig.versionCode)
      println('cdvAndroidXAppCompatVersion=' + cdvAndroidXAppCompatVersion)
      println('cdvAndroidXWebKitVersion=' + cdvAndroidXWebKitVersion)
      android.productFlavors.each { flavor ->
          println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
      }
  }
}

android {
  defaultConfig {
      versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
      applicationId privateHelpers.extractStringFromManifest("package")

      minSdkVersion cordovaConfig.MIN_SDK_VERSION
      if (cordovaConfig.MAX_SDK_VERSION != null) {
          maxSdkVersion cordovaConfig.MAX_SDK_VERSION
      }
      targetSdkVersion cordovaConfig.SDK_VERSION
      compileSdkVersion cordovaConfig.SDK_VERSION
  }

  lintOptions {
    abortOnError false
  }

  buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION

  // This code exists for Crosswalk and other Native APIs.
  // By default, we multiply the existing version code in the
  // Android Manifest by 10 and add a number for each architecture.
  // If you are not using Crosswalk or SQLite, you can
  // ignore this chunk of code, and your version codes will be respected.

  if (Boolean.valueOf(cdvBuildMultipleApks)) {
      flavorDimensions "default"

      productFlavors {
          armeabi {
              versionCode defaultConfig.versionCode*10 + 1
              ndk {
                  abiFilters = ["armeabi"]
              }
          }
          armv7 {
              versionCode defaultConfig.versionCode*10 + 2
              ndk {
                  abiFilters = ["armeabi-v7a"]
              }
          }
          arm64 {
              versionCode defaultConfig.versionCode*10 + 3
              ndk {
                  abiFilters = ["arm64-v8a"]
              }
          }
          x86 {
              versionCode defaultConfig.versionCode*10 + 4
              ndk {
                  abiFilters = ["x86"]
              }
          }
          x86_64 {
              versionCode defaultConfig.versionCode*10 + 5
              ndk {
                  abiFilters = ["x86_64"]
              }
          }
      }
  } else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit)) {
      // This provides compatibility to the default logic for versionCode before cordova-android 5.2.0
      defaultConfig {
          versionCode defaultConfig.versionCode*10
      }
  }

  compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
  }

  if (cdvReleaseSigningPropertiesFile) {
      signingConfigs {
          release {
              // These must be set or Gradle will complain (even if they are overridden).
              keyAlias = ""
              keyPassword = ""
              storeFile = null
              storePassword = ""
          }
      }
      buildTypes {
          release {
              signingConfig signingConfigs.release
          }
      }
      addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
  }

  if (cdvDebugSigningPropertiesFile) {
      addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
  }

  sourceSets {
      main.java.srcDirs += 'src/main/kotlin'
  }
}

/*
* WARNING: Cordova Lib and platform scripts do management inside of this code here,
* if you are adding the dependencies manually, do so outside the comments, otherwise
* the Cordova tools will overwrite them
*/


dependencies {
  implementation fileTree(dir: 'libs', include: '*.jar')
  implementation "androidx.appcompat:appcompat:${cordovaConfig.ANDROIDX_APP_COMPAT_VERSION}"

  if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
      implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${cordovaConfig.KOTLIN_VERSION}"
  }

  // SUB-PROJECT DEPENDENCIES START
  implementation(project(path: ":CordovaLib"))
  // SUB-PROJECT DEPENDENCIES END
}

def addSigningProps(propsFilePath, signingConfig) {
  def propsFile = file(propsFilePath)
  def props = new Properties()
  propsFile.withReader { reader ->
      props.load(reader)
  }

  def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
  if (!storeFile.isAbsolute()) {
      storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
  }
  if (!storeFile.exists()) {
      throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
  }
  signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
  signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
  signingConfig.storeFile = storeFile
  signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
  def storeType = props.get('storeType', props.get('key.store.type', ''))
  if (!storeType) {
      def filename = storeFile.getName().toLowerCase()
      if (filename.endsWith('.p12') || filename.endsWith('.pfx')) {
          storeType = 'pkcs12'
      } else {
          storeType = signingConfig.storeType // "jks"
      }
  }
  signingConfig.storeType = storeType
}

for (def func : cdvPluginPostBuildExtras) {
  func()
}

// This can be defined within build-extras.gradle as:
//     ext.postBuildExtras = { ... code here ... }
if (hasProperty('postBuildExtras')) {
  postBuildExtras()
}

if (cordovaConfig.IS_GRADLE_PLUGIN_GOOGLE_SERVICES_ENABLED) {
  apply plugin: 'com.google.gms.google-services'
}

Yesterday , I built my OracleJet app with platform android but I got this error :

    > npx @oracle/[email protected] serve android --device
    Task index.html theme path injection finished.
    Injecting index.html with cordova script.
    Error: TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Document

What I tried :

  1. Remove node_modules folder and run nmp install

  2. Upgrade node to latest version 18.2.0

but with no success

OracleJet version : 8.0.0
Cordova version :11.0.0

package.json :

{
 "name": "mobile-electronic",
 "version": "1.0.0",
 "description": "An Oracle JavaScript Extension Toolkit (JET) mobile app",
 "dependencies": {
      "@oracle/oraclejet": "~5.0.0"
 },
 "devDependencies": {
      "fs-extra": "0.30.0",
      "grunt": "^1.0.1",
      "@oracle/oraclejet-tooling": "~8.0.0",
      "@oracle/grunt-oraclejet": "~5.0.0",
      "load-grunt-config": "0.19.2",
      "qunit-reporter-junit": "^1.1.1",
      "qunit": "^2.4.1"
 },
 "engines": {
      "node": ">=0.10.0"
 },
 "private": true

}

index.html :

    <!DOCTYPE html>
<!--
 Copyright (c) 2014, 2018, Oracle and/or its affiliates.
 The Universal Permissive License (UPL), Version 1.0
 -->

<!-- ************************ IMPORTANT INFORMATION ************************************
  This hybrid navigation drawer template is provided as an example of how to configure
  a JET hybrid mobile application with a navigation drawer as a single page application
  using ojRouter and oj-module.  It contains the Oracle JET framework and a default
  requireJS configuration file to show how JET can be setup in a common application.
  This project template can be used in conjunction with demo code from the JET
  website to test JET component behavior and interactions.

  Any CSS styling with the prefix "demo-" is for demonstration only and is not
  provided as part of the JET framework.

  Please see the demos under Cookbook/Patterns/App Shell: Hybrid Mobile and the CSS documentation
  under Support/API Docs/Non-Component Styling on the JET website for more information on how to use 
  the best practice patterns shown in this template.

  Aria Landmark role attributes are added to the different sections of the application
  for accessibility compliance. If you change the type of content for a specific
  section from what is defined, you should also change the role value for that
  section to represent the appropriate content type.
  ***************************** IMPORTANT INFORMATION ************************************ -->
<html lang="en-us">
  <head>
    <title>Oracle JET Starter Template - Hybrid Nav Drawer</title>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' *.oracle.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' *.oracle.com  'unsafe-inline'; img-src * data:">
    <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
    <link rel="icon" href="css/images/favicon.ico" type="image/x-icon" />

    <!-- This is the main css file for the default Alta theme -->
    <!-- injector:theme -->
    <link rel="stylesheet" href="css/libs/oj/v5.0.0/alta/oj-alta-min.css" type="text/css"/>
    <!-- endinjector -->
    <!-- This contains icon fonts used by the starter template -->
    <link rel="stylesheet" href="css/demo-alta-site-min.css" type="text/css"/>

    <!-- This is where you would add any app specific styling -->
    <link rel="stylesheet" href="css/app.css" type="text/css"/>

  </head>
  <body>
    <!-- template for rendering navigation items in the drawer -->
    <script type="text/html" id="navTemplate">
      <li><a href="#">
        <span :class="[[$data['iconClass']]]"></span>
        <oj-bind-text value="[[$data['name']]]"></oj-bind-text>
      </a></li>
    </script>
    
    <div id="globalBody" class="oj-offcanvas-outer-wrapper oj-offcanvas-page">
      <!--
         ** Oracle JET V5.0.0 hybrid mobile application navigation drawer pattern.
         ** Please see the demos under Cookbook/Patterns/App Shell: Hybrid Mobile 
         ** and the CSS documentation under Support/API Docs/Non-Component Styling
         ** on the JET website for more information on how to use this pattern.
      -->
      <div id="navDrawer" role="navigation" class="oj-hybrid-applayout-offcanvas oj-contrast-marker oj-offcanvas-start">
        <!-- User Profile -->
        <img alt="profile image" src="css/images/james_avatar.png" class="demo-james-icon">
        <h2 class="demo-profile-name">James</h2>
        <!-- Navigation -->
        <oj-navigation-list class="oj-navigationlist-stack-icon-label"
                            data="[[navDataSource]]"
                            edge="start"
                            item.renderer="[[oj.KnockoutTemplateUtils.getRenderer('navTemplate', true)]]"
                            on-click="[[toggleDrawer]]"
                            selection="{{router.stateId}}">
        </oj-navigation-list>
        <div class="oj-flex-bar oj-sm-justify-content-center">
          <h2 class="demo-app-name">Oracle App Name</h2>
        </div>
      </div>
   
      <oj-module id="pageContent" config="[[moduleConfig]]"></oj-module>

    </div>
    
    <script type="text/javascript" src="js/libs/require/require.js"></script>
    <script type="text/javascript" src="js/main.js"></script>

  </body>

</html>

On folder platforms->android build.gradle


buildscript {
    apply from: 'CordovaLib/cordova.gradle'
    apply from: 'repositories.gradle'
    repositories repos
    dependencies {
        classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${cordovaConfig.KOTLIN_VERSION}"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    def hasRepositoriesGradle = file('repositories.gradle').exists()
    if (hasRepositoriesGradle) {
        apply from: 'repositories.gradle'
    } else {
        apply from: "${project.rootDir}/repositories.gradle"
    }

    repositories repos
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

On folder platforms->android>app build.gradle:

/*
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
*/

apply plugin: 'com.android.application'

if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
  apply plugin: 'kotlin-android'
  apply plugin: 'kotlin-android-extensions'
}

buildscript {
  apply from: '../CordovaLib/cordova.gradle'

  // Checks if the kotlin version format is valid.
  if(cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
      if(!cdvHelpers.isVersionValid(cordovaConfig.KOTLIN_VERSION)) {
          throw new GradleException("The defined Kotlin version (${cordovaConfig.KOTLIN_VERSION}) does not appear to be a valid version.")
      }
  }

  apply from: 'repositories.gradle'
  repositories repos

  dependencies {
      classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}"

      if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
          classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${cordovaConfig.KOTLIN_VERSION}"
      }

      if(cordovaConfig.IS_GRADLE_PLUGIN_GOOGLE_SERVICES_ENABLED) {
          // Checks if the kotlin version format is valid.
          if(!cdvHelpers.isVersionValid(cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION)) {
              throw new GradleException("The defined Google Services plugin version (${cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION}) does not appear to be a valid version.")
          }

          // Create the Google Services classpath and set it.
          String gradlePluginGoogleServicesClassPath = "com.google.gms:google-services:${cordovaConfig.GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION}"
          println "Adding classpath: ${gradlePluginGoogleServicesClassPath}"
          classpath gradlePluginGoogleServicesClassPath
      }
  }
}

// Allow plugins to declare Maven dependencies via build-extras.gradle.
allprojects {
  def hasRepositoriesGradle = file('repositories.gradle').exists()
  if (hasRepositoriesGradle) {
      apply from: 'repositories.gradle'
  } else {
      apply from: "${project.rootDir}/repositories.gradle"
  }

  repositories repos
}

task wrapper(type: Wrapper) {
  gradleVersion = cordovaConfig.GRADLE_VERSION
}

// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
ext {
  apply from: '../CordovaLib/cordova.gradle'

  // Sets the versionCode to the given value.
  if (!project.hasProperty('cdvVersionCode')) {
      cdvVersionCode = null
  }
  // Whether to build architecture-specific APKs.
  if (!project.hasProperty('cdvBuildMultipleApks')) {
      cdvBuildMultipleApks = null
  }
  // Whether to append a 0 "abi digit" to versionCode when only a single APK is build
  if (!project.hasProperty('cdvVersionCodeForceAbiDigit')) {
      cdvVersionCodeForceAbiDigit = null
  }
  // .properties files to use for release signing.
  if (!project.hasProperty('cdvReleaseSigningPropertiesFile')) {
      cdvReleaseSigningPropertiesFile = 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 = []
}

// PLUGIN GRADLE EXTENSIONS START
// PLUGIN GRADLE EXTENSIONS END

def hasBuildExtras1 = file('build-extras.gradle').exists()
if (hasBuildExtras1) {
  apply from: 'build-extras.gradle'
}

def hasBuildExtras2 = file('../build-extras.gradle').exists()
if (hasBuildExtras2) {
  apply from: '../build-extras.gradle'
}

// Apply updates that might come from build-extra.
privateHelpers.applyCordovaConfigCustomization()

// Set property defaults after extension .gradle files.
if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists()) {
  ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties'
}
if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists()) {
  ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties'
}

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

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)
}

task cdvPrintProps {
  doLast {
      println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
      println('cdvVersionCode=' + cdvVersionCode)
      println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit)
      println('cdvSdkVersion=' + cdvSdkVersion)
      println('cdvMinSdkVersion=' + cdvMinSdkVersion)
      println('cdvMaxSdkVersion=' + cdvMaxSdkVersion)
      println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
      println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
      println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
      println('cdvBuildArch=' + cdvBuildArch)
      println('computedVersionCode=' + android.defaultConfig.versionCode)
      println('cdvAndroidXAppCompatVersion=' + cdvAndroidXAppCompatVersion)
      println('cdvAndroidXWebKitVersion=' + cdvAndroidXWebKitVersion)
      android.productFlavors.each { flavor ->
          println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
      }
  }
}

android {
  defaultConfig {
      versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
      applicationId privateHelpers.extractStringFromManifest("package")

      minSdkVersion cordovaConfig.MIN_SDK_VERSION
      if (cordovaConfig.MAX_SDK_VERSION != null) {
          maxSdkVersion cordovaConfig.MAX_SDK_VERSION
      }
      targetSdkVersion cordovaConfig.SDK_VERSION
      compileSdkVersion cordovaConfig.SDK_VERSION
  }

  lintOptions {
    abortOnError false
  }

  buildToolsVersion cordovaConfig.BUILD_TOOLS_VERSION

  // This code exists for Crosswalk and other Native APIs.
  // By default, we multiply the existing version code in the
  // Android Manifest by 10 and add a number for each architecture.
  // If you are not using Crosswalk or SQLite, you can
  // ignore this chunk of code, and your version codes will be respected.

  if (Boolean.valueOf(cdvBuildMultipleApks)) {
      flavorDimensions "default"

      productFlavors {
          armeabi {
              versionCode defaultConfig.versionCode*10 + 1
              ndk {
                  abiFilters = ["armeabi"]
              }
          }
          armv7 {
              versionCode defaultConfig.versionCode*10 + 2
              ndk {
                  abiFilters = ["armeabi-v7a"]
              }
          }
          arm64 {
              versionCode defaultConfig.versionCode*10 + 3
              ndk {
                  abiFilters = ["arm64-v8a"]
              }
          }
          x86 {
              versionCode defaultConfig.versionCode*10 + 4
              ndk {
                  abiFilters = ["x86"]
              }
          }
          x86_64 {
              versionCode defaultConfig.versionCode*10 + 5
              ndk {
                  abiFilters = ["x86_64"]
              }
          }
      }
  } else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit)) {
      // This provides compatibility to the default logic for versionCode before cordova-android 5.2.0
      defaultConfig {
          versionCode defaultConfig.versionCode*10
      }
  }

  compileOptions {
      sourceCompatibility JavaVersion.VERSION_1_8
      targetCompatibility JavaVersion.VERSION_1_8
  }

  if (cdvReleaseSigningPropertiesFile) {
      signingConfigs {
          release {
              // These must be set or Gradle will complain (even if they are overridden).
              keyAlias = ""
              keyPassword = ""
              storeFile = null
              storePassword = ""
          }
      }
      buildTypes {
          release {
              signingConfig signingConfigs.release
          }
      }
      addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
  }

  if (cdvDebugSigningPropertiesFile) {
      addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
  }

  sourceSets {
      main.java.srcDirs += 'src/main/kotlin'
  }
}

/*
* WARNING: Cordova Lib and platform scripts do management inside of this code here,
* if you are adding the dependencies manually, do so outside the comments, otherwise
* the Cordova tools will overwrite them
*/


dependencies {
  implementation fileTree(dir: 'libs', include: '*.jar')
  implementation "androidx.appcompat:appcompat:${cordovaConfig.ANDROIDX_APP_COMPAT_VERSION}"

  if (cordovaConfig.IS_GRADLE_PLUGIN_KOTLIN_ENABLED) {
      implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${cordovaConfig.KOTLIN_VERSION}"
  }

  // SUB-PROJECT DEPENDENCIES START
  implementation(project(path: ":CordovaLib"))
  // SUB-PROJECT DEPENDENCIES END
}

def addSigningProps(propsFilePath, signingConfig) {
  def propsFile = file(propsFilePath)
  def props = new Properties()
  propsFile.withReader { reader ->
      props.load(reader)
  }

  def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
  if (!storeFile.isAbsolute()) {
      storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
  }
  if (!storeFile.exists()) {
      throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
  }
  signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
  signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
  signingConfig.storeFile = storeFile
  signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
  def storeType = props.get('storeType', props.get('key.store.type', ''))
  if (!storeType) {
      def filename = storeFile.getName().toLowerCase()
      if (filename.endsWith('.p12') || filename.endsWith('.pfx')) {
          storeType = 'pkcs12'
      } else {
          storeType = signingConfig.storeType // "jks"
      }
  }
  signingConfig.storeType = storeType
}

for (def func : cdvPluginPostBuildExtras) {
  func()
}

// This can be defined within build-extras.gradle as:
//     ext.postBuildExtras = { ... code here ... }
if (hasProperty('postBuildExtras')) {
  postBuildExtras()
}

if (cordovaConfig.IS_GRADLE_PLUGIN_GOOGLE_SERVICES_ENABLED) {
  apply plugin: 'com.google.gms.google-services'
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

在你怀里撒娇 2025-02-08 08:51:23

您面临的错误与非常古老的Oracle Jet Tooling和更新的Cordova&amp; node.js版本,我不记得确切的是哪一个引起了问题。通常,起点是hybrid/scripts/hooks/jetinjector.js,这就是您的stacktrace应该引导您的地方。您有2个选项:

  • 降级node.js&amp; Cordova
  • 升级Oracle Jet,主要是工具

,以后还将从Project的Root和Hybrid的根部升级脚本,并修复fs.writefilesync调用,这是导致错误的原因。

另一个选项可能是您正在读取文件,然后重新编写文件并且不存在文件,因此写入失败是因为内容为null。尽管如此,升级Oracle喷气工具仍应修复任何损坏的路径。

考虑到所有因素,我将从jetInject.js开始,如果您不想更改所使用的版本,但是即使那样,您也可能会被迫升级为JET 5.0。 0和Jet Tooling 8.0.0(咕unt?!)已经使用了几年,在最新的Node.js Lts上运行。在ojet构建Cordova build上启用一些调试标志可能会为您提供有关项目中实际发生的事情的更多详细信息。

ps使用全局版本和另一个被列为DevDepentency的版本是不好的。尝试npx ojet服务Android -Device,它将调用您本地安装的ojet版本。

编辑:
寻找_getIndexhtmlPath_GetConfigxmlPath,这就是给我带来问题的原因。我必须从configxmlpath =“平台/android/res/xml” configxmlpath ='platforms/android/android/app/src/src/src/src/res/xml';,,我猜这是来自较新的Android SDK工具或Cordova或两者兼而有之。

The error you are facing is related to very old Oracle JET tooling and the newer Cordova & Node.js version, I can't recall exactly which one is causing the issue. Usually, the starting point is hybrid/scripts/hooks/jetInjector.js, that's where your stacktrace should lead you. You have 2 options:

  • downgrade Node.js & cordova
  • upgrade Oracle JET, mostly the tooling

The later will also upgrade the scripts from project's root and hybrid's root, fixing the fs.writeFileSync calls, which is what is causing the error.

Another option might be that you're reading a file and then re-writing it and the file doesn't exist, so writing fails because the content is null. Still, upgrading the Oracle JET tooling shall fix any broken paths.

All things considered, I'd start at jetInjector.js if you don't want to change the versions you're using, but even then, you'll probably be forced to upgrade as JET 5.0.0 and JET tooling 8.0.0 (with Grunt?!) are a few years old, running on latest Node.js LTS. Enabling some debug flags on ojet build or cordova build might give you more details about what's really happening in your project.

p.s. It's bad to use a global version and another version listed as devDependency. Try npx ojet serve android --device, which will invoke your locally installed ojet version.

EDIT:
Look for _getIndexHtmlPath or _getConfigXmlPath, that's what caused problems for me. I had to change from configXmlPath = "platforms/android/res/xml" to configXmlPath = 'platforms/android/app/src/main/res/xml';, which I'm guessing it's coming from newer Android SDK tools or cordova or both.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文