Ответ 1
Наконец, с Cordova 3.5.0-0.2.4
я добавил этот атрибут в <widget>
node config.xml
android-versionCode="10"
и AndroidManifest.xml
был правильно обновлен до
android:versionCode="10"
В настоящее время я использую Cordova 3.4.0 и CLI для создания моего проекта для целевого андроида с помощью команды:
cordova build android
ИЛИ
cordova build android --release
В моем config.xml указано следующее:
<widget id="com.example.myapp"
version="0.0.3"
versionCode="2"
...
>
</widget>
Полученный AndroidManifest.xml в myapp/platform/android не обновляется с версией и кодом версии, указанным в файле config.xml. Он остается по умолчанию:
<manifest
android:versionCode="1"
android:versionName="1.0"
...
</manifest>
Это ошибка? Или есть какой-то другой способ, который я должен указать versionCode и versionName для Android в файле config.xml? Даже возможно, есть ли крючок, который я могу использовать для обновления AndroidManifest.xml с правильной версией перед сборкой?
Я бы предпочел не обновлять это вручную каждый раз, когда я хочу, чтобы он изменился как:
По этим причинам я хотел бы, чтобы номера версий были установлены в файле config.xml. Любые идеи?
Спасибо
Наконец, с Cordova 3.5.0-0.2.4
я добавил этот атрибут в <widget>
node config.xml
android-versionCode="10"
и AndroidManifest.xml
был правильно обновлен до
android:versionCode="10"
versionName здесь не должно быть проблемой, поскольку он копируется из файла config.xml в файл AndroidManifest.xml в платформах /android (по крайней мере, на Cordova 3.4.0). В этой части у меня не было проблем.
Получение версии CodeCode, тем не менее, было довольно сложной задачей. На самом деле, ряд задач, которые я добавил в Grunt Gruntfile.js.
Это строка-замена. "grunt string-replace: versionCode" будет увеличивать версию Version, сохраненную в package.json. "grunt string-replace: androidVersionCode" примет это значение и поместит его в файл platform/android/AndroidManifest.xml:
// STRING-REPLACE
'string-replace': {
versionCode: { // update the version code stored in package.json
options: {
replacements: [
{
pattern: /['"]androidVersionCode['"]:.*?['"](\d*)['"]/ig,
replacement: function (match, p1, offset, string) {
return '"androidVersionCode": "' + (parseInt(p1) + 1) + '"';
}
}
]
},
files: {
'package.json': 'package.json'
}
},
androidVersionCode: { // update the version code stored in AndroidManifest.xml
options: {
replacements: [
{
pattern: /android:versionCode=['"](\d*)['"]/ig,
replacement: function (match, p1, offset, string) {
var pkg = grunt.file.readJSON('package.json');
grunt.log.writeln("pkg.androidVersionCode: " + pkg.androidVersionCode);
grunt.log.writeln('Returning: ' + 'android:versionCode="' + pkg.androidVersionCode + '"');
return 'android:versionCode="' + pkg.androidVersionCode + '"';
}
}
]
},
files: {
'platforms/android/AndroidManifest.xml': 'platforms/android/AndroidManifest.xml'
}
}
}
Он требует, чтобы этот вызывался из файла Gruntfile.js перед использованием, конечно (а также npm install grunt-string-replace):
grunt.loadNpmTasks('grunt-string-replace');
Вам нужно добавить строку, такую как следующее, в файл package.json для этого:
"androidVersionCode": "13", // or whatever value is current for you
Он будет увеличиваться с помощью задачи string-replace: versionCode выше. Я поместил строку в package.json после строки, которая начинается с "версии":
Важным трюком, чтобы заставить это работать, - убедиться, что вместо вызова "corova build android" вы называете "cordova prepare android", затем "grunt replace-string: androidVersionCode" и затем "кордова компилирует андроид". Build - это просто ярлык для вызова "подготовить", а затем "скомпилировать", и между этими двумя задачами возникает необходимость изменить файл AndroidManifest.xml, чтобы он не был перезаписан. Кажется.
Мой процесс сборки намного сложнее, потому что я фактически увеличиваю значение версии в package.json с grunt-bump для Grunt, а затем вводя это в config.xml с помощью xmlpoke для Grunt и моей страницы, используя string-replace. Я использую grunt-shell, чтобы на самом деле вызвать все шаги сборки в Кордове, чтобы все было скопировано туда, где оно было, и выполнялось в правильном порядке.
Сообщите мне, если это поможет.
после ответа MichaelOryl есть что-то, что я реализовал с помощью cordova 3.4 и с помощью инструмента bash XMLStarlet
В основном он копирует значение атрибута versionCode из файла config.xml в AndroidManifest.xml
Вместо этого:
cordova build android --release
run [должен стать script]:
cordova prepare android
# grab version code from config.xml
VERSION_CODE=$(xmlstarlet sel -t -v "//@versionCode" "config.xml")
# write correct version code in manifest
xmlstarlet ed -L -u "/manifest/@android:versionCode" -v "$VERSION_CODE" "platform/android/AndroidManifest.xml"
cordova compile android --release
Таким образом, когда я обновляюсь до кордовы 3.5, я могу повторно использовать обычную сборку android -re cordoid build -release
Я исправил эту проблему, используя плагин cordova-custom-config, а затем в файле config.xml внутри
<platform name="android">
положить
<preference name="android-manifest/@android:versionCode" value="108" />
измените значение на желаемый код версии...
Это сработало отлично.
изменить код версии в AndroidManifest.xml(/platforms/android/AndroidManifest.xml)
<manifest android:hardwareAccelerated="true" android:versionCode="2"android:versionName="0.0.2" package="com.ionicframework.zinescreen841178" xmlns:android="http://schemas.android.com/apk/res/android">
измените код версии здесь, а не в файле config.xml, он не будет обновлен. Затем, когда вы выполните сборку релизов, он будет генерировать для вас новый код версии.
Если кто-то все еще спотыкается над этим: это по-прежнему актуально на текущей последней версии кордовы (6.4.0). Если у вас нет Jenkins или другого процесса для этого, вы можете поместить код версии в свою собственную строку
<widget id="com.example.yourapp"
android-versionCode="1112"
version="1.1.3"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
а затем запустите это, чтобы выполнить его (например, использовать в своем выпуске script):
VersionCode=`cat config.xml | grep android-versionCode | sed -e 's/.*android-versionCode=\"\(.*\)\"/\1/'`
VersionCode=$((VersionCode+1))
sed -i "s/.*android-versionCode=\"\(.*\)\"/ android-versionCode=\"$VersionCode\"/" config.xml
Я, грязный, но работает:)
Вам не нужно менять файл AndroidManifest.xml, поскольку он генерируется самой кордовой, поэтому каждый ваш изменения в манифесте возвращаются кордовой.
И все это отвечает за сборщик build.gradle, расположенный в папке платформы
file → platform/build.gradle
Поиск
if (minSdkVersion >= 20) {defaultConfig.versionCode + = 9} else if (minSdkVersion = 14) {defaultConfig.versionCode + = 8}
поскольку ваш код версии обновляется отсюда, вы можете изменить его или выполнить жесткий код