2015-10-05 3 views
35

В настоящее время я работаю над проектом в Кордове и столкнулся с проблемой, что 8 был добавлен таинственным образом в версию Код моего проекта. Например: Мой исходный код версии был 100, новый код версии 1008Почему Cordova/Phonegap добавляет 8 к моему коду версии Android?

Я отследил проблему через весь мой конвейер сборки и нашел ответственный код в сценарии 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 или есть какой-то скрытый смысл этого поведения?

ответ

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 5.1.1 нет исправления) –

+6

Это, похоже, исправлено в Cordova 6.2.0. Однако теперь, когда дополнительная цифра больше не добавляется к коду версии, APK, которые я создаю с использованием этой версии Кордовы, всегда имеет меньший код версии, чем предыдущие, и, следовательно, Google Play не принимает эти APK. – Ehsan

7

платформ \ Android \ build.gradle скрипт добавит 4, 2, 8 или 9 в файл версия зависит от целевой архитектуры; - arm/x86 или целевую версию андроида.

У меня была ситуация, когда в моем проекте было добавлено «8» к номеру версии, и это было загружено в магазин Play. Дальнейшие сборки, похоже, сбросили 8, что означало, что я не смог загрузить дополнительные обновления - команда cordova prepare воссоздает файл AndroidManifest.xml, переопределяя его вручную.

версия проблема может быть решена путем создания платформы \ Android \ gradle.properties файл с содержимым cdvVersionCode=13008

В качестве альтернативы, в моем случае, я вставил приписывать андроид-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

Я предпочитаю устанавливать cdvVersionCode в gradle.properties, если нет автоматического способа. –

5

Для тех, кто хочет сохранить конец «8», я написал крюк after_prepare, чтобы упростить его, не нужно поддерживать android-versionCode в файле config.xml вручную, указанном @ChilledFlame.

Примечание: если вы не сохраняете конец «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

После удаления модификаций VersionCode из ./platforms/android/build.gradle, "8" был еще добавляется к VersionCode в моем APK.

Необходимо, чтобы «кордовая чистая» была необходима, прежде чем вновь созданный APK будет иметь в нем правильный код версии.