android_apk 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c34a0896e31f26b93dea4960c846da52fb17baa5
4
+ data.tar.gz: b4f17a56d8a4148d307027a2d94364f49d4207e7
5
+ SHA512:
6
+ metadata.gz: 72126a5303ca2c12c0d526039fe4c3786261adaa533b038d912bd557d0dddf4ef7c582e8734dce3d11506b576ca2544a57c328597dda30ffb6258d2bbaeee050
7
+ data.tar.gz: 644427c81abf36372542bf1d6c5bd5aa536d23ff42d9f26e151b88e365bfd59642a4969f2de0e03effffeab4519194299255e5b658294bf7d42c817b61660f6c
data/Gemfile CHANGED
@@ -6,9 +6,9 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "rspec", "~> 2.8.0"
9
+ gem "rspec", "~> 3.2.0"
10
10
  gem "rdoc", "~> 3.12"
11
- gem "bundler", "~> 1.0.0"
11
+ gem "bundler", "~> 1.11.2"
12
12
  gem "jeweler", "~> 1.8.4"
13
13
  gem "simplecov"
14
14
  end
@@ -1,37 +1,75 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- diff-lcs (1.1.3)
5
- git (1.2.5)
6
- jeweler (1.8.4)
4
+ addressable (2.4.0)
5
+ builder (3.2.2)
6
+ diff-lcs (1.2.5)
7
+ docile (1.1.5)
8
+ faraday (0.8.11)
9
+ multipart-post (~> 1.2.0)
10
+ git (1.3.0)
11
+ github_api (0.10.1)
12
+ addressable
13
+ faraday (~> 0.8.1)
14
+ hashie (>= 1.2)
15
+ multi_json (~> 1.4)
16
+ nokogiri (~> 1.5.2)
17
+ oauth2
18
+ hashie (3.4.3)
19
+ highline (1.7.8)
20
+ jeweler (1.8.8)
21
+ builder
7
22
  bundler (~> 1.0)
8
23
  git (>= 1.2.5)
24
+ github_api (= 0.10.1)
25
+ highline (>= 1.6.15)
26
+ nokogiri (= 1.5.10)
9
27
  rake
10
28
  rdoc
11
- json (1.7.4)
12
- multi_json (1.3.6)
13
- rake (0.9.2.2)
14
- rdoc (3.12)
29
+ json (1.8.3)
30
+ jwt (1.5.1)
31
+ multi_json (1.11.2)
32
+ multi_xml (0.5.5)
33
+ multipart-post (1.2.0)
34
+ nokogiri (1.5.10)
35
+ oauth2 (1.1.0)
36
+ faraday (>= 0.8, < 0.10)
37
+ jwt (~> 1.0, < 1.5.2)
38
+ multi_json (~> 1.3)
39
+ multi_xml (~> 0.5)
40
+ rack (>= 1.2, < 3)
41
+ rack (1.6.4)
42
+ rake (10.5.0)
43
+ rdoc (3.12.2)
15
44
  json (~> 1.4)
16
- rspec (2.8.0)
17
- rspec-core (~> 2.8.0)
18
- rspec-expectations (~> 2.8.0)
19
- rspec-mocks (~> 2.8.0)
20
- rspec-core (2.8.0)
21
- rspec-expectations (2.8.0)
22
- diff-lcs (~> 1.1.2)
23
- rspec-mocks (2.8.0)
24
- simplecov (0.6.4)
25
- multi_json (~> 1.0)
26
- simplecov-html (~> 0.5.3)
27
- simplecov-html (0.5.3)
45
+ rspec (3.2.0)
46
+ rspec-core (~> 3.2.0)
47
+ rspec-expectations (~> 3.2.0)
48
+ rspec-mocks (~> 3.2.0)
49
+ rspec-core (3.2.3)
50
+ rspec-support (~> 3.2.0)
51
+ rspec-expectations (3.2.1)
52
+ diff-lcs (>= 1.2.0, < 2.0)
53
+ rspec-support (~> 3.2.0)
54
+ rspec-mocks (3.2.1)
55
+ diff-lcs (>= 1.2.0, < 2.0)
56
+ rspec-support (~> 3.2.0)
57
+ rspec-support (3.2.2)
58
+ simplecov (0.11.2)
59
+ docile (~> 1.1.0)
60
+ json (~> 1.8)
61
+ simplecov-html (~> 0.10.0)
62
+ simplecov-html (0.10.0)
28
63
 
