androidManifest

来源:互联网 发布:紫金银交易软件 编辑:程序博客网 时间:2024/05/16 13:52

androidmanifest.xml是一个格式化的xml. 文档结构如图



尝试去读了一下

#encoding:utf-8require 'zip'require "rexml/document"class AndroidManifestSTEP=4MAGIC_VALUE=0x00080003STRING_CHUNK=0x001c0001RESOURCE_CHUNK=0x00080180START_NAMESPACE_CHUNK=0x00100100#节点标签END_DOC_TAG     =0x00100101START_TAG =0x00100102END_TAG =0x00100103TEXT_TAG=0x00100104#只分析出了这几种常见的类型INT_VALUE_TYPE=0x10000008BOOL_VALUE_TYPE=0x12000008HEX_VALUE_TYPE=0x11000008STRING_VALUE_TYPE=0x03000008DOUBLE_VALUE_TYPE=0x04000008STRING_R_ID=0x01000008def read_number(length=4)@seek+=lengthif length==2@manifest[@seek-length,length].unpack('S')[0]elsif length==4@manifest[@seek-length,length].unpack('V')[0]elseraise "未知的数据格式"endenddef read_stringstring_length=read_number(2)string = @manifest[@seek,string_length*2].force_encoding('UTF-16LE').encode('utf-8')@seek+=string_length*2+2stringend#第3字节开始是字符串块def init_string_table#字符串表开始标志start_offset=@seekraise "string_table?(#{@seek.to_s(16)})" unless STRING_CHUNK == read_number#块长度chunk_size=read_number#字符串数量string_count= read_number#样式表数量style_count =read_number#未知@seek+=4#偏移量string_pool_offset=read_numberstyle_pool_offset=read_numberstring_offsets=string_count.times.map{|x| read_number }style_offsets=style_count.times.map{|x| read_number }string_count.times { @strings<<read_string }style_count.times { @styles<<read_string }#这儿有个问题是补位,如果读完字符串不是正好4的倍数,要补齐@seek=start_offset+chunk_sizeend#在字符串块之后是资源列表def init_resource_tableraise "resource_table #{@seek.to_s(16)}?" unless RESOURCE_CHUNK == read_numberchunk_size=read_number(chunk_size / 4 -2).times.map{|x| @resource<<read_number}enddef start_name_space#24字节raise "start_name_space? #{@seek.to_s(16)}?" unless START_NAMESPACE_CHUNK == read_numberchunk_size=read_numberline_number=read_numberread_number@prefix=read_number@uri=read_numberenddef read_xml#一共只有4种节点begintag=read_numberif START_TAG == tagread_start_tagelsif END_TAG == tag@seek += 4*4name=read_numberputs "</#{@strings[name]}>"elsif END_DOC_TAG ==tagputs "文档结束"breakelsif tag==TEXT_TAG@seek += 6*4else     raise "tag at "+@seek.to_s(16)endend while  trueenddef read_start_tagchunk_size=read_numberline =read_number@seek+=4 #0xFFFFFFFFns=read_numbername=read_numberflag=read_numberattr_count=read_numberclass_attribute=read_numberstring="<#{@strings[name]}"attr_count.times do |index|ns=read_numbername=read_numberkey="#{@strings[@prefix]}:#{@strings[name]}"value=read_numbertype=read_numberdata=read_numberif type == INT_VALUE_TYPEvalue=dataelsif type == STRING_VALUE_TYPEvalue=@strings[value]elsif type == BOOL_VALUE_TYPEvalue=data ? "true" : "false"elsif type == STRING_R_IDvalue="0x"+data.to_s(16)elsif HEX_VALUE_TYPE == typevalue="0x"+data.to_s(16)elsif DOUBLE_VALUE_TYPE == type#这儿的精度会缺失错误value=[data].pack('L').unpack('e')[0]elseputs "#{key}=\"#{value}\" type #{type.to_s(16)} data:#{data}"raise "未知的数据类型"endstring<< " #{key}=\"#{value}\""#puts "#{key}=\"#{value}\" type #{type.to_s(16)} data:#{data}"endstring<<">"puts stringenddef initialize(manifest)@manifest=manifest@doc = REXML::Document.new('<?xml version="1.0" encoding="utf-8" standalone="no"?>')@seek=0@strings=[]@styles=[]@resource=[]raise "未知的文件标志符" unless MAGIC_VALUE == read_number@file_size=read_numberinit_string_tableinit_resource_tablestart_name_spaceread_xmlendendapk_file="test2.apk"Zip::File.open(apk_file) do |zip|AndroidManifest.new zip.read('AndroidManifest.xml')end


嗯嗯,好象不错的样子

如果不使用apktool 解压apk包。而直接使用aapt r&a 来修改androidmanifest文件会快好多

0 0
原创粉丝点击