app-info 2.7.0.beta5 → 2.8.2.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87af7ee3238f0c866c3d4ad7110bba74ae1950e28f1619049ec52470253bf45a
4
- data.tar.gz: 8eeaaa20c0f5e4036e2c2138f51f42554d0e5b73dc340c9a71ea9ce344d0c55a
3
+ metadata.gz: acae0e6afac09e51c307232f2f6fbb7b9c5d8164cfcb04b41399129213b94790
4
+ data.tar.gz: ce8d5c78d09665d5b28341ad9a3a436ab8da67dd6d6de64c58ac293afce16393
5
5
  SHA512:
6
- metadata.gz: c61cf34da0123d9cd6e0df63f3f342d61858c3dfc9dfd8e57cfce7a18af9bae5fbc85b8a20e79a9e8b54a630b240105ce036b0f03c49fd96df8945fa472ae148
7
- data.tar.gz: ae7f4064095ad2c1518095876532c7c6364a785209fefb9e8fbf1fa7c3fe02fe3027df20572db55b5fb72d8cdadd70e59738ec0458a3fd391c264b168f744ff5
6
+ metadata.gz: f33fda6c627d595056189fb41d1b2807104a0de328a80d96cd866d03ad1d894025610a077a20e8f4b700185ce0f72b656fbd642996dc85e7399b92f1a043a409
7
+ data.tar.gz: af45f63c197b3c5490a597aedf438f14af63ee997dbc1c589240dba2aa4225067e8183d38d9d299058891dc83b4adff740f8834e1e06fe7b6da412ef8d0ad555
data/CHANGELOG.md CHANGED
@@ -9,6 +9,24 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
9
9
 
10
10
  > List all changes before release a new version.
11
11
 
