为什么cordova/ Phonegap将8添加到我的Android版本代码?
我目前正在一个cordova项目上工作,并有神秘地附加到我的项目的versionCode 8的问题。 例如:我的原始版本代码是100,新的版本代码是1008
我通过我的整个构buildpipe道跟踪了这个问题,并在Gradle Build脚本中find了负责任的代码。
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中的相应部分,或者是否存在这种行为背后隐藏的感觉?
好吧,似乎这是cordova版本5及以上的主要未解决的错误。 这是链接到票。
从我的build.gradle中删除有问题的代码时没有问题
platform \ android \ build.gradle脚本将根据目标architecure – arm / x86或android的目标api版本将版本文件添加4,2,8或9。
我遇到了这样的情况:我的项目在版本号后面加了一个“8”,然后上传到Play商店。 进一步的构build似乎已经放弃了8,这意味着我无法上传更多的更新 – cordova prepare
命令重新创buildAndroidManifest.xml文件,覆盖对此的手动更改。
版本问题可以通过创build一个platforms \ android \ gradle.properties文件解决,内容为cdvVersionCode=13008
或者,在我的情况下,我插入一个android-versionCode属性到config.xml中:
<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)正确写入用于构build的AndroidManifest.xml文件。
下行是不得不手动更新的Android版本,上攻,可以上传apk!
对于那些想要保持'8'结尾的人,我写了一个after_prepare钩子使其变得简单,不需要在@CilledFlame手动提到的config.xml中维护android-versionCode。
注意:如果你不保留最后的'8',当你提交你的应用程序到appstore时,你的android版本代码比之前由Cordova 5build立的代码小,你可能会遇到“版本代码降级问题”。
在文件夹hooks/after_prepare/
下创build一个文件,添加下面的代码。
#!/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
从./platforms/android/build.gradle中删除versionCode修改后,“8”仍然被附加到我的APK中的versionCode。
在新生成的APK将具有正确的versionCode之前,需要“cordova clean”。