È 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)));
}
fonte
2017-08-22 07:46:13
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
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. –
@Gavin Quindi, in sostanza, stai cercando una risposta al codice che non dipenda dalle chiamate di sistema agli strumenti esterni, giusto? –