Files
AndroidXML/Tests/AndroidXMLTests/Test.swift
2025-11-25 22:46:14 +01:00

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)
}
}
}
}
}
}
}