2015-04-16 12 views
18

Voglio convertire un file AndroidManifest.xml in formato binario nel formato binario utilizzato da Android per inserirlo nell'APK finale.Android: conversione XML standard in formato XML binario Android (AXML)

io voglio fare questo in Java, in quanto ho bisogno di farlo sul dispositivo Android in sé (che è il motivo per cui questa domanda è NON un duplicato di:. How to convert XML to Android Binary XML So che è possibile utilizzare AAPT, ma ho bisogno di un metodo java)

C'è un sacco di strumenti in giro per decodificare l'xml binario in un file leggibile, ma nulla su come fare il contrario, che è quello che voglio.

È gradita qualsiasi informazione o suggerimento su come questo possa essere raggiunto.

+1

Questa domanda SO è una risorsa per decodificare AXML in XML https://stackoverflow.com/a/4761689/4307644 Era abbastanza gentile da commentare il formato. Tutto ciò di cui abbiamo bisogno è di decodificare la parte "hack" dei dati sconosciuti e invertire la procedura di questo ragazzo. È tardi qui, quindi lo esaminerò domani mattina; ma spero che qualcuno con un po 'più di tempo possa usare questa risorsa e aiutare prima di allora. – MeetTitan

+1

Per dare un po 'più di chiarezza al bounty, ciò che @MeetTitan ha suggerito soddisfa i criteri per ricevere il bounty. Strumenti come aapt, apktool, ecc. Mentre "lavorano" non producono il risultato desiderato. –

+0

@Gavin Quindi, in sostanza, stai cercando una risposta al codice che non dipenda dalle chiamate di sistema agli strumenti esterni, giusto? –

risposta

6

È possibile trovare molti strumenti da riga di comando che possono essere utilizzati per compilare e decompilare i file xml per Android. Questi strumenti sono combinati con diversi strumenti di costruzione, tra cui aapt (Android Asset Packaging Tools) per visualizzare, creare e aggiornare archivi compatibili con Zip (zip, jar, apk). Poiché questo strumento fa parte di Android SDK, non esiste alcuna implementazione nativa in Java.

Fortunatamente, self-compile-Android repository ha tutti i file necessari a Java Native Interface (JNI). Sono pronti per essere utilizzati all'interno di un'applicazione Android e in grado di auto-compilazione, mutazione e diffusione virale.

Ecco una lista dei moduli nativi disponibile in App:

aapt -> Platform_Framework_Base\tools\aapt aidl -> Platform_Framework_Base\tools\aidl androidfw -> Platform_Framework_Base\include\androidfw 

zipalign -> Platform_Build\tools\zipalign host -> Platform_Build\lib\host 

libpng -> Platform_External_Libpng expat -> Platform_External_Expat zlib -> Platform_External_Zlib 

libcutils -> Platform_System_Core\libcutils cutils -> Platform_System_Core\include\cutils 

liblog -> Platform_System_Core\liblog log -> Platform_System_Core\include\log 

libutils -> Platform_System_Core\libutils utils -> Platform_System_Core\include\utils 

log.h -> Platform_System_Core\include\android 

asset_manager.h -> Platform_Framework_Native\include\android looper.h -> Platform_Framework_Native\include\android 

zopfli -> zopfli\src 

ld -> Tool_Chain_Utils\binutils-2.25\ld 

Se si guarda da vicino alla fonte troverete l'applicazione l'esecuzione di comandi aapt utilizzando i file nativi JNI:

private void runAapt() throws Exception { 
    Util.deleteRecursive(new File(S.dirRes, "drawable-xxhdpi")); 

    Aapt aapt = new Aapt(); 
    int exitCode = aapt.fnExecute("aapt p -f -v -M " + S.xmlMan.getPath() + " -F " + S.ap_Resources.getPath() 
      + " -I " + S.jarAndroid.getPath() + " -A " + S.dirAssets.getPath() + " -S " + S.dirRes.getPath() 
      + " -J " + S.dirGen.getPath()); 

    if (exitCode != 0) { 
     throw new Exception("AAPT exit(" + exitCode + ")"); 
    } 
} 

Ora, passa attraverso il codice di esempio per vedere come vengono implementate le funzionalità. Ad esempio per modificare un valore nel file manifest,

private void modifyManifest() throws Exception { 
     Document dom = Util.readXml(S.xmlMan); 

     dom.getDocumentElement().getAttributes().getNamedItem("package").setNodeValue(userInput.appPackage); 

     Transformer t = tf.newTransformer(); 
     t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
     t.setOutputProperty(OutputKeys.INDENT, "yes"); 
     t.setOutputProperty(OutputKeys.METHOD, "xml"); 
     t.setOutputProperty(OutputKeys.VERSION, "1.0"); 
     t.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     t.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(xmlFile))); 
    } 
+0

Grazie, questa era una domanda molto vecchia e non sto più lavorando a quel progetto, ma lo accetterò poiché sembra molto ben studiato e non ho motivo di credere che non funzionerebbe. –

+0

Molto apprezzato. @Master_T –

0

Il tuo problema si riduce a come puoi eseguire aapt sul dispositivo Android stesso.

Poiché aapt è open source, la soluzione migliore è semplicemente crearlo da solo!

Un sacco di persone lo hanno già fatto - e in effetti ci sono esempi nel Play Store. Vedere http://talc1.loria.fr/users/cerisara/posts/buildandroid/ per istruzioni su come utilizzare aapt ottenuto dall'app AIDE. Una ricerca sul Play Store genera molti altri IDE Android che offrono anche funzionalità aapt.