找这个的人肯定知道这是干什么的。没错,我花了半天时间将Java代码改写成了Delphi,在D2007下调试通过。
用法很简单,将APK文件改名成.zip,就可以解压缩了。解压以后可以看到很多文件,其中有很多是.xml后缀的。打开发现全是乱码。是的,你现在需要AXMLPrinter了。
比如我们知道,其中的AndroidManifest.XML文件存放了一个APK的包名、版本号、版本代码、权限等信息,你可以使用 TXmlPullParser.ReadAndroidManifestFile 来读取出这些信息。你也可以参考ReadAndroidManifestFile的写法,写出自己的处理代码,获取更多的信息。
甚至你可以配合unZip的模块,直接读取APK中指定XML文件。
{*******************************************************} { } { AXMLPrinter (Android XML反编译) } { } { 版权所有 (C) 2015 YangYxd } { } {*******************************************************} unit YxdAXMLPrinter; interface uses SysUtils, Classes; const CHUNK_TYPE = $1C0001; CHUNK_AXML_FILE = 524291; CHUNK_RESOURCEIDS = 524672; CHUNK_XML_FIRST = 1048832; CHUNK_XML_START_NAMESPACE = 1048832; CHUNK_XML_END_NAMESPACE = 1048833; CHUNK_XML_START_TAG = 1048834; CHUNK_XML_END_TAG = 1048835; CHUNK_XML_TEXT = 1048836; CHUNK_XML_LAST = 1048836; const RADIX_MULTS: array [0..3] of Double = ( 0.0039063, 3.051758E-005, 1.192093E-007, 4.656613E-010); DIMENSION_UNITS: array [0..7] of String = ( 'px', 'dip', 'sp', 'pt', 'in', 'mm', '', ''); FRACTION_UNITS: array [0..7] of String = ( '%', '%p', '', '', '', '', '', ''); type TIntegers = array of Integer; type TIntReader = class(TObject) private FStream: TStream; FBigEndian: Boolean; FPosition: Integer; protected public constructor Create; overload; constructor Create(AStream: TStream; bigEndian: Boolean); overload; constructor Create(const AFileName: string; bigEndian: Boolean); overload; destructor Destroy; override; procedure reset(AStream: TStream; bigEndian: Boolean); procedure Close(); function readByte(): ShortInt; function readShort(): ShortInt; function readInt(): Integer; overload; function readInt(ALen: Integer): Integer; overload; function readIntArray(ALen: Integer): TIntegers; overload; procedure readIntArray(var AData: TIntegers); overload; procedure readIntArray(var AData: TIntegers; AOffset, ALen: Integer); overload; function readByteArray(ALen: Integer): TBytes; procedure skip(bytes: Integer); procedure skipInt(); function available(): Integer; property Stream: TStream read FStream; property IsBigEndian: Boolean read FBigEndian write FBigEndian; property Position: Integer read FPosition write FPosition; end; type TStringBlock = class private FStringOffset: TIntegers; FStrings: TIntegers; function GetCount: Integer; function GetString(index: Integer): string; protected FStyleOffset: TIntegers; FStyles: TIntegers; public constructor Create(); destructor Destroy; override; class function read(reader: TIntReader): TStringBlock; function find(const str: string): Integer; function getShort(const datas: TIntegers; offset: Integer): Integer; property Count: Integer read GetCount; property Items[index: Integer]: string read GetString; end; type TNamespaceStack = class; TXmlPullParser = class(TObject) private m_operational: Boolean; m_strings: TStringBlock; m_reader: TIntReader; m_resourceIDs: TIntegers; m_namespaces: TNamespaceStack; m_decreaseDepth: Boolean; m_event: Integer; m_lineNumber: Integer; m_name: Integer; m_namespaceUri: Integer; m_attributes: TIntegers; m_idAttribute: Integer; m_classAttribute: Integer; m_styleAttribute: Integer; procedure doNext(); protected public constructor Create; virtual; destructor Destroy; override; procedure Open(AStream: TStream); overload; procedure Open(const AFileName: string); overload; procedure Close(); class function getPackage(id: Integer): string; class function complexToFloat(complex: Integer): Double; // 读取 APK 文件中zip解压后的 AndroidManifest.xml 文件获取基本 // 信息 (包名、版本名称、版本代码) class function ReadAndroidManifestFile(const AFileName: string; var packageName, versionName: string; var versionCode: Integer): Boolean; overload; // 读取 APK 文件中zip解压后的 AndroidManifest.xml 文件获取基本 // 信息 (包名、版本名称、版本代码) class function ReadAndroidManifestFile(AStream: TStream; var packageName, versionName: string; var versionCode: Integer): Boolean; overload; function next(): Integer; function nextToken(): Integer; function nextTag(): Integer; function nextText(): string; procedure require(atype: Integer; const namespace, name: string); function getDepth(): Integer; function getEventType(): Integer; function getLineNumber(): Integer; function getName(): string; function getText(): string; function getNamespace(): string; function getPrefix(): string; function getPositionDescription(): string; function getNamespaceCount(depth: Integer): Integer; function getNamespacePrefix(apos: Integer): string; function getNamespaceUri(apos: Integer): string; function getClassAttribute(): string; function getIdAttribute(): string; function getIdAttributeResourceValue(defaultValue: Integer = 0): Integer; function getStyleAttribute(): Integer; function getAttributeCount(): Integer; function getAttributeNamespace(index: Integer): string; function getAttributePrefix(index: Integer): string; function getAttributeName(index: Integer): string; function getAttributeNameResource(index: Integer) :Integer; function getAttributeValueType(index: Integer): Integer; function getAttributeValueData(index: Integer): Integer; function getAttributeValue(index: Integer): string; overload; function getAttributeBooleanValue(index: Integer; defaultValue: Boolean = false): Boolean; overload; function getAttributeFloatValue(index: Integer; defaultValue: Double = 0): Double; overload; function getAttributeIntValue(index: Integer; defaultValue: Integer = 0): Integer; overload; function getAttributeUnsignedIntValue(index: Integer; defaultValue: Cardinal = 0): Cardinal; overload; function getAttributeResourceValue(index: Integer; defaultValue: Integer = 0): Integer; overload; function getAttributeValue(const namespace, attribute: string): string; overload; function getAttributeBooleanValue(const namespace, attribute: string; defaultValue: Boolean = False): Boolean; overload; function getAttributeFloatValue(const namespace, attribute: string; defaultValue: Double = 0): Double; overload; function getAttributeIntValue(const namespace, attribute: string; defaultValue: Integer = 0): Integer; overload; function getAttributeUnsignedIntValue(const namespace, attribute: string; defaultValue: Cardinal = 0): Cardinal; overload; function getAttributeResourceValue(const namespace, attribute: string; defaultValue: Integer = 0): Integer; overload; function getAttributeListValue(index: Integer; options: array of string; defaultValue: Integer = 0): Integer; overload; function getAttributeListValue(const namespace, attribute: string; options: array of string; defaultValue: Integer = 0): Integer; overload; function getAttributeType(index: Integer): string; function isAttributeDefault(index: Integer): Boolean; function getInputEncoding(): string; function getColumnNumber(): Integer; function isEmptyElementTag(): Boolean; function isWhitespace(): Boolean; function getProperty(const name: string): TObject; function getFeature(const feature: string): Boolean; function getStrings(): TStringBlock; function getAttributeOffset(index: Integer): Integer; function findAttribute(const namespace, attribute: string): Integer; function getAttributeValueEx(index: Integer): string; procedure resetEventInfo(); end;
完整代码请点击下面的下载链接,或加入QDAC官方群(250530692)索取。
下载地址: http://pan.baidu.com/s/1sjK895r 密码: aq7c
如发现有Bug,请在这里留言告诉我。