android-manifest-parser

Introduction: 一个纯 Java、实现了 SAX 接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。
More: Author   ReportBugs   
Tags:

一个纯 Java、实现了 SAX 接口、无任何第三方依赖的 AndroidManifest.xml 解析工具。

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

The MIT License (MIT)

参考文档

如有侵权,请告知,立即删除相关文字及图片。

  1. AndroidManifest.xml 文件格式
    http://blog.csdn.net/jiangwei0910410003/article/details/50568487
  2. 属性值解析相关代码
    https://github.com/xgouchet/AXML
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea