app-info 2.7.0 → 2.8.2

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: e1e0ca3539dc493e0003d18ad437da67c6a80f9c131de3e191139e7b03abb6f0
4
- data.tar.gz: 490bca65c07243e7e27b296c2f5143da879cefcb6ff87081d8ef9322f62fd3d6
3
+ metadata.gz: a3da34af686efd6aacd4b80fbb8b49a9c1dd38f101075a4950214ef3bc83314b
4
+ data.tar.gz: 0c0359085eca517924e26b89e649ce6ae42683532676dc0f14613daccab3686b
5
5
  SHA512:
6
- metadata.gz: a50f751f9bc6fe9336beb91fe4306be0824e45129d4e4d2c3b860751eca1b8c51ffb1544e48514c2b1d90c4a0c9a09d404433396bec2cd4193c116511a1ba125
7
- data.tar.gz: 6cb7dd2d79e0ed787ecbc2dd9197c3a1cbefaea1f7f6aead46ce5ac4f7eeaf4c70ab98f3baefc8c0d506cc10b95aa97aef308a418d446e6a72279b0f470ecac0
6
+ metadata.gz: d9fa46b089aae06843662fd5f5780012f34b0913a231183e18a7a8bdec227012069c1e0d11ae613460f7b5b73cd76c7039e46e85215b6d103360be9d05391bd6
7
+ data.tar.gz: a2f9e51a8180b6baac585fd5f5e02528ddd46063477e1fcb3738967e0738b56aab902096694483c834473f17cf3e229d4241a62351297c76243383979b61da4b
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.2] (2022-02-13)
13
+
14
+ ### Fixed
15
+
16
+ - Fix Arm-based M1 macOS.
17
+
18
+ ## [2.8.1] (2021-12-20)
19
+
20
+ ### Fixed
21
+
22
+ - Fix no found intent filter in manifest error.
23
+
24
+ ## [2.8.0] (2021-12-16)
25
+
26
+ ### Added
27
+
28
+ - 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)
29
+
12
30
  ## [2.7.0] (2021-10-15)
13
31
 
14
32
  ### Added
@@ -210,7 +228,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
210
228
 
211
229
  - Updated dependency of CFPropertly list be a range between 2.3.4. (thanks @[cschroed](https://github.com/cschroed))
212
230
 
213
- [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.6.5..HEAD
231
+ [Unreleased]: https://github.com/icyleaf/app-info/compare/v2.8.2..HEAD
232
+ [2.8.2]: https://github.com/icyleaf/app-info/compare/v2.8.1...v2.8.2
233
+ [2.8.1]: https://github.com/icyleaf/app-info/compare/v2.8.0...v2.8.1
234
+ [2.8.0]: https://github.com/icyleaf/app-info/compare/v2.7.0...v2.8.0
214
235
  [2.7.0]: https://github.com/icyleaf/app-info/compare/v2.6.5...v2.7.0
215
236
  [2.7.0.beta5]: https://github.com/icyleaf/app-info/compare/v2.7.0.beta2...v2.7.0.beta5
216
237
  [2.7.0.beta2]: https://github.com/icyleaf/app-info/compare/v2.7.0.beta1...v2.7.0.beta2
data/Gemfile CHANGED
@@ -5,8 +5,8 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in app-info.gemspec
6
6
  gemspec
7
7
 
8
- group :development do
9
- gem 'awesome_print'
10
- gem 'debase'
11
- gem 'ruby-debug-ide'
12
- end
8
+ # group :development do
9
+ # gem 'awesome_print'
10
+ # gem 'debase'
11
+ # gem 'ruby-debug-ide'
12
+ # end
data/README.md CHANGED
@@ -154,56 +154,67 @@ profile.enabled_capabilities
154
154
 
155
155
  ### Android
156
156
 
157
+ Accept `.aab` and `.apk` Android file.
158
+
157
159
  ```ruby
158
- apk = AppInfo.parse('android.apk')
160
+ android = AppInfo.parse('android.apk_or_aab')
159
161
 
160
162
  # get app file size
161
- apk.size
163
+ android.size
162
164
  # => 3093823
163
165
 
164
166
  # get app file size in human reable.
165
- apk.size(human_size: true)
167
+ android.size(human_size: true)
166
168
  # => 29 MB
167
169
 
168
170
  # get app release version
169
- apk.release_version
171
+ android.release_version
170
172
  # => 1.0
171
173
 
172
174
  # get app package name
173
- apk.bundle_id
175
+ android.bundle_id
174
176
  # => com.icyleaf.AppInfoDemo
175
177
 
178
+ # detect app type (It's difficult to detect phone or tablet)
179
+ android.tv?
180
+ android.wear?
181
+ android.automotive?
182
+
176
183
  # get app icons
177
- apk.icons
184
+ android.icons
178
185
  # => [{:name=>"ic_launcher.png", :file=> "/temp/dir/app/ic_launcher.png", :dimensions=>[48, 48]}, ...]
179
186
 
180
187
  # get app support min sdk version
181
- apk.min_sdk_version
188
+ android.min_sdk_version
182
189
  # => 13
183
190
 
184
191
  # get use_permissions list
185
- apk.use_permissions
192
+ android.use_permissions
186
193
  # => [...]
187
194
 
188
195
  # get activitiy list
189
- apk.activities
196
+ android.activities
190
197
  # => [...]
191
198
 
192
199
  # get service list
193
- apk.services
200
+ android.services
194
201
  # => [...]
195
202
 
196
- # get certificate list
197
- apk.certificates
198
- # => [...]
203
+ # get deep links host
204
+ android.deep_links
205
+ # => ['a.com']
199
206
 
200
- # get sign list
201
- 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
202
213
  # => [...]
203
214
 
204
- # detect app type (It's difficult to detect phone or tablet)
205
- apk.tv?
206
- apk.wear?
215
+ # get certificate list (only v1 sign)
216
+ android.certificates
217
+ # => [...]
207
218
  ```
208
219
 
209
220
  ### macOS
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'
25
- spec.add_dependency 'ruby-macho', '< 3', '>= 1.4'
26
- spec.add_dependency 'android_parser', '~> 2.4.1'
24
+ spec.add_dependency 'image_size', '>= 1.5', '< 3.1'
25
+ spec.add_dependency 'ruby-macho', '>= 1.4', '< 4'
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.4'
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'
4
+ VERSION = '2.8.2'
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
4
+ version: 2.8.2
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-15 00:00:00.000000000 Z
11
+ date: 2022-02-13 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,41 +49,41 @@ 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
56
56
  requirements:
57
- - - "<"
58
- - !ruby/object:Gem::Version
59
- version: '3'
60
57
  - - ">="
61
58
  - !ruby/object:Gem::Version
62
59
  version: '1.4'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '4'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - "<"
68
- - !ruby/object:Gem::Version
69
- version: '3'
70
67
  - - ">="
71
68
  - !ruby/object:Gem::Version
72
69
  version: '1.4'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '4'
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: android_parser
75
75
  requirement: !ruby/object:Gem::Requirement
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.4
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.4
155
155
  - !ruby/object:Gem::Dependency
156
156
  name: bundler
157
157
  requirement: !ruby/object:Gem::Requirement