AndroidManifest解析器
一个纯Java、实现了SAX接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。
AndroidManifest.xml文件格式
Binary AndroidManifest.xml
Magic Number(0x00080003) 4bytes // 魔数
File Size 4bytes // 文件长度
String Chunk // 字符串常量池
Chunk Type(0x001C0001) 4bytes // Chunk类型
Chunk Size 4bytes // Chunk长度
String Count 4bytes // 字符串个数
Style Count 4bytes
Unknown 4bytes
String Pool Offset 4bytes // 字符串常量池相对于Chunk偏移值
Style Pool Offset 4bytes
String Offsets 4bytes * StringCount // 字符串相对于StringPoolOffset偏移值
Style Offsets 4bytes * StyleCount
String Pool *
String Length 2bytes // 字符串长度
String Content 2bytes * StringLength // 字符串内容
\0 2bytes // \0
Style Pool
ResourceId Chunk
Chunk Type(0x00080180) 4bytes
Chunk Size 4bytes
ResourceIds 4bytes * (ChunkSize / 4 - 2)
XmlContent Chunk *
Start Namespace Chunk
Chunk Type(0x00100100) 4bytes // Chunk类型
Chunk Size 4bytes // Chunk长度
Line Number 4bytes
Unknown 4bytes
Prefix 4bytes // namespace对应的前缀(常量池地址)
Uri 4bytes // namespace对应的URI(常量池地址)
End Namespace Chunk
Chunk Type(0x00100101) 4bytes
Chunk Size 4bytes
Line Number 4bytes
Unknown 4bytes
Prefix 4bytes
Uri 4bytes
Start Tag Chunk // 开始标签
Chunk Type(0x00100102) 4bytes // Chunk类型
Chunk Size 4bytes // Chunk长度
Line Number 4bytes
Unknown 4bytes
Namespace Uri 4bytes // 标签Namespace URI
Name 4bytes // 标签名
Flags 4bytes
Attribute Count 4bytes // 属性个数
Class Attribute 4bytes
Attributes *
Namespace Uri 4bytes // 属性Namespace URI
Name 4bytes // 属性名
Value 4bytes // 字符串属性值(常量池地址)
Type 4bytes // 属性值类型
Data 4bytes // 属性值
End Tag Chunk // 结束标签
Chunk Type(0x00100103) 4bytes // Chunk类型
Chunk Size 4bytes // Chunk长度
Line Number 4bytes
Unknown 4bytes
Namespace Uri 4bytes
Name 4bytes
Text Chunk // 文本内容
Chunk Type(0x00100104) 4bytes // Chunk类型
Chunk Size 4bytes // Chunk长度
Line Number 4bytes
Unknown 4bytes
Name 4bytes // 文本(常量池地址)
Unknown 4bytes
Unknown 4bytes
实现
1. 使用java.nio.ByteBuffer
操作字节序及字节
ByteBuffer.order
ByteBuffer.get
ByteBuffer.getInt
ByteBuffer.getFloat
2. 按照文件格式自顶向下解析
parse
parseStringChunk
parseString
parseResourceIdChunk
parseStartNamespaceChunk
parseEndNamespaceChunk
parseStartTagChunk
parseAttribute
parseAttributeValue
parseEndTagChunk
parseTextChunk
3. 实现SAX相关接口以便重用代码
public class AndroidManifestReader implements XMLReader {
}
public class ApkInputSource extends InputSource {
}
// 转为Document
transformer.transform(
new SAXSource(new AndroidManifestReader(), new ApkInputSource(new URL("http://xxx.apk"))),
new DOMResult(document));
// 输出XML
transformer.transform(
new SAXSource(new AndroidManifestReader(), new ApkInputSource(new URL("http://xxx.apk"))),
new StreamResult(writer));
License
参考文档
如有侵权,请告知,立即删除相关文字及图片。
- AndroidManifest.xml文件格式
http://blog.csdn.net/jiangwei0910410003/article/details/50568487 - 属性值解析相关代码
https://github.com/xgouchet/AXML