为什么Cordova/Phonegap会在我的Android版本代码后面添加8?

35

我目前正在开发一个Cordova项目,遇到了一个问题:我的项目版本号versionCode神秘地增加了8。例如: 我原来的版本号是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
  }
}

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

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

4个回答

22

好的,看起来这是Cordova版本5及以上中一个重要的未解决的问题。 这是票据链接。

当我从我的build.gradle中删除有问题的代码时,我没有遇到任何问题。


这很好。我以为自己犯了一个错误,但它仍然是在6.0.0中。 - Mathijs Segers
1
似乎最近修复已经合并到了cordova-android上,但还未发布(cordova-android 5.1.1版本还没有此修复)。 - jakub.g
7
这个问题在Cordova 6.2.0中似乎已经解决。但是,由于版本号不再添加额外的数字,我使用这个版本的Cordova构建的APK的版本号始终比以前的版本小,因此Google Play不接受这些APK。 - Ehsan Khaveh
澄清一下,这个问题已经在cordova-android 5.2.0中得到解决;cordova CLI版本并不重要。 - JW.

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

我的项目版本号后面附上了"8",并上传到Play商店。随后的构建似乎已经去掉了这个"8",这意味着我无法上传进一步更新 - cordova prepare命令会重新创建AndroidManifest.xml文件,覆盖对此文件的手动更改。

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

或者,在我的情况下,我在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!


如果没有自动方式,我更喜欢在gradle.properties中设置cdvVersionCode。 - Amil Waduwawara

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


谢谢你提供的钩子。你能告诉我如何将它添加到我的构建中吗?我仍然面临着同样的问题。你找到了其他解决方案吗? - krv
请在您的项目中创建以下文件:hooks/after_prepare/append_8_to_version_code.js。@krv - Leon
我误解了,我想删除数字 8。为什么会添加数字 8?你为谁撰写这篇文章,他们为什么要保留它? - krv
@krv 这是针对已经发布到应用商店的旧应用程序的。正如我所声称的那样,如果您在提交应用程序到应用商店时不保留结尾的“8”,则您的Android版本代码将比Cordova 5构建的先前版本小,您可能会遇到“版本代码降级问题”。 - Leon
是的,谢谢。目前,通过将版本代码添加到构建CLI命令中来解决versionCode问题,如下所示:cordova build android -- --versionCode=007 - krv
是的,这个解决方案只适用于那些想要保留8来解决应用上传问题的人。看起来你正在面临不同的问题。无论如何,你可以解决它。 - Leon

0

从./platforms/android/build.gradle中删除versionCode修改后,我的APK仍然附加了“8”的版本代码。

在新生成的APK中具有正确的versionCode之前,需要进行“cordova clean”操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接