Class: Android::AXMLWriter

Inherits:
AXMLParser show all
Defined in:
lib/android/axml_writer.rb

Constant Summary

Constants inherited from AXMLParser

Android::AXMLParser::HEADER, Android::AXMLParser::TAG_CDSECT, Android::AXMLParser::TAG_END, Android::AXMLParser::TAG_END_NAMESPACE, Android::AXMLParser::TAG_ENTITY_REF, Android::AXMLParser::TAG_START, Android::AXMLParser::TAG_START_NAMESPACE, Android::AXMLParser::TAG_TEXT, Android::AXMLParser::VAL_TYPE_ATTRIBUTE, Android::AXMLParser::VAL_TYPE_DIMENSION, Android::AXMLParser::VAL_TYPE_FLOAT, Android::AXMLParser::VAL_TYPE_FRACTION, Android::AXMLParser::VAL_TYPE_INT_BOOLEAN, Android::AXMLParser::VAL_TYPE_INT_COLOR_ARGB4, Android::AXMLParser::VAL_TYPE_INT_COLOR_ARGB8, Android::AXMLParser::VAL_TYPE_INT_COLOR_RGB4, Android::AXMLParser::VAL_TYPE_INT_COLOR_RGB8, Android::AXMLParser::VAL_TYPE_INT_DEC, Android::AXMLParser::VAL_TYPE_INT_HEX, Android::AXMLParser::VAL_TYPE_NULL, Android::AXMLParser::VAL_TYPE_REFERENCE, Android::AXMLParser::VAL_TYPE_STRING

Instance Attribute Summary

Attributes inherited from AXMLParser

#metadata, #strings

Instance Method Summary collapse

Methods inherited from AXMLParser

axml?, #convert_value, #current_nesting_level, #get_namespace_prefix, #parse, #parse_attribute, #parse_strings, #parse_tags, #short, #word

Constructor Details

#initialize(axml) ⇒ AXMLWriter

Returns a new instance of AXMLWriter.

Parameters:

  • axml (String)

    binary xml data



9
10
11
12
# File 'lib/android/axml_writer.rb', line 9

def initialize(axml)
  @io = StringIO.new(axml, "r+b")
  @strings = []
end

Instance Method Details

#add_string!(str) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/android/axml_writer.rb', line 32

def add_string!(str)
  new_string_id, bytes_added = Resource::ResStringPool.new(@io.string, 8).add_string(str)

  # Update XML size and positions of metadata attributes.
  @io.pos = 4
  xml_size = @io.read(4).unpack1('V')
  @io.pos = 4
  @io.write([xml_size + bytes_added].pack('V'))

  @metadata = @metadata.map do ||
    .transform_values do |attribute|
      attribute[:position] += bytes_added
      attribute[:val_str_id] += bytes_added
      attribute
    end
  end
  new_string_id
end

#modify_metadata!(name, new_value) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/android/axml_writer.rb', line 14

def modify_metadata!(name, new_value)
  parse if @doc.nil?

  entry = @metadata.find { |meta| meta['android:name'][:value] == name }
  raise "Metadata #{name} could not be found and modified" if entry.nil?

  pos = if entry['android:value'][:is_string]
          new_string_id = add_string!(new_value)
          new_value = new_string_id
          entry['android:value'][:val_str_id]
        else
          entry['android:value'][:position]
        end

  @io.pos = pos
  @io.write([new_value].pack('V'))
end