2015-10-05 69 views
35

我目前正在研究一个Cordova项目,并且遇到了8个问题被神秘地附加到了我的项目的versionCode中。例如:我的原始版本的代码是100,新版本的代码是1008为什么Cordova/Phonegap将8添加到我的Android版本代码中?

我通过我的整个构建流水线跟踪的问题,同时发现在摇篮负责代码生成脚本。

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中的相应部分,或者是否存在此行为背后的隐藏感?

回答

21

O.K.似乎这是科尔多瓦版本5及以上的主要未解决的错误。 Here is the link to the ticket.

我从我的build.gradle

+0

这很好。我认为我犯了一个错误,它仍然在6.0.0 –

+0

最近似乎修复是[最近合并](https://github.com/apache/cordova-android/pull/270)到cordova-android,但还没有发布(cordova-android 5.1.1没有修复) –

+6

这似乎是在Cordova 6.2.0中修复的。但是,现在多余的数字不再附加到版本代码,我使用此版本的Cordova构建的APK版本代码总是比以前版本代码小,因此谷歌播放不接受这些APK。 – Ehsan

7

移除有问题的代码时没有问题的平台\机器人\的build.gradle脚本将添加4,2,8或9版本的文件依赖于有针对性的木构建筑 - arm/x86或android的目标api版本。

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

版本问题可以通过创建一个平台\机器人\ 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)正确写入用于构建的AndroidManifest.xml文件。

下行是不得不手动更新android版本,上传,可以上传apk!

+0

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

5

对于那些谁想要保持到底“8”,我有写一个after_prepare挂钩,使之方便,无需维护的Android的versionCode由@ChilledFlame手动提到config.xml中。注意:如果你没有保留最终'8',当你提交你的应用到appstore时,你的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

+0

感谢您的支持。你能告诉我如何将它添加到我的构建中。我仍然面临同样的问题。你有没有找到其他解决方案? – krv

+0

在你的项目中创建这个文件:hooks/after_prepare/append_8_to_version_code.js。 @krv – Leon

+0

我想知道我想删除8.为什么8被添加,为什么有人想保留它为你写这篇文章的人? – krv

0

从./platforms/android/build.gradle取出的versionCode修改后, “8” 仍然被追加到的versionCode在我的APK。

在新生成的APK将具有正确的versionCode之前,需要“cordova clean”。

相关问题