72 lines
2.0 KiB
Swift
72 lines
2.0 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|