import Testing import Foundation import AndroidXML struct Test { @Test func foo() async throws { // code for debugging. Run with Cmd+U // printXml(.t1, "AndroidManifest.xml") // printRes(.t1, 0x7F100000) // try allXmlForFolder(.t1) // try attrResolveEverything(.t1) print("done.") } private enum Pth: String { case t1 = "/path/to/unpacked/apk/dir/" } private func printXml(_ base: Pth, _ path: String) { print(try! AndroidXML(path: base.rawValue + "/" + path).parseXml().xmlString()) } private func printRes(_ base: Pth, _ id: UInt32) { let xml = try! AndroidXML(path: base.rawValue + "/resources.arsc").parseTable() let res = try! xml.getResource(TblTableRef(id))! let pkgPool = res.package.stringPool(for: .Keys)! for x in res.entries { let val = x.entry.value! print(pkgPool.getString(x.entry.key), val.resolve(xml.stringPool), x.config.screenType.density) } } private func allXmlForFolder(_ pth: Pth) throws { let xx = FileManager.default.enumerator(atPath: pth.rawValue + "/res/")! for x in xx.allObjects as! [String] { if !x.hasSuffix(".xml") { continue } // only process files which are binary-xml if let xml = try? AndroidXML(path: pth.rawValue + "/res/" + x) { print(x) let _ = try xml.parseXml().xmlString() } } } private func attrResolveEverything(_ pth: Pth) throws { let xml = try AndroidXML(path: pth.rawValue + "/resources.arsc").parseTable() for pkg in try xml.getPackages() { let pool = pkg.stringPool(for: .Keys)! try pkg.iterTypes { spec, types in //print("----- \(spec.id) ------") for type in types { try type.iterValues { idx, entry in if entry.isComplex { //print("::.::.complex", pool.getString(entry.key), entry.valueMap!.parent.asHex) for x in entry.valueMap!.entries { let _ = x.name.asHex let _ = x.value.resolve(xml.stringPool) } } else { let _ = pool.getString(entry.key) let _ = entry.value!.resolve(xml.stringPool) } } } } } } }