我目前正在使用Cordova 3.4.0和CLI来构建我的项目,使用以下命令来定位android:
cordova build android
OR
cordova build android --release
我的config.xml具有以下指定:
<widget id="com.example.myapp"
version="0.0.3"
versionCode="2"
...
>
</widget>
myapp / platforms / android 中生成的AndroidManifest.xml未使用config.xml中指定的版本和版本代码进行更新。它保持默认值:
<manifest
android:versionCode="1"
android:versionName="1.0"
...
</manifest>
这是一个错误吗?或者是否有其他方法我应该在config.xml中为Android指定versionCode和versionName?即便如此,我是否可以使用钩子在构建之前使用正确的版本更新AndroidManifest.xml?
我希望每次我希望它更改时都不必手动更新:
由于这些原因,我希望在config.xml中设置版本号。有什么想法吗?
由于
答案 0 :(得分:56)
最后使用Cordova 3.5.0-0.2.4
我将此属性添加到<widget>
节点config.xml
android-versionCode="10"
并且AndroidManifest.xml
已正确更新为
android:versionCode="10"
答案 1 :(得分:5)
versionName在这里应该不是问题,因为它从config.xml复制到platforms / android中的AndroidManifest.xml文件(至少在Cordova 3.4.0上)。那部分我没有问题。
但是,增加版本代码是一项非常重要的任务。实际上,我在Grunt的Gruntfile.js中添加了一系列任务。
这是string-replace任务。 “ grunt string-replace:versionCode ”将增加存储在package.json中的versionCode。 “ grunt string-replace:androidVersionCode ”将获取该值并将其放入platforms / 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 任务递增。我将行放在以“version”开头的行之后的package.json中:
让这个工作的一个重要技巧是确保不要调用“cordova build android”而是调用“cordova prepare android”,然后“grunt replace-string:androidVersionCode”,然后“cordova编译android”。 Build只是调用“prepare”然后“编译”的快捷方式,而这两个任务之间就是你必须修改AndroidManifest.xml文件以防止它被覆盖,似乎。
我的构建过程要复杂得多,因为我实际上使用grunt-bump为Grunt增加package.json中的版本值,然后使用xmlpoke将其注入config.xml,用于Grunt和我的页面使用 string-replace 。我使用grunt-shell来实际调用所有Cordova构建步骤,以便将所有内容复制到它所在的位置并以正确的顺序运行。
如果有帮助,请告诉我。
答案 2 :(得分:5)
根据 MichaelOryl 的回答,我使用cordova 3.4并使用bash工具XMLStarlet
实现了一些功能。基本上它从AndroidManifest.xml中的config.xml复制versionCode属性的值
而不是运行:
cordova build android --release
运行[应该成为一个脚本]:
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
通过这种方式,当我升级到cordova 3.5时,我可以重复使用通常的&cordova build android --release&#39;
答案 3 :(得分:1)
我使用cordova-custom-config插件解决了这个问题,然后在
中的config.xml中解决了这个问题<platform name="android">
把
<preference name="android-manifest/@android:versionCode" value="108" />
将值更改为所需的版本代码...
它对我来说很完美。
答案 4 :(得分:0)
在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中,它不会更新。然后当你进行发布版本时,它将为你生成新的版本代码。
答案 5 :(得分:0)
如果有人还在绊倒这个: 目前最新的cordova版本(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">
然后将其运行到&#39;它(例如在你的发布脚本中使用):
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
呀,肮脏但有效:)
答案 6 :(得分:0)
您无需更改AndroidManifest.xml,因为它是由cordova自己生成的,因此您在Manifest中的每个更改都会被cordova还原
所有它负责的是build.gradle位于平台文件夹
file - &gt;平台/的build.gradle
搜索
if(minSdkVersion&gt; = 20){defaultConfig.versionCode + = 9}否则if(minSdkVersion = 14){defaultConfig.versionCode + = 8}
因为您的版本代码从此更新,您可以更改它或硬编码