app-info 2.8.2 → 3.0.0

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -7
  3. data/.github/workflows/ci.yml +7 -5
  4. data/.github/workflows/create_release.yml +15 -0
  5. data/.rubocop.yml +33 -11
  6. data/CHANGELOG.md +107 -1
  7. data/Gemfile +10 -5
  8. data/README.md +82 -15
  9. data/Rakefile +11 -0
  10. data/app_info.gemspec +14 -5
  11. data/lib/app_info/aab.rb +76 -110
  12. data/lib/app_info/android/signature.rb +114 -0
  13. data/lib/app_info/android/signatures/base.rb +53 -0
  14. data/lib/app_info/android/signatures/info.rb +158 -0
  15. data/lib/app_info/android/signatures/v1.rb +63 -0
  16. data/lib/app_info/android/signatures/v2.rb +121 -0
  17. data/lib/app_info/android/signatures/v3.rb +131 -0
  18. data/lib/app_info/android/signatures/v4.rb +18 -0
  19. data/lib/app_info/android.rb +181 -0
  20. data/lib/app_info/apk.rb +77 -112
  21. data/lib/app_info/apple.rb +192 -0
  22. data/lib/app_info/certificate.rb +176 -0
  23. data/lib/app_info/const.rb +76 -0
  24. data/lib/app_info/core_ext/object/try.rb +3 -1
  25. data/lib/app_info/core_ext/string/inflector.rb +2 -0
  26. data/lib/app_info/dsym/debug_info.rb +81 -0
  27. data/lib/app_info/dsym/macho.rb +62 -0
  28. data/lib/app_info/dsym.rb +35 -135
  29. data/lib/app_info/error.rb +3 -1
  30. data/lib/app_info/file.rb +49 -0
  31. data/lib/app_info/helper/archive.rb +37 -0
  32. data/lib/app_info/helper/file_size.rb +25 -0
  33. data/lib/app_info/helper/generate_class.rb +29 -0
  34. data/lib/app_info/helper/protobuf.rb +12 -0
  35. data/lib/app_info/helper/signatures.rb +229 -0
  36. data/lib/app_info/helper.rb +5 -128
  37. data/lib/app_info/info_plist.rb +66 -29
  38. data/lib/app_info/ipa/framework.rb +4 -4
  39. data/lib/app_info/ipa.rb +61 -135
  40. data/lib/app_info/macos.rb +54 -102
  41. data/lib/app_info/mobile_provision.rb +66 -48
  42. data/lib/app_info/pe.rb +322 -0
  43. data/lib/app_info/png_uncrush.rb +25 -5
  44. data/lib/app_info/proguard.rb +39 -22
  45. data/lib/app_info/protobuf/manifest.rb +22 -11
  46. data/lib/app_info/protobuf/models/Configuration_pb.rb +1 -0
  47. data/lib/app_info/protobuf/models/README.md +8 -1
  48. data/lib/app_info/protobuf/models/Resources.proto +51 -0
  49. data/lib/app_info/protobuf/models/Resources_pb.rb +42 -0
  50. data/lib/app_info/protobuf/resources.rb +5 -5
  51. data/lib/app_info/version.rb +1 -1
  52. data/lib/app_info.rb +93 -43
  53. metadata +57 -37
@@ -132,6 +132,11 @@ message Visibility {
132
132
 
133
133
  // The comment associated with the <public> tag.
134
134
  string comment = 3;
135
+
136
+ // Indicates that the resource id may change across builds and that the public R.java identifier
137
+ // for this resource should not be final. This is set to `true` for resources in `staging-group`
138
+ // tags.
139
+ bool staged_api = 4;
135
140
  }
136
141
 
137
142
  // Whether a resource comes from a compile-time overlay and is explicitly allowed to not overlay an
@@ -185,6 +190,12 @@ message OverlayableItem {
185
190
  uint32 overlayable_idx = 4;
186
191
  }
187
192
 