29
64
  PLATFORMS
30
65
  ruby
31
66
 
32
67
  DEPENDENCIES
33
- bundler (~> 1.0.0)
68
+ bundler (~> 1.11.2)
34
69
  jeweler (~> 1.8.4)
35
70
  rdoc (~> 3.12)
36
- rspec (~> 2.8.0)
71
+ rspec (~> 3.2.0)
37
72
  simplecov
73
+
74
+ BUNDLED WITH
75
+ 1.11.2
data/README.md CHANGED
@@ -1,8 +1,12 @@
1
1
  #Android APK
2
+
3
+ [![Circle CI](https://circleci.com/gh/kyoro/android_apk.svg?style=svg)](https://circleci.com/gh/kyoro/android_apk)
4
+
2
5
  This gem library is Android application package file (.apk) analyzer.
3
6
  you can read any information of android apk files.
4
7
 
5
8
  ## Attention
9
+
6
10
  You must set path to 'AndroidSDK/platform-tools'.
7
11
  And you must can execute 'aapt' command.
8
12
 
@@ -19,7 +23,7 @@ apk.label #Application Name
19
23
  apk.package_name #Package Name
20
24
  apk.icon #Included Icon file in apk file
21
25
  apk.version_code #Version Code
22
- apk.version_name "Version Name
26
+ apk.version_name #Version Name
23
27
  ```
24
28
 
25
29
  ## License
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0
@@ -2,16 +2,18 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: android_apk 0.8.0 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
- s.name = "android_apk"
8
- s.version = "0.7.0"
8
+ s.name = "android_apk".freeze
9
+ s.version = "0.8.0"
9
10
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Kyosuke INOUE"]
12
- s.date = "2013-03-12"
13
- s.description = "This library can analyze Android APK application package. You can get any information of android apk file."
14
- s.email = "kyoro@hakamastyle.net"
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib".freeze]
13
+ s.authors = ["Kyosuke INOUE".freeze]
14
+ s.date = "2016-03-01"
15
+ s.description = "This library can analyze Android APK application package. You can get any information of android apk file.".freeze
16
+ s.email = "kyoro@hakamastyle.net".freeze
15
17
  s.extra_rdoc_files = [
16
18
  "LICENSE.txt",
17
19
  "README.md"
@@ -26,42 +28,45 @@ Gem::Specification.new do |s|
26
28
  "Rakefile",
27
29
  "VERSION",
28
30
  "android_apk.gemspec",
31
+ "circle.yml",
29
32
  "lib/android_apk.rb",
30
33
  "spec/android_apk_spec.rb",
31
34
  "spec/mock/BarcodeScanner4.2.apk",
32
35
  "spec/mock/UECExpress.apk",
36
+ "spec/mock/dsa.apk",
33
37
  "spec/mock/dummy.apk",
38
+ "spec/mock/sample with space.apk",
34
39
  "spec/mock/sample.apk",
40
+ "spec/mock/vector-icon.apk",
35
41
  "spec/spec_helper.rb"
36
42
  ]
37
- s.homepage = "http://github.com/kyoro/android_apk"
38
- s.licenses = ["MIT"]
39
- s.require_paths = ["lib"]
40
- s.rubygems_version = "1.8.24"
41
- s.summary = "Android APK file analyzer"
43
+ s.homepage = "http://github.com/kyoro/android_apk".freeze
44
+ s.licenses = ["MIT".freeze]
45
+ s.rubygems_version = "2.6.1".freeze
46
+ s.summary = "Android APK file analyzer".freeze
42
47
 
43
48
  if s.respond_to? :specification_version then
44
- s.specification_version = 3
49
+ s.specification_version = 4
45
50
 
46
51
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
- s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
48
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
49
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
50
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
51
- s.add_development_dependency(%q<simplecov>, [">= 0"])
52
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.2.0"])
53
+ s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
54
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 1.11.2"])
55
+ s.add_development_dependency(%q<jeweler>.freeze, ["~> 1.8.4"])
56
+ s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
52
57
  else
53
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
54
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
55
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
56
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
57
- s.add_dependency(%q<simplecov>, [">= 0"])
58
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.2.0"])
59
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
60
+ s.add_dependency(%q<bundler>.freeze, ["~> 1.11.2"])
61
+ s.add_dependency(%q<jeweler>.freeze, ["~> 1.8.4"])
62
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
58
63
  end
59
64
  else
60
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
61
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
62
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
64
- s.add_dependency(%q<simplecov>, [">= 0"])
65
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.2.0"])
66
+ s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
67
+ s.add_dependency(%q<bundler>.freeze, ["~> 1.11.2"])
68
+ s.add_dependency(%q<jeweler>.freeze, ["~> 1.8.4"])
69
+ s.add_dependency(%q<simplecov>.freeze, [">= 0"])
65
70
  end
66
71
  end
67
72
 
@@ -0,0 +1,4 @@
1
+ machine:
2
+ environment:
3
+ TERM: dumb
4
+ PATH: $ANDROID_HOME/build-tools/22.0.1:$PATH
@@ -1,11 +1,13 @@
1
- require "tmpdir"
2
- require "pp"
1
+ require 'tmpdir'
2
+ require 'shellwords'
3
+ require 'open3'
4
+
3
5
  class AndroidApk
4
6
  attr_accessor :results,:label,:labels,:icon,:icons,:package_name,:version_code,:version_name,:sdk_version,:target_sdk_version,:filepath
5
7
  def self.analyze(filepath)
6
8
  return nil unless File.exist?(filepath)
7
9
  apk = AndroidApk.new
8
- command = "aapt dump badging '" + filepath + "' 2>&1"
10
+ command = "aapt dump badging #{filepath.shellescape} 2>&1"
9
11
  results = `#{command}`
10
12
  if $?.exitstatus != 0 or results.index("ERROR: dump failed")
11
13
  return nil
@@ -15,8 +17,8 @@ class AndroidApk
15
17
  vars = _parse_aapt(results)
16
18
 
17
19
  # application info
18
- apk.label, apk.icon =
19
- vars['application'].values_at('label', 'icon')
20
+ apk.label = vars['application-label']
21
+ apk.icon = vars['application']['icon']
20
22
 
21
23
  # package
22
24
  apk.package_name, apk.version_code, apk.version_name =
@@ -37,11 +39,17 @@ class AndroidApk
37
39
  return apk
38
40
  end
39
41
 
40
- def icon_file(dpi = nil)
42
+ def icon_file(dpi = nil, want_png = false)
41
43
  icon = dpi ? self.icons[dpi.to_i] : self.icon
42
44
  return nil if icon.empty?
45
+
46
+ if want_png && icon.end_with?('.xml')
47
+ dpis = dpi_str(dpi)
48
+ icon.gsub! %r{res/drawable-anydpi-v21/([^/]+)\.xml}, "res/drawable-#{dpis}-v4/\\1.png"
49
+ end
50
+
43
51
  Dir.mktmpdir do |dir|
44
- command = sprintf("unzip '%s' '%s' -d '%s' 2>&1",self.filepath,icon,dir)
52
+ command = "unzip #{self.filepath.shellescape} #{icon.shellescape} -d #{dir.shellescape} 2>&1"
45
53
  results = `#{command}`
46
54
  path = dir + "/" + icon
47
55
  return nil unless File.exist?(path)
@@ -49,15 +57,40 @@ class AndroidApk
49
57
  end
50
58
  end
51
59
 
60
+ def dpi_str(dpi)
61
+ case dpi.to_i
62
+ when 120
63
+ 'ldpi'
64
+ when 160
65
+ 'mdpi'
66
+ when 240
67
+ 'hdpi'
68
+ when 320
69
+ 'xhdpi'
70
+ when 480
71
+ 'xxhdpi'
72
+ when 640
73
+ 'xxxhdpi'
74
+ else
75
+ 'xxxhdpi'
76
+ end
77
+ end
78
+
52
79
  def signature
53
- command = sprintf("unzip -p '%s' META-INF/*.RSA | keytool -printcert | grep SHA1: 2>&1", self.filepath)
54
- results = `#{command}`
55
- return nil if $?.exitstatus != 0 || results.nil? || !results.index('SHA1:')
56
- val = results.scan(/(?:[0-9A-Z]{2}:?){20}/)
80
+ command = "unzip -p #{self.filepath.shellescape} META-INF/*.RSA META-INF/*.DSA | keytool -printcert | grep SHA1:"
81
+ output, _, status = Open3.capture3(command)
82
+ return if status != 0 || output.nil? || !output.index('SHA1:')
83
+ val = output.scan(/(?:[0-9A-Z]{2}:?){20}/)
57
84
  return nil if val.nil? || val.length != 1
58
85
  return val[0].gsub(/:/, "").downcase
59
86
  end
60
87
 
88
+ # workaround for https://code.google.com/p/android/issues/detail?id=160847
89
+ def self._parse_values_workaround(str)
90
+ return nil if str.nil?
91
+ str.scan(/^'(.+)'$/).map{|v| v[0].gsub(/\\'/, "'")}
92
+ end
93
+
61
94
  def self._parse_values(str)
62
95
  return nil if str.nil?
63
96
  if str.index("='")
@@ -74,7 +107,13 @@ class AndroidApk
74
107
  def self._parse_line(line)
75
108
  return nil if line.nil?
76
109
  info = line.split(":", 2)
77
- return info[0], _parse_values( info[1] )
110
+ values =
111
+ if info[0].start_with?('application-label')
112
+ _parse_values_workaround info[1]
113
+ else
114
+ _parse_values info[1]
115
+ end
116
+ return info[0], values
78
117
  end
79
118
 
80
119
  def self._parse_aapt(results)
@@ -6,14 +6,20 @@ describe "AndroidApk" do
6
6
  apk = nil
7
7
  apk2 = nil
8
8
  icon_not_set_apk = nil
9
- sample_file_path = File.dirname(__FILE__) + "/mock/sample.apk"
10
- sample2_file_path = File.dirname(__FILE__) + "/mock/BarcodeScanner4.2.apk"
11
- icon_not_set_file_path = File.dirname(__FILE__) + "/mock/UECExpress.apk"
12
- dummy_file_path = File.dirname(__FILE__) + "/mock/dummy.apk"
9
+
10
+ mockdir = File.join(File.dirname(__FILE__), 'mock')
11
+ sample_file_path = File.join(mockdir, 'sample.apk')
12
+ sample2_file_path = File.join(mockdir, 'BarcodeScanner4.2.apk')
13
+ sample_space_file_path = File.join(mockdir, 'sample with space.apk')
14
+ icon_not_set_file_path = File.join(mockdir, 'UECExpress.apk')
15
+ dummy_file_path = File.join(mockdir, 'dummy.apk')
16
+ dsa_file_path = File.join(mockdir, 'dsa.apk')
17
+ vector_file_path = File.join(mockdir, 'vector-icon.apk')
13
18
 
14
19
  it "Sample apk file exist" do
15
20
  File.exist?(sample_file_path).should == true
16
21
  File.exist?(sample2_file_path).should == true
22
+ File.exist?(sample_space_file_path).should == true
17
23
  end
18
24
 
19
25
  it "Library can not read apk file" do
@@ -86,4 +92,36 @@ describe "AndroidApk" do
86
92
  icon_not_set_apk.icon_file.should == nil
87
93
  end
88
94
 
95
+ context "with space character filename" do
96
+ subject { AndroidApk.analyze(sample_space_file_path) }
97
+ it 'returns analyzed data' do
98
+ is_expected.not_to be_nil
99
+ end
100
+ end
101
+
102
+ context "with DSA signing" do
103
+ subject { AndroidApk.analyze(dsa_file_path) }
104
+ it 'returns analyzed data' do
105
+ is_expected.not_to be_nil
106
+ end
107
+ it 'can extract signature' do
108
+ expect(subject.signature).to eq('2d8068f79a5840cbce499b51821aaa6c775ff3ff')
109
+ end
110
+ end
111
+
112
+ context "with vector icon" do
113
+ subject { AndroidApk.analyze(vector_file_path) }
114
+ it 'can be analyzed' do
115
+ is_expected.not_to be_nil
116
+ end
117
+ it 'has xml icon' do
118
+ expect(subject.icon_file).not_to be_nil
119
+ end
120
+ it 'can return png icon' do
121
+ expect(subject.icon_file(nil, true)).not_to be_nil
122
+ end
123
+ it 'can return png icon by specific dpi' do
124
+ expect(subject.icon_file(240, true)).not_to be_nil
125
+ end
126
+ end
89
127
  end
Binary file
Binary file
metadata CHANGED
@@ -1,94 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: android_apk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
5
- prerelease:
4
+ version: 0.8.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kyosuke INOUE
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-12 00:00:00.000000000 Z
11
+ date: 2016-03-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 2.8.0
19
+ version: 3.2.0
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 2.8.0
26
+ version: 3.2.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rdoc
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '3.12'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '3.12'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: bundler
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 1.0.0
47
+ version: 1.11.2
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 1.0.0
54
+ version: 1.11.2
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: jeweler
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 1.8.4
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 1.8.4
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: simplecov
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: This library can analyze Android APK application package. You can get
@@ -100,8 +89,8 @@ extra_rdoc_files:
100
89
  - LICENSE.txt
101
90
  - README.md
102
91
  files:
103
- - .document
104
- - .rspec
92
+ - ".document"
93
+ - ".rspec"
105
94
  - Gemfile
106
95
  - Gemfile.lock
107
96
  - LICENSE.txt
@@ -109,39 +98,39 @@ files:
109
98
  - Rakefile
110
99
  - VERSION
111
100
  - android_apk.gemspec
101
+ - circle.yml
112
102
  - lib/android_apk.rb
113
103
  - spec/android_apk_spec.rb
114
104
  - spec/mock/BarcodeScanner4.2.apk
115
105
  - spec/mock/UECExpress.apk
106
+ - spec/mock/dsa.apk
116
107
  - spec/mock/dummy.apk
108
+ - spec/mock/sample with space.apk
117
109
  - spec/mock/sample.apk
110
+ - spec/mock/vector-icon.apk
118
111
  - spec/spec_helper.rb
119
112
  homepage: http://github.com/kyoro/android_apk
120
113
  licenses:
121
114
  - MIT
115
+ metadata: {}
122
116
  post_install_message:
123
117
  rdoc_options: []
124
118
  require_paths:
125
119
  - lib
126
120
  required_ruby_version: !ruby/object:Gem::Requirement
127
- none: false
128
121
  requirements:
129
- - - ! '>='
122
+ - - ">="
130
123
  - !ruby/object:Gem::Version
131
124
  version: '0'
132
- segments:
133
- - 0
134
- hash: -1128838376041237717
135
125
  required_rubygems_version: !ruby/object:Gem::Requirement
136
- none: false
137
126
  requirements:
138
- - - ! '>='
127
+ - - ">="
139
128
  - !ruby/object:Gem::Version
140
129
  version: '0'
141
130
  requirements: []
142
131
  rubyforge_project:
143
- rubygems_version: 1.8.24
132
+ rubygems_version: 2.6.1
144
133
  signing_key:
145
- specification_version: 3
134
+ specification_version: 4
146
135
  summary: Android APK file analyzer
147
136
  test_files: []