android-manifest-parser
Introduction: 一个纯 Java、实现了 SAX 接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。
Tags:
一个纯 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