193
+ // The staged resource ID definition of a finalized resource.
194
+ message StagedId {
195
+ Source source = 1;
196
+ uint32 staged_id = 2;
197
+ }
198
+
188
199
  // An entry ID in the range [0x0000, 0xffff].
189
200
  message EntryId {
190
201
  uint32 id = 1;
@@ -217,6 +228,9 @@ message Entry {
217
228
  // The set of values defined for this entry, each corresponding to a different
218
229
  // configuration/variant.
219
230
  repeated ConfigValue config_value = 6;
231
+
232
+ // The staged resource ID of this finalized resource.
233
+ StagedId staged_id = 7;
220
234
  }
221
235
 
222
236
  // A Configuration/Value pair.
@@ -268,6 +282,7 @@ message CompoundValue {
268
282
  Styleable styleable = 3;
269
283
  Array array = 4;
270
284
  Plural plural = 5;
285
+ MacroBody macro = 6;
271
286
  }
272
287
  }
273
288
 
@@ -299,6 +314,13 @@ message Reference {
299
314
 
300
315
  // Whether this reference is dynamic.
301
316
  Boolean is_dynamic = 5;
317
+
318
+ // The type flags used when compiling the reference. Used for substituting the contents of macros.
319
+ uint32 type_flags = 6;
320
+
321
+ // Whether raw string values would have been accepted in place of this reference definition. Used
322
+ // for substituting the contents of macros.
323
+ bool allow_raw = 7;
302
324
  }
303
325
 
304
326
  // A value that represents an ID. This is just a placeholder, as ID values are used to occupy a
@@ -586,3 +608,32 @@ message XmlAttribute {
586
608
  // The optional interpreted/compiled version of the `value` string.
587
609
  Item compiled_item = 6;
588
610
  }
611
+
612
+ message MacroBody {
613
+ string raw_string = 1;
614
+ StyleString style_string = 2;
615
+ repeated UntranslatableSection untranslatable_sections = 3;
616
+ repeated NamespaceAlias namespace_stack = 4;
617
+ SourcePosition source = 5;
618
+ }
619
+
620
+ message NamespaceAlias {
621
+ string prefix = 1;
622
+ string package_name = 2;
623
+ bool is_private = 3;
624
+ }
625
+
626
+ message StyleString {
627
+ message Span {
628
+ string name = 1;
629
+ uint32 start_index = 2;
630
+ uint32 end_index = 3;
631
+ }
632
+ string str = 1;
633
+ repeated Span spans = 2;
634
+ }
635
+
636
+ message UntranslatableSection {
637
+ uint64 start_index = 1;
638
+ uint64 end_index = 2;
639
+ }
@@ -47,6 +47,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
47
47
  optional :level, :enum, 1, "aapt.pb.Visibility.Level"
48
48
  optional :source, :message, 2, "aapt.pb.Source"
49
49
  optional :comment, :string, 3
50
+ optional :staged_api, :bool, 4
50
51
  end
51
52
  add_enum "aapt.pb.Visibility.Level" do
52
53
  value :UNKNOWN, 0
@@ -80,6 +81,10 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
80
81
  value :ACTOR, 8
81
82
  value :CONFIG_SIGNATURE, 9
82
83
  end
84
+ add_message "aapt.pb.StagedId" do
85
+ optional :source, :message, 1, "aapt.pb.Source"
86
+ optional :staged_id, :uint32, 2
87
+ end
83
88
  add_message "aapt.pb.EntryId" do
84
89
  optional :id, :uint32, 1
85
90
  end
@@ -90,6 +95,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
90
95
  optional :allow_new, :message, 4, "aapt.pb.AllowNew"
91
96
  optional :overlayable_item, :message, 5, "aapt.pb.OverlayableItem"
92
97
  repeated :config_value, :message, 6, "aapt.pb.ConfigValue"
98
+ optional :staged_id, :message, 7, "aapt.pb.StagedId"
93
99
  end
94
100
  add_message "aapt.pb.ConfigValue" do
95
101
  optional :config, :message, 1, "aapt.pb.Configuration"