12
+ ## [2.8.1] (2021-12-20)
13
+
14
+ ### Fixed
15
+
16
+ - Fix no found intent filter in manifest error.
17
+
18
+ ## [2.8.0] (2021-12-16)
19
+
20
+ ### Added
21
+
22
+ - New methods added to `apk` and `aab` [3adfa223](https://github.com/icyleaf/app_info/tree/3adfa223479caa672fce5d3a119b6db098463699) [939a6506](https://github.com/icyleaf/app_info/tree/939a6506f3ac1cb7ad1ed46128df41de6ee3b0d0)
23
+
24
+ ## [2.7.0] (2021-10-15)
25
+
26
+ ### Added
27
+
28
+ - Android App Bundle (a.k.a) aab support!!! parts support [#36](https://github.com/icyleaf/app_info/pull/36)
29
+
12
30
  ## [2.7.0.beta5] (2021-10-14)
13
31
 
14
32
  ### Fixed
@@ -204,7 +222,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
204
222
 
205
223
  - Updated dependency of CFPropertly list be a range between 2.3.4. (thanks @[cschroed](https://github.com/cschroed))
206
224
 
207
- [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.7.0.beta5..HEAD
225
+ [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.8.1..HEAD
226
+ [2.8.1]: https://github.com/icyleaf/app-info/compare/v2.8.0...v2.8.1
227
+ [2.8.0]: https://github.com/icyleaf/app-info/compare/v2.7.0...v2.8.0
228
+ [2.7.0]: https://github.com/icyleaf/app-info/compare/v2.6.5...v2.7.0
208
229
  [2.7.0.beta5]: https://github.com/icyleaf/app-info/compare/v2.7.0.beta2...v2.7.0.beta5
209
230
  [2.7.0.beta2]: https://github.com/icyleaf/app-info/compare/v2.7.0.beta1...v2.7.0.beta2
210
231
  [2.7.0.beta1]: https://github.com/icyleaf/app-info/compare/v2.6.5...v2.7.0.beta1
data/README.md CHANGED
@@ -49,6 +49,7 @@ require 'app-info'
49
49
  parser = AppInfo.parse('iphone.ipa')
50
50
  parser = AppInfo.parse('ipad.ipa')
51
51
  parser = AppInfo.parse('android.apk')
52
+ parser = AppInfo.parse('android.aab')
52
53
  parser = AppInfo.parse('u-u-i-d.mobileprovision')
53
54
  parser = AppInfo.parse('macOS.App.zip')
54
55
  parser = AppInfo.parse('App.dSYm.zip')
@@ -153,56 +154,67 @@ profile.enabled_capabilities
153
154
 
154
155
  ### Android
155
156
 
157
+ Accept `.aab` and `.apk` Android file.
158
+
156
159
  ```ruby
157
- apk = AppInfo.parse('android.apk')
160
+ android = AppInfo.parse('android.apk_or_aab')
158
161
 
159
162
  # get app file size
160
- apk.size
163
+ android.size
161
164
  # => 3093823
162
165
 
163
166
  # get app file size in human reable.
164
- apk.size(human_size: true)
167
+ android.size(human_size: true)
165
168
  # => 29 MB
166
169
 
167
170
  # get app release version
168
- apk.release_version
171
+ android.release_version
169
172
  # => 1.0
170
173
 
171
174
  # get app package name
172
- apk.bundle_id
175
+ android.bundle_id
173
176
  # => com.icyleaf.AppInfoDemo
174
177
 
178
+ # detect app type (It's difficult to detect phone or tablet)
179
+ android.tv?
180
+ android.wear?
181
+ android.automotive?
182
+
175
183
  # get app icons
176
- apk.icons
184
+ android.icons
177
185
  # => [{:name=>"ic_launcher.png", :file=> "/temp/dir/app/ic_launcher.png", :dimensions=>[48, 48]}, ...]
178
186
 
179
187
  # get app support min sdk version
180
- apk.min_sdk_version
188
+ android.min_sdk_version
181
189
  # => 13
182
190
 
183
191
  # get use_permissions list
184
- apk.use_permissions
192
+ android.use_permissions
185
193
  # => [...]
186
194
 
187
195
  # get activitiy list
188
- apk.activities
196
+ android.activities
189
197
  # => [...]
190
198
 
191
199
  # get service list
192
- apk.services
200
+ android.services
193
201
  # => [...]
194
202
 
195
- # get certificate list
196
- apk.certificates
197
- # => [...]
203
+ # get deep links host
204
+ android.deep_links
205
+ # => ['a.com']
198
206
 
199
- # get sign list
200
- apk.signs
207
+ # get schemes without http or https
208
+ android.schemes
209
+ # => ['appinfo']
210
+
211
+ # get sign list (only v1 sign)
212
+ android.signs
201
213
  # => [...]
202
214
 
203
- # detect app type (It's difficult to detect phone or tablet)
204
- apk.tv?
205
- apk.wear?
215
+ # get certificate list (only v1 sign)
216
+ android.certificates
217
+ # => [...]
206
218
  ```
207
219
 
208
220
  ### macOS
@@ -296,9 +308,9 @@ It is possible to use this gem as a command line interface to parse mobile app:
296
308
  ```
297
309
  > app-info
298
310
 
299
- app-info (0.6.0)> p = AppInfo.parse('/path/to/app')
311
+ app-info (2.7.0)> p = AppInfo.parse('/path/to/app')
300
312
  => #<AppInfo::APK::......>
301
- app-info (0.6.0)> p.name
313
+ app-info (2.7.0)> p.name
302
314
  => "AppName"
303
315
  ```
304
316
 
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
4
4
  require 'app_info'
5
5
  require 'bundler/gem_tasks'
6
6
  require 'rspec/core/rake_task'
7
+ require 'rubocop/rake_task'
7
8
 
8
9
  RSpec::Core::RakeTask.new(:spec)
9
10
 
data/app_info.gemspec CHANGED
@@ -21,13 +21,13 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = '>= 2.5'
22
22
 
23
23
  spec.add_dependency 'CFPropertyList', '< 3.1.0', '>= 2.3.4'
24
- spec.add_dependency 'image_size', '>= 1.5', '< 2.2'
24
+ spec.add_dependency 'image_size', '>= 1.5', '< 3.1'
25
25
  spec.add_dependency 'ruby-macho', '< 3', '>= 1.4'
26
- spec.add_dependency 'android_parser', '~> 2.4.1'
26
+ spec.add_dependency 'android_parser', '~> 2.5.0'
27
27
  spec.add_dependency 'rubyzip', '>= 1.2', '< 3.0'
28
28
  spec.add_dependency 'uuidtools', '>= 2.1.5', '< 2.3.0'
29
29
  spec.add_dependency 'icns', '~> 0.2.0'
30
- spec.add_dependency 'google-protobuf', '~> 3.18.0'
30
+ spec.add_dependency 'google-protobuf', '~> 3.19.2'
31
31
 
32
32
  spec.add_development_dependency 'bundler', '>= 1.12'
33
33
  spec.add_development_dependency 'rake', '>= 10.0'
data/lib/app_info/aab.rb CHANGED
@@ -14,10 +14,11 @@ module AppInfo
14
14
 
15
15
  # APK Devices
16
16
  module Device
17
- PHONE = 'Phone'
18
- TABLET = 'Tablet'
19
- WATCH = 'Watch'
20
- TV = 'Television'
17
+ PHONE = 'Phone'
18
+ TABLET = 'Tablet'
19
+ WATCH = 'Watch'
20
+ TV = 'Television'
21
+ AUTOMOTIVE = 'Automotive'
21
22
  end
22
23
 
23
24
  BASE_PATH = 'base'
@@ -37,7 +38,7 @@ module AppInfo
37
38
  end
38
39
  alias file_type os
39
40
 
40
- def_delegators :manifest, :version_name
41
+ def_delegators :manifest, :version_name, :deep_links, :schemes
41
42
 
42
43
  alias release_version version_name
43
44
 
@@ -61,6 +62,8 @@ module AppInfo
61
62
  Device::WATCH
62
63
  elsif tv?
63
64
  Device::TV
65
+ elsif automotive?
66
+ Device::AUTOMOTIVE
64
67
  else
65
68
  Device::PHONE
66
69
  end
@@ -83,6 +86,10 @@ module AppInfo
83
86
  use_features.include?('android.software.leanback')
84
87
  end
85
88
 
89
+ def automotive?
90
+ use_features.include?('android.hardware.type.automotive')
91
+ end
92
+
86
93
  def min_sdk_version
87
94
  manifest.uses_sdk.min_sdk_version
88
95
  end
@@ -112,6 +119,18 @@ module AppInfo
112
119
  @components ||= manifest.components.transform_values
113
120
  end
114
121
 
122
+ def sign_version
123
+ return 'v1' unless signs.empty?
124
+
125
+ # when ?
126
+ # https://source.android.com/security/apksigning/v2?hl=zh-cn
127
+ # 'v2'
128
+ # when ?
129
+ # https://source.android.com/security/apksigning/v3?hl=zh-cn
130
+ # 'v3'
131
+ 'unknown'
132
+ end
133
+
115
134
  def signs
116
135
  return @signs if @signs
117
136
 
data/lib/app_info/apk.rb CHANGED
@@ -14,10 +14,11 @@ module AppInfo
14
14
 
15
15
  # APK Devices
16
16
  module Device
17
- PHONE = 'Phone'
18
- TABLET = 'Tablet'
19
- WATCH = 'Watch'
20
- TV = 'Television'
17
+ PHONE = 'Phone'
18
+ TABLET = 'Tablet'
19
+ WATCH = 'Watch'
20
+ TV = 'Television'
21
+ AUTOMOTIVE = 'Automotive'
21
22
  end
22
23
 
23
24
  def initialize(file)
@@ -35,8 +36,9 @@ module AppInfo
35
36
 
36
37
  def_delegators :apk, :manifest, :resource, :dex
37
38
 
38
- def_delegators :manifest, :version_name, :package_name,
39
- :use_permissions, :components
39
+ def_delegators :manifest, :version_name, :package_name, :target_sdk_version,
40
+ :components, :services, :use_permissions, :use_features,
41
+ :deep_links, :schemes
40
42
 
41
43
  alias release_version version_name
42
44
  alias identifier package_name
@@ -56,14 +58,15 @@ module AppInfo
56
58
  Device::WATCH
57
59
  elsif tv?
58
60
  Device::TV
61
+ elsif automotive?
62
+ Device::AUTOMOTIVE
59
63
  else
60
64
  Device::PHONE
61
65
  end
62
66
  end
63
67
 
64
- # TODO: find a way to detect
68
+ # TODO: find a way to detect, no way!
65
69
  # def tablet?
66
- # resource
67
70
  # end
68
71
 
69
72
  def wear?
@@ -74,20 +77,25 @@ module AppInfo
74
77
  use_features.include?('android.software.leanback')
75
78
  end
76
79
 
80
+ def automotive?
81
+ use_features.include?('android.hardware.type.automotive')
82
+ end
83
+
77
84
  def min_sdk_version
78
85
  manifest.min_sdk_ver
79
86
  end
80
87
  alias min_os_version min_sdk_version
81
88
 
82
- def target_sdk_version
83
- manifest.doc
84
- .elements['/manifest/uses-sdk']
85
- .attributes['targetSdkVersion']
86
- .to_i
87
- end
89
+ def sign_version
90
+ return 'v1' unless signs.empty?
88
91
 
89
- def use_features
90
- manifest_values('/manifest/uses-feature')
92
+ # when ?
93
+ # https://source.android.com/security/apksigning/v2?hl=zh-cn
94
+ # 'v2'
95
+ # when ?
96
+ # https://source.android.com/security/apksigning/v3?hl=zh-cn
97
+ # 'v3'
98
+ 'unknown'
91
99
  end
92
100
 
93
101
  def signs
@@ -106,10 +114,6 @@ module AppInfo
106
114
  components.select { |c| c.type == 'activity' }
107
115
  end
108
116
 
109
- def services
110
- components.select { |c| c.type == 'service' }
111
- end
112
-
113
117
  def apk
114
118
  @apk ||= ::Android::Apk.new(@file)
115
119
  end
@@ -146,16 +150,6 @@ module AppInfo
146
150
  @contents ||= File.join(Dir.mktmpdir, "AppInfo-android-#{SecureRandom.hex}")
147
151
  end
148
152
 
149
- private
150
-
151
- def manifest_values(path, key = 'name')
152
- values = []
153
- manifest.doc.each_element(path) do |elem|
154
- values << elem.attributes[key]
155
- end
156
- values.uniq
157
- end
158
-
159
153
  # Android Certificate
160
154
  class Certificate
161
155
  attr_reader :path, :certificate
@@ -129,19 +129,98 @@ module AppInfo
129
129
  end
130
130
 
131
131
  def activities
132
- application.activity
132
+ application.respond_to?(:activity) ? application.activity : []
133
133
  end
134
134
 
135
135
  def services
136
- application.service
136
+ application.respond_to?(:service) ? application.service : []
137
137
  end
138
138
 
139
139
  def icons
140
140
  @resources.find(application.icon)
141
141
  end
142
142
 
143
+ def deep_links
144
+ intent_filters(search: :deep_links)
145
+ end
146
+
147
+ def schemes
148
+ intent_filters(search: :schemes)
149
+ end
150
+
151
+ private
152
+
153
+ def intent_filters(search: nil)
154
+ activities.each_with_object([]) do |activity, obj|
155
+ intent_filters = activity.intent_filter
156
+ next if intent_filters&.empty?
157
+
158
+ if search.nil? || search.empty?
159
+ obj << intent_filters
160
+ else
161
+ intent_filters.each do |filter|
162
+ exist_method = "#{search}?".to_sym
163
+ next if filter.respond_to?(exist_method) && !filter.send(exist_method)
164
+
165
+ obj << filter.send(search)
166
+ end
167
+ end
168
+ end.flatten.uniq
169
+ end
170
+
171
+ # :nodoc:
143
172
  # Workaround ruby always return true by called `Object.const_defined?(Data)`
144
173
  class Data < Node; end
174
+
175
+ class IntentFilter < Node
176
+ # filter types (action is required, category and data are optional)
177
+ TYPES = %w[action category data].freeze
178
+
179
+ DEEP_LINK_SCHEMES = %w[http https].freeze
180
+
181
+ # browsable of category
182
+ CATEGORY_BROWSABLE = 'android.intent.category.BROWSABLE'
183
+
184
+ def deep_links?
185
+ browsable? && data.any? { |d| DEEP_LINK_SCHEMES.include?(d.scheme) }
186
+ end
187
+
188
+ def deep_links
189
+ return unless deep_links?
190
+
191
+ data.reject { |d| d.host.nil? }
192
+ .map(&:host)
193
+ .uniq
194
+ end
195
+
196
+ def schemes
197
+ return unless schemes?
198
+
199
+ data.select { |d| !d.scheme.nil? && !DEEP_LINK_SCHEMES.include?(d.scheme) }
200
+ .map(&:scheme)
201
+ .uniq
202
+ end
203
+
204
+ def schemes?
205
+ browsable? && data.any? { |d| !DEEP_LINK_SCHEMES.include?(d.scheme) }
206
+ end
207
+
208
+ def browsable?
209
+ exist?(CATEGORY_BROWSABLE)
210
+ end
211
+
212
+ def exist?(name, type: nil)
213
+ if type.to_s.empty? && !name.start_with?('android.intent.')
214
+ raise 'Fill type or use correct name'
215
+ end
216
+
217
+ type ||= name.split('.')[2]
218
+ raise 'Not found type' unless TYPES.include?(type)
219
+
220
+ values = send(type.to_sym).select { |e| e.name == name }
221
+ values.empty? ? false : values
222
+ end
223
+ end
145
224
  end
146
225
  end
147
226
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppInfo
4
- VERSION = '2.7.0.beta5'
4
+ VERSION = '2.8.2.beta1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app-info
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0.beta5
4
+ version: 2.8.2.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - icyleaf
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-14 00:00:00.000000000 Z
11
+ date: 2022-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: CFPropertyList
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '1.5'
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: '2.2'
42
+ version: '3.1'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ dependencies:
49
49
  version: '1.5'
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: '2.2'
52
+ version: '3.1'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: ruby-macho
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -76,14 +76,14 @@ dependencies:
76
76
  requirements:
77
77
  - - "~>"
78
78
  - !ruby/object:Gem::Version
79
- version: 2.4.1
79
+ version: 2.5.0
80
80
  type: :runtime
81
81
  prerelease: false
82
82
  version_requirements: !ruby/object:Gem::Requirement
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: 2.4.1
86
+ version: 2.5.0
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: rubyzip
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -144,14 +144,14 @@ dependencies:
144
144
  requirements:
145
145
  - - "~>"
146
146
  - !ruby/object:Gem::Version
147
- version: 3.18.0
147
+ version: 3.19.2
148
148
  type: :runtime
149
149
  prerelease: false
150
150
  version_requirements: !ruby/object:Gem::Requirement
151
151
  requirements:
152
152
  - - "~>"
153
153
  - !ruby/object:Gem::Version
154
- version: 3.18.0
154
+ version: 3.19.2
155
155
  - !ruby/object:Gem::Dependency
156
156
  name: bundler
157
157
  requirement: !ruby/object:Gem::Requirement
@@ -276,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
276
276
  - !ruby/object:Gem::Version
277
277
  version: 1.3.1
278
278
  requirements: []
279
- rubygems_version: 3.1.4
279
+ rubygems_version: 3.2.3
280
280
  signing_key:
281
281
  specification_version: 4
282
282
  summary: Teardown tool for mobile app(ipa/apk) and dSYM file, analysis metedata like