Почему Cordova/Phonegap добавляет 8 в мой код версии Android?

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

Я проследил проблему через весь мой конвейер сборки и нашел ответственный код в Gradle Build script.

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

Ответ 1

O.K. похоже, что это серьезная неразрешенная ошибка в Кордове версии 5 и выше. Вот ссылка на билет.

У меня не возникло проблем при удалении кода-нарушителя из моего build.gradle

Ответ 2

Платформы\android\build.gradle script добавят 4, 2, 8 или 9 к файлу версии, зависящему от целевого architecure - arm/x86 или целевой версии api для Android.

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

Проблема с версией может быть решена путем создания файла платформы \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 затем правильно записывается в файл AndroidManifest.xml, используемый для сборки.

Даунсайд должен вручную обновить версию Android, вверх, можно загрузить apk!

Ответ 3

Для тех, кто хочет сохранить конец "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

Ответ 4

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

"Кордовая чистая" требовалась до того, как вновь созданный APK будет иметь в нем правильный код версии.