Como fazer com que o Cordova 3.4.0 defina o nome/código da versão do Android na compilação?

StackOverflow https://stackoverflow.com//questions/23001780

  •  20-12-2019
  •  | 
  •  

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:

  1. É propenso a erros e complicado
  2. Não será uma mudança óbvia para desenvolvedores desconhecidos
  3. 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

Foi útil?

Solução

Finalmente com Cordova 3.5.0-0.2.4 Eu adicionei esse atributo ao <widget>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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top