@@ -122,6 +128,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
122
128
  optional :styleable, :message, 3, "aapt.pb.Styleable"
123
129
  optional :array, :message, 4, "aapt.pb.Array"
124
130
  optional :plural, :message, 5, "aapt.pb.Plural"
131
+ optional :macro, :message, 6, "aapt.pb.MacroBody"
125
132
  end
126
133
  end
127
134
  add_message "aapt.pb.Boolean" do
@@ -133,6 +140,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
133
140
  optional :name, :string, 3
134
141
  optional :private, :bool, 4
135
142
  optional :is_dynamic, :message, 5, "aapt.pb.Boolean"
143
+ optional :type_flags, :uint32, 6
144
+ optional :allow_raw, :bool, 7
136
145
  end
137
146
  add_enum "aapt.pb.Reference.Type" do
138
147
  value :REFERENCE, 0
@@ -285,10 +294,37 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
285
294
  optional :resource_id, :uint32, 5
286
295
  optional :compiled_item, :message, 6, "aapt.pb.Item"
287
296
  end
297
+ add_message "aapt.pb.MacroBody" do
298
+ optional :raw_string, :string, 1
299
+ optional :style_string, :message, 2, "aapt.pb.StyleString"
300
+ repeated :untranslatable_sections, :message, 3, "aapt.pb.UntranslatableSection"
301
+ repeated :namespace_stack, :message, 4, "aapt.pb.NamespaceAlias"
302
+ optional :source, :message, 5, "aapt.pb.SourcePosition"
303
+ end
304
+ add_message "aapt.pb.NamespaceAlias" do
305
+ optional :prefix, :string, 1
306
+ optional :package_name, :string, 2
307
+ optional :is_private, :bool, 3
308
+ end
309
+ add_message "aapt.pb.StyleString" do
310
+ optional :str, :string, 1
311
+ repeated :spans, :message, 2, "aapt.pb.StyleString.Span"
312
+ end
313
+ add_message "aapt.pb.StyleString.Span" do
314
+ optional :name, :string, 1
315
+ optional :start_index, :uint32, 2
316
+ optional :end_index, :uint32, 3
317
+ end
318
+ add_message "aapt.pb.UntranslatableSection" do
319
+ optional :start_index, :uint64, 1
320
+ optional :end_index, :uint64, 2
321
+ end
288
322
  end
289
323
  end
290
324
 
325
+ # @!visibility private
291
326
  module Aapt
327
+
292
328
  module Pb
293
329
  StringPool = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.StringPool").msgclass
294
330
  SourcePosition = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.SourcePosition").msgclass
@@ -305,6 +341,7 @@ module Aapt
305
341
  Overlayable = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.Overlayable").msgclass
306
342
  OverlayableItem = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.OverlayableItem").msgclass
307
343
  OverlayableItem::Policy = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.OverlayableItem.Policy").enummodule
344
+ StagedId = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.StagedId").msgclass
308
345
  EntryId = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.EntryId").msgclass
309
346
  Entry = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.Entry").msgclass
310
347
  ConfigValue = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.ConfigValue").msgclass
@@ -340,5 +377,10 @@ module Aapt
340
377
  XmlElement = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.XmlElement").msgclass
341
378
  XmlNamespace = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.XmlNamespace").msgclass
342
379
  XmlAttribute = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.XmlAttribute").msgclass
380
+ MacroBody = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.MacroBody").msgclass
381
+ NamespaceAlias = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.NamespaceAlias").msgclass
382
+ StyleString = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.StyleString").msgclass
383
+ StyleString::Span = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.StyleString.Span").msgclass
384
+ UntranslatableSection = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("aapt.pb.UntranslatableSection").msgclass
343
385
  end
344
386
  end
@@ -12,7 +12,7 @@ module AppInfo
12
12
  new(doc)
13
13
  end
14
14
 
15
- include Helper::ReferenceParser
15
+ include Helper::Protobuf
16
16
 
17
17
  attr_reader :packages, :tool_fingerprint
