app-info 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uuidtools'
4
+ require 'rexml/document'
5
+ require 'app_info/util'
6
+
7
+ module AppInfo
8
+ # Proguard parser
9
+ class Proguard
10
+ NAMESPACE = UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, 'icyleaf.com')
11
+
12
+ attr_reader :file
13
+
14
+ def initialize(file)
15
+ @file = file
16
+ end
17
+
18
+ def file_type
19
+ AppInfo::Platform::PROGUARD
20
+ end
21
+
22
+ def uuid
23
+ # Similar to https://docs.sentry.io/workflow/debug-files/#proguard-uuids
24
+ UUIDTools::UUID.sha1_create(NAMESPACE, File.read(mapping_path)).to_s
25
+ end
26
+ alias debug_id uuid
27
+
28
+ def mapping?
29
+ File.exist?(mapping_path)
30
+ end
31
+
32
+ def manifest?
33
+ File.exist?(manifest_path)
34
+ end
35
+
36
+ def symbol?
37
+ File.exist?(symbol_path)
38
+ end
39
+ alias resource? symbol?
40
+
41
+ def package_name
42
+ return unless manifest?
43
+
44
+ manifest.root.attributes['package']
45
+ end
46
+
47
+ def releasd_version
48
+ return unless manifest?
49
+
50
+ manifest.root.attributes['package']
51
+ end
52
+
53
+ def version_name
54
+ return unless manifest?
55
+
56
+ manifest.root.attributes['versionName']
57
+ end
58
+ alias release_version version_name
59
+
60
+ def version_code
61
+ return unless manifest?
62
+
63
+ manifest.root.attributes['versionCode']
64
+ end
65
+ alias build_version version_code
66
+
67
+ def manifest
68
+ return unless manifest?
69
+
70
+ @manifest ||= REXML::Document.new(File.new(manifest_path))
71
+ end
72
+
73
+ def mapping_path
74
+ @mapping_path ||= Dir.glob(File.join(contents, '*mapping*.txt')).first
75
+ end
76
+
77
+ def manifest_path
78
+ @manifest_path ||= File.join(contents, 'AndroidManifest.xml')
79
+ end
80
+
81
+ def symbol_path
82
+ @symbol_path ||= File.join(contents, 'R.txt')
83
+ end
84
+ alias resource_path symbol_path
85
+
86
+ def contents
87
+ @contents ||= Util.unarchive(@file, path: 'proguard')
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zip'
4
+ require 'fileutils'
5
+ require 'securerandom'
6
+
7
+ module AppInfo
8
+ # AppInfo Util
9
+ module Util
10
+ FILE_SIZE_UNITS = %w[B KB MB GB TB].freeze
11
+
12
+ def self.format_key(key)
13
+ key = key.to_s
14
+ return key unless key.include?('_')
15
+
16
+ key.split('_').map(&:capitalize).join('')
17
+ end
18
+
19
+ def self.file_size(file, humanable)
20
+ file_size = File.size(file)
21
+ humanable ? size_to_humanable(file_size) : file_size
22
+ end
23
+
24
+ def self.size_to_humanable(number)
25
+ if number.to_i < 1024
26
+ exponent = 0
27
+ else
28
+ max_exp = FILE_SIZE_UNITS.size - 1
29
+ exponent = (Math.log(number) / Math.log(1024)).to_i
30
+ exponent = max_exp if exponent > max_exp
31
+ number = format('%<number>.2f', number: (number / (1024**exponent.to_f)))
32
+ end
33
+
34
+ "#{number} #{FILE_SIZE_UNITS[exponent]}"
35
+ end
36
+
37
+ # Unarchive zip file
38
+ #
39
+ # source: https://github.com/soffes/lagunitas/blob/master/lib/lagunitas/ipa.rb
40
+ def self.unarchive(file, path: nil)
41
+ path = path ? "#{path}-" : ''
42
+ root_path = "#{Dir.mktmpdir}/AppInfo-#{path}#{SecureRandom.hex}"
43
+ Zip::File.open(file) do |zip_file|
44
+ if block_given?
45
+ yield root_path, zip_file
46
+ else
47
+ zip_file.each do |f|
48
+ f_path = File.join(root_path, f.name)
49
+ FileUtils.mkdir_p(File.dirname(f_path))
50
+ zip_file.extract(f, f_path) unless File.exist?(f_path)
51
+ end
52
+ end
53
+ end
54
+
55
+ root_path
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AppInfo
4
+ VERSION = '2.2.0'
5
+ end
metadata ADDED
@@ -0,0 +1,231 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: app-info
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ platform: ruby
6
+ authors:
7
+ - icyleaf
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: CFPropertyList
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.4
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 3.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.3.4
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 3.1.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: image_size
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.5'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '2.1'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '1.5'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.1'
53
+ - !ruby/object:Gem::Dependency
54
+ name: pngdefry
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 0.1.2
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.1.2
67
+ - !ruby/object:Gem::Dependency
68
+ name: ruby-macho
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 2.2.0
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 2.2.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: ruby_android
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 0.7.7
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: 0.7.7
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubyzip
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '1.2'
102
+ - - "<"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '1.2'
112
+ - - "<"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: uuidtools
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 2.1.5
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.3.0
125
+ type: :runtime
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.1.5
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: 2.3.0
135
+ - !ruby/object:Gem::Dependency
136
+ name: bundler
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '1.12'
142
+ type: :development
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '1.12'
149
+ - !ruby/object:Gem::Dependency
150
+ name: rake
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '10.0'
156
+ type: :development
157
+ prerelease: false
158
+ version_requirements: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '10.0'
163
+ - !ruby/object:Gem::Dependency
164
+ name: rspec
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '3.0'
170
+ type: :development
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: '3.0'
177
+ description: Teardown tool for ipa/apk files and dSYM file, even support for info.plist
178
+ and .mobileprovision files
179
+ email:
180
+ - icyleaf.cn@gmail.com
181
+ executables: []
182
+ extensions: []
183
+ extra_rdoc_files: []
184
+ files:
185
+ - ".gitignore"
186
+ - ".rspec"
187
+ - ".rubocop.yml"
188
+ - ".travis.yml"
189
+ - CHANGELOG.md
190
+ - CODE_OF_CONDUCT.md
191
+ - Gemfile
192
+ - LICENSE
193
+ - README.md
194
+ - Rakefile
195
+ - app_info.gemspec
196
+ - lib/app-info.rb
197
+ - lib/app_info.rb
198
+ - lib/app_info/apk.rb
199
+ - lib/app_info/core_ext/object/try.rb
200
+ - lib/app_info/dsym.rb
201
+ - lib/app_info/ipa.rb
202
+ - lib/app_info/ipa/info_plist.rb
203
+ - lib/app_info/ipa/mobile_provision.rb
204
+ - lib/app_info/proguard.rb
205
+ - lib/app_info/util.rb
206
+ - lib/app_info/version.rb
207
+ homepage: http://github.com/icyleaf/app-info
208
+ licenses:
209
+ - MIT
210
+ metadata: {}
211
+ post_install_message:
212
+ rdoc_options: []
213
+ require_paths:
214
+ - lib
215
+ required_ruby_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: '2.3'
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ requirements: []
226
+ rubygems_version: 3.0.3
227
+ signing_key:
228
+ specification_version: 4
229
+ summary: Teardown tool for mobile app(ipa/apk) and dSYM file, analysis metedata like
230
+ version, name, icon
231
+ test_files: []