Como fazer com que o Cordova 3.4.0 defina o nome/código da versão do Android na compilação?
Pergunta
Atualmente estou usando o Cordova 3.4.0 e a CLI para construir meu projeto direcionado ao Android usando o comando:
cordova build android
OU
cordova build android --release
Meu config.xml tem o seguinte especificado:
<widget id="com.example.myapp"
version="0.0.3"
versionCode="2"
...
>
</widget>
O AndroidManifest.xml resultante em meuapp/plataformas/android não é atualizado com a versão e o código de versão especificados em config.xml.Permanece como padrão:
<manifest
android:versionCode="1"
android:versionName="1.0"
...
</manifest>
Isso é um inseto?Ou há alguma outra maneira de especificar versionCode e versionName para Android no config.xml?Mesmo talvez, exista um gancho que eu possa usar para atualizar o AndroidManifest.xml com a versão correta antes da compilação?
Prefiro não ter que atualizar isso manualmente toda vez que quiser mudar como:
- É propenso a erros e complicado
- Não será uma mudança óbvia para desenvolvedores desconhecidos
- Nenhuma das pastas da plataforma é armazenada no controle de origem
Por esses motivos, gostaria que os números de versão fossem definidos no config.xml.Alguma ideia?
Obrigado
Solução
Finalmente com Cordova 3.5.0-0.2.4
Eu adicionei esse atributo ao <widget>
nó config.xml
android-versionCode="10"
e a AndroidManifest.xml
foi devidamente atualizado para
android:versionCode="10"
Outras dicas
seguindo a resposta de Michael Oryl há algo que implementei usando cordova 3.4 e usando a ferramenta bash XMLStarlet
Basicamente ele copia o valor do atributo versionCode de config.xml em AndroidManifest.xml
Em vez de executar isso:
cordova build android --release
execute [deve se tornar um 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
Desta forma, quando eu atualizar para o cordova 3.5, posso reutilizar o usual 'cordova build android --release'
versionName não deve ser um problema aqui, pois é copiado de config.xml para o arquivo AndroidManifest.xml em plataformas/Android (pelo menos no Cordova 3.4.0).Essa parte eu não tive problema.
Aumentar o versionCode, porém, foi uma tarefa e tanto.Na verdade, uma série de tarefas que adicionei ao Gruntfile.js do Grunt.
Isto é o substituição de string tarefa."grunhido string-replace:versionCode"incrementará o versionCode armazenado em package.json."grunhido string-replace:androidVersionCode" pegará esse valor e o colocará no arquivo plataformas/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'
}
}
}
Isso exige isso a ser chamado a partir do arquivo Gruntfile.js antes do uso, é claro (assim como npm install grunt-string-replace):
grunt.loadNpmTasks('grunt-string-replace');
Você precisará adicionar uma linha como o seguinte em seu arquivo package.json para que tudo funcione:
"androidVersionCode": "13", // or whatever value is current for you
Ele será incrementado pelo substituição de string:versionCode tarefa acima.Coloquei a linha em package.json após a linha que começa com “version”:
Um truque importante para fazer isso funcionar é garantir que, em vez de chamar "cordova build android", você chame "cordova prepare android", depois "grunt replace-string:androidVersionCode" e depois "cordova compile android".Build é apenas um atalho para chamar "preparar" e depois "compilar", e entre essas duas tarefas é quando você precisa modificar o arquivo AndroidManifest.xml para evitar que ele seja substituído, ao que parece.
Meu processo de construção é muito mais complicado porque na verdade estou incrementando o valor da versão em package.json com grunhido para Grunt e depois injetar isso em config.xml usando xmlpoke para Grunt e minha página sobre usando substituição de string.eu uso grunhido para realmente chamar todas as etapas de construção do Cordova para que tudo seja copiado para onde vai e seja executado na ordem certa.
Avise-me se isso ajudar.
eu corrigi esse problema usando o plugin cordova-custom-config e, em seguida, em config.xml dentro do
<platform name="android">
colocar
<preference name="android-manifest/@android:versionCode" value="108" />
altere o valor para o código da versão desejada...
Funcionou perfeitamente para mim.
edite o código da versão em 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">
altere o código da versão aqui, não no config.xml, ele não será atualizado. Então, quando você fizer uma versão de lançamento, ele gerará um novo código de versão para você.
Caso alguém ainda esteja tropeçando neste:ainda é verdade no momento versão mais recente do Cordova (6.4.0).Se você não tiver algum Jenkins ou outro processo para fazer isso, você pode colocar o código da versão em sua própria linha
<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">
e, em seguida, execute isso para aumentá-lo (por exemplo,use em seu script de lançamento):
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
Sim, sujo, mas funciona :)
Você não precisa alterar o AndroidManifest.xml, pois ele é gerado pelo próprio cordova, portanto, todas as suas alterações no Manifest são revertidas pelo cordova
E tudo isso é responsável pelo build.gradle localizado na pasta da plataforma
arquivo -> plataforma/build.gradle
Procurar
if (minSdkVersion >= 20) {defaultConfig.versionCode += 9} else if (minSdkVersion = 14) { defaultConfig.versionCode += 8 }
como o código da sua versão é atualizado a partir daqui, você pode alterá-lo ou codificá-lo