18
18
 
@@ -53,7 +53,7 @@ module AppInfo
53
53
  end
54
54
 
55
55
  class Package
56
- include Helper::Defines
56
+ include Helper::GenerateClass
57
57
 
58
58
  attr_reader :name, :types
59
59
 
@@ -113,14 +113,14 @@ module AppInfo
113
113
  end
114
114
 
115
115
  class Entry
116
+ include Helper::GenerateClass
117
+
116
118
  def self.parse_from(type, package)
117
119
  type.entry.each_with_object([]) do |entry, obj|
118
120
  obj << Entry.new(entry, package)
119
121
  end
120
122
  end
121
123
 
122
- include Helper::Defines
123
-
124
124
  attr_reader :name, :values
125
125
 
126
126
  def initialize(doc, package)
@@ -155,7 +155,7 @@ module AppInfo
155
155
  end
156
156
 
157
157
  class Value
158
- include Helper::ReferenceParser
158
+ include Helper::Protobuf
159
159
  extend Forwardable
160
160
 
161
161
  attr_reader :locale, :config, :original_value, :value, :type
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppInfo
4
- VERSION = '2.8.2'
4
+ VERSION = '3.0.0'
5
5
  end
data/lib/app_info.rb CHANGED
@@ -1,24 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'app_info/version'
4
- require 'app_info/error'
5
4
  require 'app_info/core_ext'
5
+ require 'app_info/const'
6
+ require 'app_info/certificate'
6
7
  require 'app_info/helper'
8
+ require 'app_info/error'
7
9
 
10
+ require 'app_info/file'
8
11
  require 'app_info/info_plist'
9
12
  require 'app_info/mobile_provision'
10
13
 
14
+ require 'app_info/apple'
15
+ require 'app_info/macos'
11
16
  require 'app_info/ipa'
12
17
  require 'app_info/ipa/plugin'
13
18
  require 'app_info/ipa/framework'
14
19
 
20
+ require 'app_info/android'
15
21
  require 'app_info/apk'
16
22
  require 'app_info/aab'
17
23
 
18
24
  require 'app_info/proguard'
19
25
  require 'app_info/dsym'
20
26
 
21
- require 'app_info/macos'
27
+ require 'app_info/pe'
22
28
 
23
29
  # fix invaild date format warnings
24
30
  Zip.warn_invalid_date = false
@@ -28,36 +34,56 @@ module AppInfo
28
34
  class << self
29
35
  # Get a new parser for automatic
30
36
  def parse(file)
31
- raise NotFoundError, file unless File.exist?(file)
32
-
33
- case file_type(file)
34
- when :ipa then IPA.new(file)
35
- when :apk then APK.new(file)
36
- when :aab then AAB.new(file)
37
- when :mobileprovision then MobileProvision.new(file)
38
- when :dsym then DSYM.new(file)
39
- when :proguard then Proguard.new(file)
40
- when :macos then Macos.new(file)
41
- else
42
- raise UnkownFileTypeError, "Do not detect file type: #{file}"
43
- end
37
+ raise NotFoundError, file unless ::File.exist?(file)
38
+
39
+ parser = case file_type(file)
40
+ when Format::IPA then IPA.new(file)
41
+ when Format::APK then APK.new(file)
42
+ when Format::AAB then AAB.new(file)
43
+ when Format::MOBILEPROVISION then MobileProvision.new(file)
44
+ when Format::DSYM then DSYM.new(file)
45
+ when Format::PROGUARD then Proguard.new(file)
46
+ when Format::MACOS then Macos.new(file)
47
+ when Format::PE then PE.new(file)
48
+ else
49
+ raise UnknownFormatError, "Do not detect file format: #{file}"
50
+ end
51
+
52
+ return parser unless block_given?
53
+
54
+ # call block and clear!
55
+ yield parser
56
+ parser.clear!
44
57
  end
45
58
  alias dump parse
46
59
 
60
+ def parse?(file)
61
+ file_type(file) != Format::UNKNOWN
62
+ end
63
+
47
64
  # Detect file type by read file header
