Class: Android::Apk
- Inherits:
-
Object
- Object
- Android::Apk
- Defined in:
- lib/android/apk.rb
Overview
apk object class
Constant Summary collapse
- MANIFEST =
AndroidManifest file name
'AndroidManifest.xml'
- DEX =
dex file name
'classes.dex'
- RESOURCE =
resource file name
'resources.arsc'
Instance Attribute Summary collapse
-
#bindata ⇒ String
readonly
Binary data of apk.
- #dex ⇒ Android::Dex? readonly
- #manifest ⇒ Android::Manifest? readonly
-
#path ⇒ String
readonly
Apk file path.
- #resource ⇒ Resource? readonly
Instance Method Summary collapse
-
#certificates ⇒ Hash{String => OpenSSL::X509::Certificate }
certificate info which is used for signing.
-
#digest(type = :sha1) ⇒ String
return hex digest string of apk file.
- #each_entry {|entry| ... } ⇒ Object
- #each_file {|name, data| ... } ⇒ Object
-
#entry(name) ⇒ Zip::ZipEntry
find and return zip entry with name.
-
#file(name) ⇒ String
find and return binary data with name.
-
#find {|name, data| ... } ⇒ Array
find files which is matched with block condition.
-
#icon ⇒ Hash{ String => String }
extract icon data from AndroidManifest and resource.
-
#initialize(filepath) ⇒ Apk
constructor
create new apk object.
-
#label(lang = nil) ⇒ String?
deprecated
Deprecated.
move to Manifest#label
-
#layouts ⇒ Hash{ String => Android::Layout }
get screen layout xml datas.
-
#signs ⇒ Hash{ String => OpenSSL::PKCS7 }
apk’s signature information.
-
#size ⇒ Integer
return apk file size.
-
#time ⇒ Time
returns date of AndroidManifest.xml as Apk date.
Constructor Details
#initialize(filepath) ⇒ Apk
create new apk object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/android/apk.rb', line 39 def initialize(filepath) @path = filepath raise NotFoundError, "'#{filepath}'" unless File.exist? @path begin @zip = Zip::File.open(@path) rescue Zip::Error => e raise NotApkFileError, e. end @bindata = File.open(@path, 'rb') {|f| f.read } @bindata.force_encoding(Encoding::ASCII_8BIT) raise NotApkFileError, "manifest file is not found." if @zip.find_entry(MANIFEST).nil? begin @resource = Android::Resource.new(self.file(RESOURCE)) rescue => e $stderr.puts "failed to parse resource:#{e}" #$stderr.puts e.backtrace end begin @manifest = Android::Manifest.new(self.file(MANIFEST), @resource) rescue => e $stderr.puts "failed to parse manifest:#{e}" #$stderr.puts e.backtrace end begin @dex = Android::Dex.new(self.file(DEX)) rescue => e $stderr.puts "failed to parse dex:#{e}" #$stderr.puts e.backtrace end end |
Instance Attribute Details
#bindata ⇒ String (readonly)
Returns binary data of apk.
23 24 25 |
# File 'lib/android/apk.rb', line 23 def bindata @bindata end |
#manifest ⇒ Android::Manifest? (readonly)
18 19 20 |
# File 'lib/android/apk.rb', line 18 def manifest @manifest end |
#path ⇒ String (readonly)
Returns apk file path.
15 16 17 |
# File 'lib/android/apk.rb', line 15 def path @path end |
#resource ⇒ Resource? (readonly)
26 27 28 |
# File 'lib/android/apk.rb', line 26 def resource @resource end |
Instance Method Details
#certificates ⇒ Hash{String => OpenSSL::X509::Certificate }
certificate info which is used for signing
202 203 204 |
# File 'lib/android/apk.rb', line 202 def certificates return Hash[self.signs.map{|path, sign| [path, sign.certificates.first] }] end |
#digest(type = :sha1) ⇒ String
return hex digest string of apk file
81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/android/apk.rb', line 81 def digest(type = :sha1) case type when :sha1 Digest::SHA1.hexdigest(@bindata) when :sha256 Digest::SHA256.hexdigest(@bindata) when :md5 Digest::MD5.hexdigest(@bindata) else raise ArgumentError end end |
#each_entry {|entry| ... } ⇒ Object
120 121 122 123 124 125 |
# File 'lib/android/apk.rb', line 120 def each_entry @zip.each do |entry| next unless entry.file? yield entry end end |
#each_file {|name, data| ... } ⇒ Object
103 104 105 106 107 108 |
# File 'lib/android/apk.rb', line 103 def each_file @zip.each do |entry| next unless entry.file? yield entry.name, @zip.read(entry) end end |
#entry(name) ⇒ Zip::ZipEntry
find and return zip entry with name
131 132 133 134 135 |
# File 'lib/android/apk.rb', line 131 def entry(name) entry = @zip.find_entry(name) raise NotFoundError, "'#{name}'" if entry.nil? return entry end |
#file(name) ⇒ String
find and return binary data with name
114 115 116 |
# File 'lib/android/apk.rb', line 114 def file(name) # get data by entry name(path) @zip.read(entry(name)) end |
#find {|name, data| ... } ⇒ Array
find files which is matched with block condition
146 147 148 149 150 151 152 153 |
# File 'lib/android/apk.rb', line 146 def find(&block) found = [] self.each_file do |name, data| ret = block.call(name, data) found << name if ret end found end |
#icon ⇒ Hash{ String => String }
extract icon data from AndroidManifest and resource.
159 160 161 162 163 164 165 166 167 |
# File 'lib/android/apk.rb', line 159 def icon icon_id = @manifest.doc.elements['/manifest/application'].attributes['icon'] if /^@(\w+\/\w+)|(0x[0-9a-fA-F]{8})$/ =~ icon_id drawables = @resource.find(icon_id) Hash[drawables.map {|name| [name, file(name)] }] else { icon_id => file(icon_id) } # ugh!: not tested!! end end |
#label(lang = nil) ⇒ String?
move to Manifest#label
get application label from AndroidManifest and resources.
175 176 177 |
# File 'lib/android/apk.rb', line 175 def label(lang=nil) @manifest.label end |
#layouts ⇒ Hash{ String => Android::Layout }
get screen layout xml datas
182 183 184 |
# File 'lib/android/apk.rb', line 182 def layouts @layouts ||= Layout.collect_layouts(self) # lazy parse end |
#signs ⇒ Hash{ String => OpenSSL::PKCS7 }
apk’s signature information
189 190 191 192 193 194 195 196 197 |
# File 'lib/android/apk.rb', line 189 def signs signs = {} self.each_file do |path, data| # find META-INF/xxx.{RSA|DSA} next unless path =~ /^META-INF\// && data.unpack("CC") == [0x30, 0x82] signs[path] = OpenSSL::PKCS7.new(data) end signs end |
#size ⇒ Integer
return apk file size
73 74 75 |
# File 'lib/android/apk.rb', line 73 def size @bindata.size end |
#time ⇒ Time
returns date of AndroidManifest.xml as Apk date
96 97 98 |
# File 'lib/android/apk.rb', line 96 def time entry(MANIFEST).time end |