35

我目前正在开发一个 Cordova 项目,并且遇到的问题是 8 神秘地附加到了我的项目的 versionCode 中。例如:我原来的版本号是100,新的版本号是1008

我通过整个构建管道跟踪问题,并在 Gradle Build 脚本中找到了负责的代码。

if (Boolean.valueOf(cdvBuildMultipleApks)) {
    productFlavors {
        armv7 {
            versionCode cdvVersionCode ?: defaultConfig.versionCode + 2
            ndk {
                abiFilters "armeabi-v7a", ""
            }
        }
        x86 {
            versionCode cdvVersionCode ?: defaultConfig.versionCode + 4
            ndk {
                abiFilters "x86", ""
            }
        }
        all {
            ndk {
                abiFilters "all", ""
            }
        }
    }
} else if (!cdvVersionCode) {
  def minSdkVersion = cdvMinSdkVersion ?: privateHelpers.extractIntFromManifest("minSdkVersion")
  // Vary versionCode by the two most common API levels:
  // 14 is ICS, which is the lowest API level for many apps.
  // 20 is Lollipop, which is the lowest API level for the updatable system webview.
  if (minSdkVersion >= 20) {
    defaultConfig.versionCode += 9
  } else if (minSdkVersion >= 14) {
    defaultConfig.versionCode += 8
  }
}

我不确定为什么科尔多瓦认为更改我的版本代码是正确的,此外,我不确定这种行为是否正确......它不应该添加数字而不是附加它吗?

我可以只删除 build.gradle 中的相应部分,还是这种行为背后有一些隐藏的意义?

4

4 回答 4

22

好的,这似乎是 Cordova 版本 5 及更高版本中未解决的主要错误。这是门票的链接。

从我的 build.gradle 中删除有问题的代码时我没有问题

于 2015-10-05T14:52:18.950 回答
7

platform\android\build.gradle 脚本将根据目标架构 - arm / x86 或目标 android 的 api 版本将 4、2、8 或 9 添加到版本文件中。

我有一种情况,我的项目在版本号后面附加了一个“8”,然后它被上传到了 Play 商店。进一步的构建似乎已经放弃了 8,这意味着我无法上传进一步的更新 - 一个cordova prepare命令重新创建 AndroidManifest.xml 文件,覆盖对此的手动更改。

可以通过创建包含内容的platforms\android\gradle.properties 文件来解决版本问题cdvVersionCode=13008

或者,在我的例子中,我在 config.xml 中插入了一个 android-versionCode 属性:

<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="uk.co.my.app" android-versionCode="103008" version="1.3.0" xmlns="http://www.w3.org/ns/widgets" defaultlocale="en-GB">

然后将所需的 android 版本(在我的情况下为 103008)正确写入用于构建的 AndroidManifest.xml 文件。

缺点是必须手动更新android版本,优点是可以上传apk!

于 2016-09-01T20:10:29.243 回答
6

对于那些想要保持结尾'8'的人,我编写了一个 after_prepare 钩子以使其变得容易,无需维护@ChilledFlame 手动提到的 config.xml 中的 android-versionCode。

注意:如果你不保留结尾'8',当你将你的应用程序提交到应用商店时,你的android版本代码会比以前由Cordova 5构建的版本代码小,你可能会遇到“版本代码降级问题”。

在文件夹下创建一个文件hooks/after_prepare/,添加以下代码。

#!/usr/bin/env node

var path = require('path');
var fs = require('fs');
var xml2js = require('xml2js');

function xmlFileToJs(filename, cb) {
    var filepath = path.normalize(path.join(__dirname, filename));
    fs.readFile(filepath, 'utf8', function (err, xmlStr) {
        if (err) throw (err);
        xml2js.parseString(xmlStr, {}, cb);
    });
}

function jsToXmlFile(filename, obj, cb) {
    var filepath = path.normalize(path.join(__dirname, filename));
    var builder = new xml2js.Builder();
    var xml = builder.buildObject(obj);
    fs.writeFile(filepath, xml, cb);
}

var androidManifestRPath = '../../platforms/android/AndroidManifest.xml';
xmlFileToJs(androidManifestRPath, function(error, data) {
  var config = data;
  config.manifest.$['android:versionCode'] += '8';
  jsToXmlFile(androidManifestRPath, config)
});

或从此链接下载: append_8_to_version_code.js

于 2016-09-07T05:44:16.453 回答
0

从 ./platforms/android/build.gradle 中删除 versionCode 修改后,我的 APK 中的 versionCode 仍然附加一个“8”。

在新生成的 APK 中包含正确的 versionCode 之前,需要“cordova clean”。

于 2016-09-30T14:56:47.290 回答