48
65
  #
49
66
  # TODO: This can be better solution, if anyone knows, tell me please.
50
67
  def file_type(file)
51
- header_hex = File.read(file, 100)
52
- type = if header_hex =~ /^\x50\x4b\x03\x04/
53
- detect_zip_file(file)
54
- else
55
- detect_mobileprovision(header_hex)
56
- end
57
-
58
- type || :unkown
68
+ header_hex = ::File.read(file, 100)
69
+ case header_hex
70
+ when ZIP_RETGEX
71
+ detect_zip_file(file)
72
+ when PE_REGEX
73
+ Format::PE
74
+ when PLIST_REGEX, BPLIST_REGEX
75
+ Format::MOBILEPROVISION
76
+ else
77
+ Format::UNKNOWN
78
+ end
79
+ end
80
+
81
+ def logger
82
+ @logger ||= Logger.new($stdout, level: :warn)
59
83
  end
60
84
 
85
+ attr_writer :logger
86
+
61
87
  private
62
88
 
63
89
  # :nodoc:
@@ -65,35 +91,59 @@ module AppInfo
65
91
  Zip.warn_invalid_date = false
66
92
  zip_file = Zip::File.open(file)
67
93
 
68
- return :proguard unless zip_file.glob('*mapping*.txt').empty?
69
- return :apk if !zip_file.find_entry('AndroidManifest.xml').nil? &&
70
- !zip_file.find_entry('classes.dex').nil?
94
+ return Format::PROGUARD if proguard_clues?(zip_file)
95
+ return Format::APK if apk_clues?(zip_file)
96
+ return Format::AAB if aab_clues?(zip_file)
97
+ return Format::MACOS if macos_clues?(zip_file)
98
+ return Format::PE if pe_clues?(zip_file)
99
+ return Format::UNKNOWN unless clue = other_clues?(zip_file)
71
100
 
72
- return :aab if !zip_file.find_entry('base/manifest/AndroidManifest.xml').nil? &&
73
- !zip_file.find_entry('BundleConfig.pb').nil?
101
+ clue
102
+ ensure
103
+ zip_file.close
104
+ end
74
105
 
75
- return :macos if !zip_file.glob('*/Contents/MacOS/*').empty? &&
76
- !zip_file.glob('*/Contents/Info.plist').empty?
106
+ # :nodoc:
107
+ def proguard_clues?(zip_file)
108
+ !zip_file.glob('*mapping*.txt').empty?
109
+ end
77
110
 
78
- zip_file.each do |f|
79
- path = f.name
111
+ # :nodoc:
112
+ def apk_clues?(zip_file)
113
+ !zip_file.find_entry('AndroidManifest.xml').nil? &&
114
+ !zip_file.find_entry('classes.dex').nil?
115
+ end
80
116
 
81
- return :ipa if path.include?('Payload/') && path.end_with?('Info.plist')
82
- return :dsym if path.include?('Contents/Resources/DWARF/')
83
- end
84
- ensure
85
- zip_file.close
117
+ # :nodoc:
118
+ def aab_clues?(zip_file)
119
+ !zip_file.find_entry('base/manifest/AndroidManifest.xml').nil? &&
120
+ !zip_file.find_entry('BundleConfig.pb').nil?
121
+ end
122
+
123
+ # :nodoc:
124
+ def macos_clues?(zip_file)
125
+ !zip_file.glob('*/Contents/MacOS/*').empty? &&
126
+ !zip_file.glob('*/Contents/Info.plist').empty?
86
127
  end
87
128
 
88
- PLIST_REGEX = /\x3C\x3F\x78\x6D\x6C/.freeze
89
- BPLIST_REGEX = /^\x62\x70\x6C\x69\x73\x74/.freeze
129
+ # :nodoc:
130
+ def pe_clues?(zip_file)
131
+ !zip_file.glob('*.exe').empty?
132
+ end
90
133
 
91
134
  # :nodoc:
