Sie können viele Befehlszeilenprogramme finden, mit denen Sie die XML-Dateien für Android kompilieren und dekompilieren können. Diese Tools sind aus verschiedenen Build-Tools kombiniert, einschließlich aapt (Android Asset Packaging Tools) zum Anzeigen, Erstellen und Aktualisieren Zip-kompatiblen Archiven (zip, jar, apk). Da dieses Tool Teil des Android SDK ist, gibt es keine native Implementierung in Java.
Glücklicherweise hat self-compile-Android Repository alle erforderlichen Dateien in Java Native Interface (JNI). Sie sind bereit, in einer Android-App verwendet zu werden und können sich selbst kompilieren, mutieren und verbreiten.
Hier ist eine Liste der verfügbaren nativen Module in der 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
Wenn Sie genau an der Quelle suchen werden Sie die App ausführen aapt Befehle mit Hilfe der nativen jni Dateien:
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 + ")");
}
}
Gehen Sie nun durch den Beispielcode, um zu sehen, wie die Funktionalitäten implementiert werden. Um zum Beispiel einen Wert in der Manifest-Datei zu ändern,
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)));
}
Es gibt diese SO Frage als Ressource für die Decodierung von AXML zu XML https://Stackoverflow.com/a/4761689/4307644 Er war nett genug, um das Format zu kommentieren. Alles, was wir brauchen, ist, den "Hack" -Teil unbekannter Daten rückzuentwickeln und dann den Prozess dieses Typen umzukehren. Es ist spät hier, also werde ich morgens nachsehen; aber hoffentlich kann jemand mit etwas mehr zeit diese ressource benutzen und vorher helfen. – MeetTitan
Um ein bisschen mehr Klarheit über das Kopfgeld zu geben, erfüllt das von @MeetTitan vorgeschlagene Kriterium die Kriterien für das Erhalten des Kopfgelds. Werkzeuge wie aapt, apktool usw., während sie "arbeiten", führen nicht zum gewünschten Ergebnis. –
@Gavin Also im Grunde suchen Sie nach einer Code-Antwort, die nicht auf sys Anrufe an externe Tools abhängt, nicht wahr? –