您可能會發現許多命令行工具可用於編譯和反編譯Android的xml文件。這些工具結合了幾種構建工具,包括aapt (Android Asset Packaging Tools)查看,創建和更新Zip兼容檔案(zip,jar,apk)。由於此工具是Android SDK的一部分,因此在Java中沒有本地實現。
幸運的是,self-compile-Android存儲庫中有所有必需的文件Java Native Interface (JNI)。他們已準備好從Android應用程序內部使用,並且能夠自我編譯,突變和病毒式傳播。
這裏可用的本機模塊的應用程序的列表:
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
如果您在源仔細觀察,你會發現執行使用原生JNI文件AAPT命令的應用:
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 + ")");
}
}
現在,通過示例代碼來了解功能是如何實現的。例如,要更改清單文件中的值,
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)));
}
有這太問題的資源,以XML https://stackoverflow.com/a/4761689/4307644他很不錯的格式發表評論解碼AXML。我們所需要的是對未知數據的「黑客」部分進行逆向工程,然後扭轉這個人的過程。這裏遲到了,所以我會在早上看看它。但希望有更多時間的人可以在此之前使用此資源並提供幫助。 – MeetTitan
爲了讓賞金更清晰一些,@MeetTitan建議符合接收賞金的標準。像aapt,apktool等工具在他們「工作」的時候不會產生預期的結果。 –
@Gavin所以基本上你正在尋找一個不依賴於sys調用外部工具的代碼答案,對吧? –