我目前正在开发一个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中的相应部分,或者这种行为背后是否有隐藏的意义?
答案 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
或者,在我的例子中,我在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”。