2015-04-16 6 views
18

Ich möchte eine unverschlüsselte AndroidManifest.xml-Datei in das binäre Format konvertieren, das Android verwendet, um es in der endgültigen APK zu verpacken.Android: Konvertieren von Standard-XML in Android Binär-XML-Format (AXML)

Ich möchte dies in Java tun, da ich es auf dem Android-Gerät tun müssen selbst (weshalb diese Frage NICHT ist ein Duplikat. How to convert XML to Android Binary XML Ich weiß, Sie AAPT verwenden können, aber ich brauche ein Java-Methode)

Es gibt viele Tools um die binäre XML in eine lesbare Datei zu dekodieren, aber nichts, wie das Gegenteil zu tun, was ich will.

Alle Informationen oder Hinweise, wie dies erreicht werden könnte, sind willkommen.

+1

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

+1

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. –

+0

@Gavin Also im Grunde suchen Sie nach einer Code-Antwort, die nicht auf sys Anrufe an externe Tools abhängt, nicht wahr? –

Antwort

6

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))); 
    } 
+0

Danke, das war eine sehr alte Frage und ich arbeite nicht mehr an diesem Projekt, aber ich werde es akzeptieren, da es sehr gut erforscht aussieht und ich keinen Grund habe zu glauben, dass es nicht funktionieren würde. –

+0

Sehr geschätzt. @Master_T –

0

Ihr Problem läuft darauf hinaus, wie Sie aapt auf dem Android-Gerät selbst ausführen können.

Da aapt Open Source ist, ist die beste Lösung, es einfach selbst zu bauen!

Viele Leute haben das schon getan - und tatsächlich gibt es Beispiele im Play Store. Anweisungen zur Verwendung von aapt aus der AIDE-App finden Sie unter http://talc1.loria.fr/users/cerisara/posts/buildandroid/. Eine Suche im Play Store bietet viele weitere Android-IDEs, die auch eine funktionierende Funktionalität bieten.

Verwandte Themen