class AppInfo::APK

Parse APK file

Attributes

file[R]

Public Class Methods

new(file) click to toggle source
# File lib/app_info/apk.rb, line 22
def initialize(file)
  @file = file
end

Public Instance Methods

activities() click to toggle source
# File lib/app_info/apk.rb, line 104
def activities
  components.select { |c| c.type == 'activity' }
end
apk() click to toggle source
# File lib/app_info/apk.rb, line 112
def apk
  @apk ||= ::Android::Apk.new(@file)
end
build_version()
Alias for: version_code
certificates() click to toggle source
# File lib/app_info/apk.rb, line 98
def certificates
  apk.certificates.each_with_object([]) do |(path, certificate), obj|
    obj << Certificate.new(path, certificate)
  end
end
clear!() click to toggle source
# File lib/app_info/apk.rb, line 132
def clear!
  return unless @contents

  FileUtils.rm_rf(@contents)

  @apk = nil
  @contents = nil
  @icons = nil
  @app_path = nil
  @info = nil
end
contents() click to toggle source
# File lib/app_info/apk.rb, line 144
def contents
  @contents ||= File.join(Dir.mktmpdir, "AppInfo-android-#{SecureRandom.hex}")
end
device_type() click to toggle source
# File lib/app_info/apk.rb, line 53
def device_type
  if wear?
    Device::WATCH
  elsif tv?
    Device::TV
  else
    Device::PHONE
  end
end
file_type()
Alias for: os
icons() click to toggle source
# File lib/app_info/apk.rb, line 116
def icons
  @icons ||= apk.icon.each_with_object([]) do |(path, data), obj|
    icon_name = File.basename(path)
    icon_path = File.join(contents, File.dirname(path))
    icon_file = File.join(icon_path, icon_name)
    FileUtils.mkdir_p icon_path
    File.write(icon_file, data, encoding: Encoding::BINARY)

    obj << {
      name: icon_name,
      file: icon_file,
      dimensions: ImageSize.path(icon_file).size
    }
  end
end
min_os_version()
Alias for: min_sdk_version
min_sdk_version() click to toggle source
# File lib/app_info/apk.rb, line 76
def min_sdk_version
  manifest.min_sdk_ver
end
Also aliased as: min_os_version
name() click to toggle source
# File lib/app_info/apk.rb, line 49
def name
  manifest.label || resource.find('@string/app_name')
end
os() click to toggle source
# File lib/app_info/apk.rb, line 30
def os
  AppInfo::Platform::ANDROID
end
Also aliased as: file_type
services() click to toggle source
# File lib/app_info/apk.rb, line 108
def services
  components.select { |c| c.type == 'service' }
end
signs() click to toggle source
# File lib/app_info/apk.rb, line 92
def signs
  apk.signs.each_with_object([]) do |(path, sign), obj|
    obj << Sign.new(path, sign)
  end
end
size(human_size: false) click to toggle source
# File lib/app_info/apk.rb, line 26
def size(human_size: false)
  AppInfo::Util.file_size(@file, human_size)
end
target_sdk_version() click to toggle source
# File lib/app_info/apk.rb, line 81
def target_sdk_version
  manifest.doc
          .elements['/manifest/uses-sdk']
          .attributes['targetSdkVersion']
          .to_i
end
tv?() click to toggle source
# File lib/app_info/apk.rb, line 72
def tv?
  use_features.include?('android.software.leanback')
end
use_features() click to toggle source
# File lib/app_info/apk.rb, line 88
def use_features
  manifest_values('/manifest/uses-feature')
end
version_code() click to toggle source
# File lib/app_info/apk.rb, line 44
def version_code
  manifest.version_code.to_s
end
Also aliased as: build_version
wear?() click to toggle source

TODO: find a way to detect def tablet?

resource

end

# File lib/app_info/apk.rb, line 68
def wear?
  use_features.include?('android.hardware.type.watch')
end

Private Instance Methods

manifest_values(path, key = 'name') click to toggle source
# File lib/app_info/apk.rb, line 150
def manifest_values(path, key = 'name')
  values = []
  manifest.doc.each_element(path) do |elem|
    values << elem.attributes[key]
  end
  values.uniq
end