現在、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でバージョン番号を設定したいと思います。何か案は?
ありがとう
最後にCordova 3.5.0-0.2.4
でこの属性を<widget>
ノードconfig.xml
に追加しました
Android-versionCode="10"
AndroidManifest.xml
は適切に更新されました
Android:versionCode="10"
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'を再利用できます
versionNameは、config.xmlからplatforms/Android(少なくともCordova 3.4.0では)のAndroidManifest.xmlファイルにコピーされるため、ここでは問題になりません。その部分は問題ありませんでした。
ただし、versionCodeをインクリメントすることは非常に困難な作業でした。実際、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 compile Android」。ビルドは「prepare」を呼び出してから「compile」を呼び出すためのショートカットであり、これら2つのタスクの間にAndroidManifest.xmlファイルを変更して上書きされないようにする必要がある場合です。
実際にpackage.jsonのバージョン値を grunt-bump で増やしてからそれを注入するため、ビルドプロセスははるかに複雑ですconfig.xmlを使用して xmlpoke Gruntとstring-replaceを使用してページについて grunt-Shell を使用して、すべてのCordovaビルドステップを実際に呼び出して、すべてをコピーし、正しい順序で実行します。
これが役立つかどうか教えてください。
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では更新されません。その後、リリースビルドを取得すると、新しいバージョンコードが生成されます。
誰かがまだこの問題につまずいている場合:現在の最新の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">
そして、これを実行します(たとえば、release-スクリプトで使用します):
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はcordova自体によって生成されるため、マニフェストでのすべての変更がcordovaによって元に戻されるため、変更する必要はありません。
そして、それはすべて、プラットフォームフォルダにあるbuild.gradleに責任があります
ファイル-> platform/build.gradle
検索する
if(minSdkVersion> = 20){defaultConfig.versionCode + = 9} else if(minSdkVersion = 14){defaultConfig.versionCode + = 8}
ここからバージョンコードが更新されるので、変更するか、ハードコードすることができます