92
- def detect_mobileprovision(hex)
93
- case hex
94
- when PLIST_REGEX, BPLIST_REGEX
95
- :mobileprovision
135
+ def other_clues?(zip_file)
136
+ zip_file.each do |f|
137
+ path = f.name
138
+
139
+ return Format::IPA if path.include?('Payload/') && path.end_with?('Info.plist')
140
+ return Format::DSYM if path.include?('Contents/Resources/DWARF/')
96
141
  end
97
142
  end
98
143
  end
144
+
145
+ ZIP_RETGEX = /^\x50\x4b\x03\x04/.freeze
146
+ PE_REGEX = /^MZ/.freeze
147
+ PLIST_REGEX = /\x3C\x3F\x78\x6D\x6C/.freeze
148
+ BPLIST_REGEX = /^\x62\x70\x6C\x69\x73\x74/.freeze
99
149
  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.8.2
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - icyleaf
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-13 00:00:00.000000000 Z
11
+ date: 2023-04-18 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: '3.1'
42
+ version: '3.3'
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: '3.1'
52
+ version: '3.3'
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.5.0
79
+ version: 2.6.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.5.0
86
+ version: 2.6.0
87
87
  - !ruby/object:Gem::Dependency
88
88
  name: rubyzip
89
89
  requirement: !ruby/object:Gem::Requirement
@@ -139,75 +139,67 @@ dependencies:
139
139
  - !ruby/object:Gem::Version
140
140
  version: 0.2.0
141
141
  - !ruby/object:Gem::Dependency
142
- name: google-protobuf
142
+ name: pedump
143
143
  requirement: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - "~>"
146
146
  - !ruby/object:Gem::Version
147
- version: 3.19.4
147
+ version: 0.6.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.19.4
154
+ version: 0.6.2
155
155
  - !ruby/object:Gem::Dependency
156
- name: bundler
156
+ name: google-protobuf
157
157
  requirement: !ruby/object:Gem::Requirement
158
158
  requirements:
159
159
  - - ">="
160
160
  - !ruby/object:Gem::Version
161
- version: '1.12'
162
- type: :development
161
+ version: 3.19.4
162
+ - - "<"
163
+ - !ruby/object:Gem::Version
164
+ version: 3.23.0
165
+ type: :runtime
163
166
  prerelease: false
164
167
  version_requirements: !ruby/object:Gem::Requirement
165
168
  requirements:
166
169
  - - ">="
167
170
  - !ruby/object:Gem::Version
168
- version: '1.12'
171
+ version: 3.19.4
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: 3.23.0
169
175
  - !ruby/object:Gem::Dependency
170
- name: rake
176
+ name: bundler
171
177
  requirement: !ruby/object:Gem::Requirement
172
178
  requirements:
173
179
  - - ">="
174
180
  - !ruby/object:Gem::Version
175
- version: '10.0'
181
+ version: '1.12'
176
182
  type: :development
177
183
  prerelease: false
178
184
  version_requirements: !ruby/object:Gem::Requirement
179
185
  requirements:
180
186
  - - ">="
181
187
  - !ruby/object:Gem::Version
182
- version: '10.0'
183
- - !ruby/object:Gem::Dependency
184
- name: rspec
185
- requirement: !ruby/object:Gem::Requirement
186
- requirements:
187
- - - "~>"
188
- - !ruby/object:Gem::Version
189
- version: '3.0'
190
- type: :development
191
- prerelease: false
192
- version_requirements: !ruby/object:Gem::Requirement
193
- requirements:
194
- - - "~>"
195
- - !ruby/object:Gem::Version
196
- version: '3.0'
188
+ version: '1.12'
197
189
  - !ruby/object:Gem::Dependency
198
- name: rubocop
190
+ name: rake
199
191
  requirement: !ruby/object:Gem::Requirement
200
192
  requirements:
201
- - - "~>"
193
+ - - ">="
202
194
  - !ruby/object:Gem::Version
203
- version: '1.19'
195
+ version: '10.0'
204
196
  type: :development
