app-info 2.8.5 → 3.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Language](https://img.shields.io/badge/ruby-2.5+-701516
|
3
|
+
[![Language](https://img.shields.io/badge/ruby-2.5+-701516)](.github/workflows/ci.yml)
|
4
|
+
[![Gem version](https://img.shields.io/gem/v/app-info?include_prereleases)](https://rubygems.org/gems/app-info)
|
4
5
|
[![Build Status](https://img.shields.io/github/actions/workflow/status/icyleaf/app_info/ci.yml)](https://github.com/icyleaf/app_info/actions/workflows/ci.yml)
|
5
|
-
[![
|
6
|
-
[![License](https://img.shields.io/badge/license-MIT-red.svg?style=flat)](LICENSE)
|
6
|
+
[![License](https://img.shields.io/github/license/icyleaf/app-info)](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
|