app-info 2.8.5 → 3.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +12 -7
- data/.github/workflows/ci.yml +3 -1
- data/.rubocop.yml +33 -11
- data/CHANGELOG.md +34 -1
- data/Gemfile +7 -1
- data/README.md +68 -13
- data/Rakefile +11 -0
- data/app_info.gemspec +12 -3
- data/lib/app_info/aab.rb +48 -108
- data/lib/app_info/android/signature.rb +114 -0
- data/lib/app_info/android/signatures/base.rb +53 -0
- data/lib/app_info/android/signatures/info.rb +158 -0
- data/lib/app_info/android/signatures/v1.rb +63 -0
- data/lib/app_info/android/signatures/v2.rb +121 -0
- data/lib/app_info/android/signatures/v3.rb +131 -0
- data/lib/app_info/android/signatures/v4.rb +18 -0
- data/lib/app_info/android.rb +162 -0
- data/lib/app_info/apk.rb +54 -111
- data/lib/app_info/apple.rb +192 -0
- data/lib/app_info/certificate.rb +175 -0
- data/lib/app_info/const.rb +75 -0
- data/lib/app_info/core_ext/object/try.rb +3 -1
- data/lib/app_info/core_ext/string/inflector.rb +2 -0
- data/lib/app_info/dsym/debug_info.rb +72 -0
- data/lib/app_info/dsym/macho.rb +55 -0
- data/lib/app_info/dsym.rb +31 -135
- data/lib/app_info/error.rb +2 -2
- data/lib/app_info/file.rb +49 -0
- data/lib/app_info/helper/archive.rb +37 -0
- data/lib/app_info/helper/file_size.rb +25 -0
- data/lib/app_info/helper/generate_class.rb +29 -0
- data/lib/app_info/helper/protobuf.rb +12 -0
- data/lib/app_info/helper/signatures.rb +229 -0
- data/lib/app_info/helper.rb +5 -126
- data/lib/app_info/info_plist.rb +66 -29
- data/lib/app_info/ipa/framework.rb +4 -4
- data/lib/app_info/ipa.rb +61 -135
- data/lib/app_info/macos.rb +54 -102
- data/lib/app_info/mobile_provision.rb +67 -49
- data/lib/app_info/pe.rb +260 -0
- data/lib/app_info/png_uncrush.rb +24 -4
- data/lib/app_info/proguard.rb +29 -16
- data/lib/app_info/protobuf/manifest.rb +6 -3
- data/lib/app_info/protobuf/models/Configuration_pb.rb +1 -0
- data/lib/app_info/protobuf/models/README.md +7 -0
- data/lib/app_info/protobuf/models/Resources_pb.rb +2 -0
- data/lib/app_info/protobuf/resources.rb +5 -5
- data/lib/app_info/version.rb +1 -1
- data/lib/app_info.rb +90 -46
- metadata +48 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 91afee9fd86b49fa4f788f4316df7c689178c6fdfbc0cf3f4743ae5cb7713dde
|
4
|
+
data.tar.gz: 056f2a2416a1a68ca2f2dcbbc404e9f6c768a5e8a742d942f04177c7044f5ff9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2294ae1a6e8d220c46bd21e4c1062783f2ce7b94ad5b5dffdfe8c62edd6e519a57b326913339f090f62bf955d3103a6bf665227865bceb9f45bb7c78478b04f0
|
7
|
+
data.tar.gz: ec84bbc24190227bedd91818bdefad90cb1472e1b7ca1db312aca651843315ab037e7b70f2322085eca70bf3ab0319af3af20270da2a006437f76cf4a4ca3f11
|
data/.github/dependabot.yml
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
version: 2
|
2
2
|
updates:
|
3
|
-
- package-ecosystem: bundler
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
- package-ecosystem: bundler
|
4
|
+
directory: "/"
|
5
|
+
schedule:
|
6
|
+
interval: daily
|
7
|
+
time: "21:00"
|
8
|
+
timezone: Asia/Shanghai
|
9
|
+
open-pull-requests-limit: 10
|
10
|
+
|
11
|
+
- package-ecosystem: "github-actions"
|
12
|
+
directory: "/"
|
13
|
+
schedule:
|
14
|
+
interval: "daily"
|
data/.github/workflows/ci.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -27,6 +27,24 @@ AllCops:
|
|
27
27
|
- 'lib/app_info/protobuf/models/*_pb.rb'
|
28
28
|
- 'main.rb'
|
29
29
|
|
30
|
+
Layout/LineLength:
|
31
|
+
Max: 100
|
32
|
+
Exclude:
|
33
|
+
- 'lib/app_info/helper/signatures.rb'
|
34
|
+
- 'lib/app_info/android/signatures/info.rb'
|
35
|
+
- 'lib/app_info/apk.rb'
|
36
|
+
|
37
|
+
Lint/AssignmentInCondition:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Lint/UnusedMethodArgument:
|
41
|
+
Exclude:
|
42
|
+
- 'lib/app_info/file.rb'
|
43
|
+
|
44
|
+
Lint/UselessAssignment:
|
45
|
+
Exclude:
|
46
|
+
- 'lib/app_info/android/signatures/v3.rb'
|
47
|
+
|
30
48
|
Metrics/AbcSize:
|
31
49
|
Max: 100
|
32
50
|
|
@@ -36,13 +54,15 @@ Metrics/BlockLength:
|
|
36
54
|
- 'lib/app_info/mobile_provision.rb'
|
37
55
|
|
38
56
|
Metrics/MethodLength:
|
39
|
-
Max:
|
57
|
+
Max: 30
|
40
58
|
Exclude:
|
41
|
-
- 'lib/app_info/png_uncrush.rb'
|
42
59
|
- 'lib/app_info/mobile_provision.rb'
|
60
|
+
- 'lib/app_info/android/signatures/v2.rb'
|
61
|
+
- 'lib/app_info/android/signatures/v3.rb'
|
43
62
|
|
44
|
-
|
45
|
-
|
63
|
+
Metrics/ParameterLists:
|
64
|
+
Exclude:
|
65
|
+
- 'lib/app_info/helper/signatures.rb'
|
46
66
|
|
47
67
|
Metrics/ClassLength:
|
48
68
|
CountComments: false
|
@@ -54,12 +74,16 @@ Metrics/CyclomaticComplexity:
|
|
54
74
|
Metrics/PerceivedComplexity:
|
55
75
|
Max: 18
|
56
76
|
|
57
|
-
|
58
|
-
|
77
|
+
Metrics/BlockNesting:
|
78
|
+
Exclude:
|
79
|
+
- 'lib/app_info/dsym.rb'
|
59
80
|
|
60
81
|
Style/Documentation:
|
61
82
|
Enabled: false
|
62
83
|
|
84
|
+
Style/ClassAndModuleChildren:
|
85
|
+
Enabled: false
|
86
|
+
|
63
87
|
Style/PerlBackrefs:
|
64
88
|
Exclude:
|
65
89
|
- 'lib/app_info/core_ext/string/inflector.rb'
|
@@ -67,10 +91,8 @@ Style/PerlBackrefs:
|
|
67
91
|
Style/DocumentDynamicEvalDefinition:
|
68
92
|
Enabled: false
|
69
93
|
|
70
|
-
Metrics/BlockNesting:
|
71
|
-
Exclude:
|
72
|
-
- 'lib/app_info/dsym.rb'
|
73
|
-
|
74
|
-
|
75
94
|
Style/SlicingWithRange:
|
76
95
|
Enabled: false
|
96
|
+
|
97
|
+
Style/ClassVars:
|
98
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -9,6 +9,37 @@ 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
|
+
## [3.0.0.beta2] (2023-04-04)
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
- Re-organize categories `.platform`, `.opera_sytem` and `.device` for all parsers. [#58](https://github.com/icyleaf/app_info/pull/58)
|
17
|
+
- Change ExportType values type to symbol both IPA and macOS parsers. [#58](https://github.com/icyleaf/app_info/pull/58)
|
18
|
+
|
19
|
+
## [3.0.0.beta1] (2023-04-04)
|
20
|
+
|
21
|
+
### Added
|
22
|
+
|
23
|
+
- New Windows PE format parser. [#47](https://github.com/icyleaf/app_info/pull/47)
|
24
|
+
- Android parser add v2, v3 scheme signature support. [#55](https://github.com/icyleaf/app_info/pull/55]
|
25
|
+
- dSYM parer accept multi dSYM target in a zip file. [#56](https://github.com/icyleaf/app_info/pull/56)
|
26
|
+
- Better document for yardoc.
|
27
|
+
|
28
|
+
### Changed
|
29
|
+
|
30
|
+
- Add `AppInfo::File` base class for all parsers.
|
31
|
+
- Add `AppInfo::Certifiate` X509 certificate wrapped and apply in Android/MobileProvision.
|
32
|
+
- Remove `.sign_version` method in Android parser.
|
33
|
+
- Rename `.file_type` to `.format` method in all parers and return a `AppInfo::Format` type.
|
34
|
+
- Remove duplice `AppInfo::AndroidDevice` class.
|
35
|
+
- Remove `AppInfo::MobileProvision::DeveloperCertificate` class, use `AppInfo::Certifiate` instead.
|
36
|
+
- Deprecate `.signs` and `.certifiates` methods in Android parser, use `.signatures` instead.
|
37
|
+
- Deprecate `.developer_certs` method in MobileProvision parser, use `.certificates` instead.
|
38
|
+
|
39
|
+
### Fixed
|
40
|
+
|
41
|
+
- Fixed minor typo.
|
42
|
+
|
12
43
|
## [2.8.5] (2023-03-16)
|
13
44
|
|
14
45
|
### Fixed
|
@@ -247,7 +278,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
247
278
|
|
248
279
|
- Updated dependency of CFPropertly list be a range between 2.3.4. (thanks @[cschroed](https://github.com/cschroed))
|
249
280
|
|
250
|
-
[Unreleased]: https://github.com/icyleaf/app-info/compare/
|
281
|
+
[Unreleased]: https://github.com/icyleaf/app-info/compare/v3.0.0.beta2..HEAD
|
282
|
+
[3.0.0.beta2]: https://github.com/icyleaf/app-info/compare/v3.0.0.beta1...v3.0.0.beta2
|
283
|
+
[3.0.0.beta1]: https://github.com/icyleaf/app-info/compare/v2.8.5...v3.0.0.beta1
|
251
284
|
[2.8.5]: https://github.com/icyleaf/app-info/compare/v2.8.4...v2.8.5
|
252
285
|
[2.8.4]: https://github.com/icyleaf/app-info/compare/v2.8.3...v2.8.4
|
253
286
|
[2.8.3]: https://github.com/icyleaf/app-info/compare/v2.8.2...v2.8.3
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
#
|
1
|
+
# app-info
|
2
2
|
|
3
|
-
[](.github/workflows/ci.yml)
|
4
|
+
[](https://rubygems.org/gems/app-info)
|
4
5
|
[](https://github.com/icyleaf/app_info/actions/workflows/ci.yml)
|
5
|
-
[](LICENSE)
|
6
|
+
[](LICENSE)
|
7
7
|
|
8
|
-
Teardown tool for mobile app (ipa, apk and aab file), macOS app
|
8
|
+
Teardown tool for mobile app (ipa, apk and aab file), macOS app, dSYM.zip file and Windows PE file.
|
9
|
+
Analysis metedata like version, name, icon etc.
|
9
10
|
|
10
11
|
## Support
|
11
12
|
|
@@ -16,10 +17,13 @@ Teardown tool for mobile app (ipa, apk and aab file), macOS app and dSYM.zip fil
|
|
16
17
|
- `.ipa`
|
17
18
|
- `Info.plist` file
|
18
19
|
- `.mobileprovision`/`.provisionprofile` file
|
19
|
-
-
|
20
|
+
- macOS App file (archived by starnd pkzip format)
|
20
21
|
- `.app.zip`
|
21
|
-
-
|
22
|
+
- dSYMs file (archived by starnd pkzip format)
|
22
23
|
- `.dSYM.zip`
|
24
|
+
- Windows PE file
|
25
|
+
- `.exe`
|
26
|
+
- `.zip` (binary in a zip file)
|
23
27
|
|
24
28
|
<hr />
|
25
29
|
|
@@ -65,6 +69,8 @@ parser = AppInfo.parse('android.aab')
|
|
65
69
|
parser = AppInfo.parse('u-u-i-d.mobileprovision')
|
66
70
|
parser = AppInfo.parse('macOS.App.zip')
|
67
71
|
parser = AppInfo.parse('App.dSYm.zip')
|
72
|
+
parser = AppInfo.parse('win.exe')
|
73
|
+
parser = AppInfo.parse('win.zip')
|
68
74
|
|
69
75
|
# If detect file type failed, you can parse in other way
|
70
76
|
parser = AppInfo::IPA.new('iphone.ipa')
|
@@ -74,6 +80,7 @@ parser = AppInfo::InfoPlist.new('Info.plist')
|
|
74
80
|
parser = AppInfo::MobileProvision.new('uuid.mobileprovision')
|
75
81
|
parser = AppInfo::Macos.new('App.dSYm.zip')
|
76
82
|
parser = AppInfo::DSYM.new('App.dSYm.zip')
|
83
|
+
parser = AppInfo::PE.new('win.exe')
|
77
84
|
```
|
78
85
|
|
79
86
|
### iOS
|
@@ -220,12 +227,8 @@ android.deep_links
|
|
220
227
|
android.schemes
|
221
228
|
# => ['appinfo']
|
222
229
|
|
223
|
-
# get
|
224
|
-
android.
|
225
|
-
# => [...]
|
226
|
-
|
227
|
-
# get certificate list (only v1 sign)
|
228
|
-
android.certificates
|
230
|
+
# get v1-v3 scheme singature information (included unverified certificate and more)
|
231
|
+
android.signatures
|
229
232
|
# => [...]
|
230
233
|
```
|
231
234
|
|
@@ -313,6 +316,58 @@ dsym.machos.each do |macho|
|
|
313
316
|
end
|
314
317
|
```
|
315
318
|
|
319
|
+
### Windows
|
320
|
+
|
321
|
+
Accept any PE format file, such like `.exe` or `.exe` binary fin a zip file.
|
322
|
+
|
323
|
+
```ruby
|
324
|
+
win = AppInfo.parse('win.exe')
|
325
|
+
|
326
|
+
# get given file size
|
327
|
+
win.size
|
328
|
+
# => 3093823
|
329
|
+
|
330
|
+
# get given file size in human reable.
|
331
|
+
win.size(human_size: true)
|
332
|
+
# => 29 MB
|
333
|
+
|
334
|
+
# get given file size
|
335
|
+
win.binary_size
|
336
|
+
# => 20940
|
337
|
+
|
338
|
+
# get given file size in human reable.
|
339
|
+
win.size(human_size: true)
|
340
|
+
# => 20 MB
|
341
|
+
|
342
|
+
# get product name
|
343
|
+
win.name
|
344
|
+
# => AppInfo
|
345
|
+
|
346
|
+
# get app company name
|
347
|
+
win.company_name
|
348
|
+
# => EWS Studio
|
349
|
+
|
350
|
+
# get app product version (alias to release_version)
|
351
|
+
win.product_version
|
352
|
+
# => 1.0.0
|
353
|
+
|
354
|
+
# get app assembly version (alias to build_version)
|
355
|
+
win.assembly_version
|
356
|
+
# => 1.0.0
|
357
|
+
|
358
|
+
# detect architecture(s)
|
359
|
+
win.archs
|
360
|
+
# => x64
|
361
|
+
|
362
|
+
# get all imports files
|
363
|
+
win.imports
|
364
|
+
# => [KERNEL32.dll, ...]
|
365
|
+
|
366
|
+
# get app icons (bmp format image)
|
367
|
+
win.icons
|
368
|
+
# => [{:name=>"ICON.bmp", :file=>"{path}/ICON.bmp"}, :dimensions=>[64, 64]}, ...]
|
369
|
+
```
|
370
|
+
|
316
371
|
## CLI Shell (Interactive console)
|
317
372
|
|
318
373
|
It is possible to use this gem as a command line interface to parse mobile app:
|
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift File.expand_path('lib', __dir__)
|
4
4
|
require 'app_info'
|
5
|
+
require 'yard'
|
5
6
|
require 'bundler/gem_tasks'
|
6
7
|
require 'rspec/core/rake_task'
|
7
8
|
require 'rubocop/rake_task'
|
@@ -9,3 +10,13 @@ require 'rubocop/rake_task'
|
|
9
10
|
RSpec::Core::RakeTask.new(:spec)
|
10
11
|
|
11
12
|
task default: :spec
|
13
|
+
|
14
|
+
task :doc do
|
15
|
+
YARD::Rake::YardocTask.new do |t|
|
16
|
+
t.files = ['lib/**/*.rb', 'README.md', 'LICENSE']
|
17
|
+
# t.options = ['--any', '--extra', '--opts'] # optional
|
18
|
+
# t.stats_options = ['--list-undoc'] # optional
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
data/app_info.gemspec
CHANGED
@@ -23,14 +23,23 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'CFPropertyList', '< 3.1.0', '>= 2.3.4'
|
24
24
|
spec.add_dependency 'image_size', '>= 1.5', '< 3.3'
|
25
25
|
spec.add_dependency 'ruby-macho', '>= 1.4', '< 4'
|
26
|
-
spec.add_dependency 'android_parser', '~> 2.
|
26
|
+
spec.add_dependency 'android_parser', '~> 2.6.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 'pedump', '~> 0.6.2'
|
30
31
|
spec.add_dependency 'google-protobuf', '>= 3.19.4', '< 3.23.0'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'bundler', '>= 1.12'
|
33
34
|
spec.add_development_dependency 'rake', '>= 10.0'
|
34
|
-
|
35
|
-
spec.
|
35
|
+
|
36
|
+
spec.post_install_message = <<~ENDBANNER
|
37
|
+
AppInfo 3.0 is coming!
|
38
|
+
**********************
|
39
|
+
The public API of some AppInfo classes has been changed.
|
40
|
+
|
41
|
+
Please ensure that your Gemfiles and .gemspecs are suitably restrictive
|
42
|
+
to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.8.5).
|
43
|
+
See https://github.com/icyleaf/app_info for details.
|
44
|
+
ENDBANNER
|
36
45
|
end
|
data/lib/app_info/aab.rb
CHANGED
@@ -1,160 +1,85 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'app_info/protobuf/manifest'
|
4
|
-
require 'image_size'
|
5
|
-
require 'forwardable'
|
6
4
|
|
7
5
|
module AppInfo
|
8
|
-
# Parse APK file
|
9
|
-
class AAB
|
10
|
-
include Helper::HumanFileSize
|
11
|
-
extend Forwardable
|
12
|
-
|
13
|
-
attr_reader :file
|
14
|
-
|
15
|
-
# APK Devices
|
16
|
-
module Device
|
17
|
-
PHONE = 'Phone'
|
18
|
-
TABLET = 'Tablet'
|
19
|
-
WATCH = 'Watch'
|
20
|
-
TV = 'Television'
|
21
|
-
AUTOMOTIVE = 'Automotive'
|
22
|
-
end
|
23
|
-
|
6
|
+
# Parse APK file parser
|
7
|
+
class AAB < Android
|
24
8
|
BASE_PATH = 'base'
|
25
9
|
BASE_MANIFEST = "#{BASE_PATH}/manifest/AndroidManifest.xml"
|
26
10
|
BASE_RESOURCES = "#{BASE_PATH}/resources.pb"
|
27
11
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
Platform::ANDROID
|
38
|
-
end
|
39
|
-
alias file_type os
|
40
|
-
|
12
|
+
# @!method version_name
|
13
|
+
# @see Protobuf::Manifest#version_name
|
14
|
+
# @return [String]
|
15
|
+
# @!method deep_links
|
16
|
+
# @see Protobuf::Manifest#deep_links
|
17
|
+
# @return [String]
|
18
|
+
# @!method schemes
|
19
|
+
# @see Protobuf::Manifest#schemes
|
20
|
+
# @return [String]
|
41
21
|
def_delegators :manifest, :version_name, :deep_links, :schemes
|
42
22
|
|
43
23
|
alias release_version version_name
|
44
24
|
|
25
|
+
# @return [String]
|
45
26
|
def package_name
|
46
27
|
manifest.package
|
47
28
|
end
|
48
29
|
alias identifier package_name
|
49
30
|
alias bundle_id package_name
|
50
31
|
|
32
|
+
# @return [String]
|
51
33
|
def version_code
|
52
34
|
manifest.version_code.to_s
|
53
35
|
end
|
54
36
|
alias build_version version_code
|
55
37
|
|
38
|
+
# @return [String]
|
56
39
|
def name
|
57
40
|
manifest.label
|
58
41
|
end
|
59
42
|
|
60
|
-
|
61
|
-
if wear?
|
62
|
-
Device::WATCH
|
63
|
-
elsif tv?
|
64
|
-
Device::TV
|
65
|
-
elsif automotive?
|
66
|
-
Device::AUTOMOTIVE
|
67
|
-
else
|
68
|
-
Device::PHONE
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
# TODO: find a way to detect
|
73
|
-
# Found answer but not works: https://stackoverflow.com/questions/9279111/determine-if-the-device-is-a-smartphone-or-tablet
|
74
|
-
# def tablet?
|
75
|
-
# resource.first_package
|
76
|
-
# .entries('bool')
|
77
|
-
# .select{|e| e.name == 'isTablet' }
|
78
|
-
# .size >= 1
|
79
|
-
# end
|
80
|
-
|
81
|
-
def wear?
|
82
|
-
!!use_features&.include?('android.hardware.type.watch')
|
83
|
-
end
|
84
|
-
|
85
|
-
def tv?
|
86
|
-
!!use_features&.include?('android.software.leanback')
|
87
|
-
end
|
88
|
-
|
89
|
-
def automotive?
|
90
|
-
!!use_features&.include?('android.hardware.type.automotive')
|
91
|
-
end
|
92
|
-
|
43
|
+
# @return [String]
|
93
44
|
def min_sdk_version
|
94
45
|
manifest.uses_sdk.min_sdk_version
|
95
46
|
end
|
96
47
|
alias min_os_version min_sdk_version
|
97
48
|
|
49
|
+
# @return [String]
|
98
50
|
def target_sdk_version
|
99
51
|
manifest.uses_sdk.target_sdk_version
|
100
52
|
end
|
101
53
|
|
54
|
+
# @return [Array<String>]
|
102
55
|
def use_features
|
103
56
|
return [] unless manifest.respond_to?(:uses_feature)
|
104
57
|
|
105
58
|
@use_features ||= manifest&.uses_feature&.map(&:name)
|
106
59
|
end
|
107
60
|
|
61
|
+
# @return [Array<String>]
|
108
62
|
def use_permissions
|
109
63
|
return [] unless manifest.respond_to?(:uses_permission)
|
110
64
|
|
111
65
|
@use_permissions ||= manifest&.uses_permission&.map(&:name)
|
112
66
|
end
|
113
67
|
|
68
|
+
# @return [Protobuf::Node]
|
114
69
|
def activities
|
115
70
|
@activities ||= manifest.activities
|
116
71
|
end
|
117
72
|
|
73
|
+
# @return [Protobuf::Node]
|
118
74
|
def services
|
119
75
|
@services ||= manifest.services
|
120
76
|
end
|
121
77
|
|
78
|
+
# @return [Protobuf::Node]
|
122
79
|
def components
|
123
80
|
@components ||= manifest.components.transform_values
|
124
81
|
end
|
125
82
|
|
126
|
-
def sign_version
|
127
|
-
return 'v1' unless signs.empty?
|
128
|
-
|
129
|
-
# when ?
|
130
|
-
# https://source.android.com/security/apksigning/v2?hl=zh-cn
|
131
|
-
# 'v2'
|
132
|
-
# when ?
|
133
|
-
# https://source.android.com/security/apksigning/v3?hl=zh-cn
|
134
|
-
# 'v3'
|
135
|
-
'unknown'
|
136
|
-
end
|
137
|
-
|
138
|
-
def signs
|
139
|
-
return @signs if @signs
|
140
|
-
|
141
|
-
@signs = []
|
142
|
-
each_file do |path, data|
|
143
|
-
# find META-INF/xxx.{RSA|DSA}
|
144
|
-
next unless path =~ %r{^META-INF/} && data.unpack('CC') == [0x30, 0x82]
|
145
|
-
|
146
|
-
@signs << APK::Sign.new(path, OpenSSL::PKCS7.new(data))
|
147
|
-
end
|
148
|
-
|
149
|
-
@signs
|
150
|
-
end
|
151
|
-
|
152
|
-
def certificates
|
153
|
-
@certificates ||= signs.each_with_object([]) do |sign, obj|
|
154
|
-
obj << APK::Certificate.new(sign.path, sign.sign.certificates[0])
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
83
|
def each_file
|
159
84
|
zip.each do |entry|
|
160
85
|
next unless entry.file?
|
@@ -171,36 +96,50 @@ module AppInfo
|
|
171
96
|
end
|
172
97
|
|
173
98
|
def entry(name, base_path: BASE_PATH)
|
174
|
-
entry = @zip.find_entry(File.join(base_path, name))
|
99
|
+
entry = @zip.find_entry(::File.join(base_path, name))
|
175
100
|
raise NotFoundError, "'#{name}'" if entry.nil?
|
176
101
|
|
177
102
|
entry
|
178
103
|
end
|
179
104
|
|
105
|
+
# @return [Protobuf::Manifest]
|
180
106
|
def manifest
|
181
107
|
io = zip.read(zip.find_entry(BASE_MANIFEST))
|
182
108
|
@manifest ||= Protobuf::Manifest.parse(io, resource)
|
183
109
|
end
|
184
110
|
|
111
|
+
# @return [Protobuf::Resources]
|
185
112
|
def resource
|
186
113
|
io = zip.read(zip.find_entry(BASE_RESOURCES))
|
187
114
|
@resource ||= Protobuf::Resources.parse(io)
|
188
115
|
end
|
189
116
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
117
|
+
# Full icons metadata
|
118
|
+
# @example
|
119
|
+
# aab.icons
|
120
|
+
# # => [
|
121
|
+
# # {
|
122
|
+
# # name: 'icon.png',
|
123
|
+
# # file: '/path/to/icon.png',
|
124
|
+
# # dimensions: [29, 29]
|
125
|
+
# # },
|
126
|
+
# # {
|
127
|
+
# # name: 'icon1.png',
|
128
|
+
# # file: '/path/to/icon1.png',
|
129
|
+
# # dimensions: [120, 120]
|
130
|
+
# # }
|
131
|
+
# # ]
|
132
|
+
# @return [Array<Hash{Symbol => String, Array<Integer>}>] icons paths of icons
|
194
133
|
def icons
|
195
134
|
@icons ||= manifest.icons.each_with_object([]) do |res, obj|
|
196
135
|
path = res.value
|
197
|
-
filename = File.basename(path)
|
198
|
-
filepath = File.join(contents, File.dirname(path))
|
199
|
-
file = File.join(filepath, filename)
|
136
|
+
filename = ::File.basename(path)
|
137
|
+
filepath = ::File.join(contents, ::File.dirname(path))
|
138
|
+
file = ::File.join(filepath, filename)
|
200
139
|
FileUtils.mkdir_p filepath
|
201
140
|
|
202
141
|
binary_data = read_file(path)
|
203
|
-
File.write(file, binary_data, encoding: Encoding::BINARY)
|
142
|
+
::File.write(file, binary_data, encoding: Encoding::BINARY)
|
204
143
|
|
205
144
|
obj << {
|
206
145
|
name: filename,
|
@@ -222,14 +161,15 @@ module AppInfo
|
|
222
161
|
@info = nil
|
223
162
|
end
|
224
163
|
|
225
|
-
|
226
|
-
|
164
|
+
# @return [Zip::File]
|
165
|
+
def zip
|
166
|
+
@zip ||= Zip::File.open(@file)
|
227
167
|
end
|
228
168
|
|
229
169
|
private
|
230
170
|
|
231
171
|
def xml_file?(file)
|
232
|
-
File.extname(file) == '.xml'
|
172
|
+
::File.extname(file) == '.xml'
|
233
173
|
end
|
234
174
|
|
235
175
|
# TODO: how to convert xml content after decode protoubufed content
|