2015-06-24 7 views
13

Creo un plug-in per Cordova e voglio modificare AndroidManifest per aggiungere un attributo nel tag "application". Conosco config-file per aggiungere un nuovo tag ma non trovo se riesco ad aggiornare un tag esistente.Aggiungere un attributo al tag "application" in AndroidManifest da un plug-in cordova

Per esempio, ho questo AndroidManifest:

<?xml version='1.0' encoding='utf-8'?> 
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.test.testCordova" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="CordovaApp" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize"> 
      <intent-filter android:label="@string/launcher_name"> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" /> 
</manifest> 

e voglio aggiungere android:isGame=true nel tag <application>.

Se non riesco a farlo dal plugin.xml, creerò un hook per modificare l'AndroidManifest da solo, ma spero che non sia necessario.

risposta

5

Ho concluso facendo un plugin hook che non sapevo esistesse. I hook plugin sono hook definiti nel plug-in e che possono essere chiamati prima o dopo l'aggiunta o la rimozione del plugin (quando si eseguono i comandi cli del cordova plugin o quando cordova aggiunge il plug-in alla piattaforma con il comando cordova platform add).

Non volevo usare ganci perché pensavo che gli hook dovessero essere posizionati in config.xml e non potevano essere collegati con un plugin.

Qui ho aggiunto questa riga nella sezione Android piattaforma del file plugin.xml (la mia richiesta era un po 'diverso rispetto al OP del ma il campione può aiutare in ogni caso):

<platform name="android"> 
     <hook type="before_plugin_install" src="scripts/androidBeforeInstall.js" /> 
... 
    </platform> 

E poi ho scritto il androidBeforeInstall.js script di aggancio:

module.exports = function(ctx) { 
    var fs = ctx.requireCordovaModule('fs'), 
     path = ctx.requireCordovaModule('path'), 
     xml = ctx.requireCordovaModule('cordova-common').xmlHelpers; 

    var manifestPath = path.join(ctx.opts.projectRoot, 'platforms/android/AndroidManifest.xml'); 
    var doc = xml.parseElementtreeSync(manifestPath); 
    if (doc.getroot().tag !== 'manifest') { 
     throw new Error(manifestPath + ' has incorrect root node name (expected "manifest")'); 
    } 

    //adds the tools namespace to the root node 
    doc.getroot().attrib['xmlns:tools'] = 'http://schemas.android.com/tools'; 
    //add tools:replace in the application node 
    doc.getroot().find('./application').attrib['tools:replace'] = 'android:label'; 

    //write the manifest file 
    fs.writeFileSync(manifestPath, doc.write({indent: 4}), 'utf-8'); 

}; 

E 'un po' più complesso di una semplice aggiunta di linee-config file in plugin.xml, ma una volta che hai il bene della sintassi può essere molto potente.

Edit:

Per qualche motivo solo con il gancio in before_plugin_install, l'AndroidManifest.xml è stato correttamente aggiornato durante la piattaforma di aggiungere, ma è stato restaurato al suo stato di default alla fine del platdorm add .

Come non ho potuto capire il motivo, ho aggiunto la seguente riga nel plugin.xml in modo che lo script venga avviato anche alla fine dell'aggiunta della piattaforma (gli hook fortunati definiti in plugin.xml possono essere eseguiti non solo quando aggiungi o rimuovi un plugin).

<hook type="after_platform_add" src="scripts/androidBeforeInstall.js" /> 
+1

Nel mio caso, utilizzo l'hook "before_compile" per aggiornare il manifest. – Shimrra

Problemi correlati