205
197
  prerelease: false
206
198
  version_requirements: !ruby/object:Gem::Requirement
207
199
  requirements:
208
- - - "~>"
200
+ - - ">="
209
201
  - !ruby/object:Gem::Version
210
- version: '1.19'
202
+ version: '10.0'
211
203
  description: Teardown tool for ipa/apk files and dSYM file, even support for info.plist
212
204
  and .mobileprovision files
213
205
  email:
@@ -219,6 +211,7 @@ extra_rdoc_files: []
219
211
  files:
220
212
  - ".github/dependabot.yml"
221
213
  - ".github/workflows/ci.yml"
214
+ - ".github/workflows/create_release.yml"
222
215
  - ".gitignore"
223
216
  - ".rspec"
224
217
  - ".rubocop.yml"
@@ -233,19 +226,39 @@ files:
233
226
  - lib/app-info.rb
234
227
  - lib/app_info.rb
235
228
  - lib/app_info/aab.rb
229
+ - lib/app_info/android.rb
230
+ - lib/app_info/android/signature.rb
231
+ - lib/app_info/android/signatures/base.rb
232
+ - lib/app_info/android/signatures/info.rb
233
+ - lib/app_info/android/signatures/v1.rb
234
+ - lib/app_info/android/signatures/v2.rb
235
+ - lib/app_info/android/signatures/v3.rb
236
+ - lib/app_info/android/signatures/v4.rb
236
237
  - lib/app_info/apk.rb
238
+ - lib/app_info/apple.rb
239
+ - lib/app_info/certificate.rb
240
+ - lib/app_info/const.rb
237
241
  - lib/app_info/core_ext.rb
238
242
  - lib/app_info/core_ext/object/try.rb
239
243
  - lib/app_info/core_ext/string/inflector.rb
240
244
  - lib/app_info/dsym.rb
245
+ - lib/app_info/dsym/debug_info.rb
246
+ - lib/app_info/dsym/macho.rb
241
247
  - lib/app_info/error.rb
248
+ - lib/app_info/file.rb
242
249
  - lib/app_info/helper.rb
250
+ - lib/app_info/helper/archive.rb
251
+ - lib/app_info/helper/file_size.rb
252
+ - lib/app_info/helper/generate_class.rb
253
+ - lib/app_info/helper/protobuf.rb
254
+ - lib/app_info/helper/signatures.rb
243
255
  - lib/app_info/info_plist.rb
244
256
  - lib/app_info/ipa.rb
245
257
  - lib/app_info/ipa/framework.rb
246
258
  - lib/app_info/ipa/plugin.rb
247
259
  - lib/app_info/macos.rb
248
260
  - lib/app_info/mobile_provision.rb
261
+ - lib/app_info/pe.rb
249
262
  - lib/app_info/png_uncrush.rb
250
263
  - lib/app_info/proguard.rb
251
264
  - lib/app_info/protobuf/manifest.rb
@@ -261,7 +274,14 @@ homepage: http://github.com/icyleaf/app-info
261
274
  licenses:
262
275
  - MIT
263
276
  metadata: {}
264
- post_install_message:
277
+ post_install_message: |
278
+ AppInfo 3.0 is coming!
279
+ **********************
280
+ The public API of some AppInfo classes has been changed.
281
+
282
+ Please ensure that your Gemfiles and .gemspecs are suitably restrictive
283
+ to avoid an unexpected breakage when 3.0 is released (e.g. ~> 2.8.5).
284
+ See https://github.com/icyleaf/app_info for details.
265
285
  rdoc_options: []
266
286
  require_paths:
267
287
  - lib
@@ -276,7 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
276
296
  - !ruby/object:Gem::Version
277
297
  version: '0'
278
298
  requirements: []
279
- rubygems_version: 3.1.4
299
+ rubygems_version: 3.4.1
280
300
  signing_key:
281
301
  specification_version: 4
282
302
  summary: Teardown tool for mobile app(ipa/apk) and dSYM file, analysis metedata like