为什么Cordova / Phonegap会在我的Android版本代码中附加8?

时间:2015-10-05 14:42:26

标签: android cordova build google-play automated-deploy

我目前正在开发一个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
  }
}

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

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

4 个答案:

答案 0 :(得分:22)

O.K。似乎这是Cordova Version 5及更高版本中一个未解决的主要错误。 Here is the link to the ticket.

从build.gradle

中删除有问题的代码时没有问题

答案 1 :(得分:7)

平台\ android \ build.gradle脚本会将4,2,8或9添加到依赖于目标架构的版本文件 - arm / x86或android的目标api版本。

我遇到的情况是我的项目的版本号附加了“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!

答案 2 :(得分:5)

对于那些想要结束的人来说,我已经编写了一个after_prepare钩子来简化,不需要在@ChilledFlame手动提到的config.xml中维护android-versionCode。 / p>

注意:如果您没有保留结束&#39; 8,当您将应用程序提交到appstore时,您的Android版本代码比之前由Cordova 5构建的版本小,您可能会遇到&#34 ;版本代码降级问题&#34;。

在文件夹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

答案 3 :(得分:0)

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

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