danger-apkstats 0.1.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 7fc3dfd87e810a6c84f051e5be3f35d26670364e4a2a5ee8ecab8671d4c1f4ec
4
- data.tar.gz: 224097d040e3560e5168c78754ee0b88e4078e4682a7858180e8b90f096e9588
2
+ SHA1:
3
+ metadata.gz: 6aa65759eac00e6bdc2a9a745455a10d07a40c9e
4
+ data.tar.gz: 49efc61524d8d75eeef95050977fb4d0e1a08ca7
5
5
  SHA512:
6
- metadata.gz: c4bb340f489244e20e62cd3b61fde090b98143b91795b8068be7e07dbf94f8a2cef33041c6c021c3094426520c27c2b4cf90c6fefc5623d42655291bed2d80f0
7
- data.tar.gz: 53d786b5eab9d48c1221aee736f5a3278bbcd5f552d0f00c5a0b4c1a58592f1907c596db082f91e42d92c89ad9ccfb437eef2b2b48cb31ebe19d0dd966dfe643
6
+ metadata.gz: 0cf8e9d23c34f2af359cb01c18b36ca2e556e613e6bc7757421b1fc19ff115be7f4055b54f73ffa68e84a95932af847d15bc720f2c83b237caee57085296cac1
7
+ data.tar.gz: e1a15a138f9f446b4c8be024ae8bae0545f09fd7857ea7c01cbb90aa323368416dba9bdb9d758ce3d1869d1c1fa34b5f8d39482c586b225618d427be13589c0a
data/Dangerfile.sample CHANGED
@@ -11,5 +11,7 @@ message(apkstats.non_required_features)
11
11
  message(apkstats.permissions)
12
12
  message(apkstats.min_sdk)
13
13
  message(apkstats.target_sdk)
14
+ message("#{apkstats.reference_count}")
15
+ message("#{apkstats.dex_count}")
14
16
 
15
17
  apkstats.compare_with('/spec/fixture/app-other5.apk', do_report: true)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-apkstats (0.1.2)
4
+ danger-apkstats (0.2.0)
5
5
  danger-plugin-api (~> 1.0)
6
6
 
7
7
  GEM
@@ -40,7 +40,7 @@ GEM
40
40
  faraday (~> 0.8)
41
41
  ffi (1.9.25)
42
42
  formatador (0.2.5)
43
- git (1.4.0)
43
+ git (1.5.0)
44
44
  guard (2.14.2)
45
45
  formatador (>= 0.2.4)
46
46
  listen (>= 2.7, < 4.0)
@@ -69,7 +69,7 @@ GEM
69
69
  notiffany (0.1.1)
70
70
  nenv (~> 0.1)
71
71
  shellany (~> 0.0)
72
- octokit (4.9.0)
72
+ octokit (4.10.0)
73
73
  sawyer (~> 0.8.0, >= 0.5.3)
74
74
  open4 (1.3.4)
75
75
  parallel (1.12.1)
@@ -79,7 +79,7 @@ GEM
79
79
  pry (0.11.3)
80
80
  coderay (~> 1.1.0)
81
81
  method_source (~> 0.9.0)
82
- public_suffix (3.0.2)
82
+ public_suffix (3.0.3)
83
83
  rainbow (3.0.0)
84
84
  rake (10.5.0)
85
85
  rb-fsevent (0.10.3)
data/README.md CHANGED
@@ -31,6 +31,8 @@ apkstats.non_required_features #=> Array<String> | Nil
31
31
  apkstats.permissions #=> Array<String> | Nil
32
32
  apkstats.min_sdk #=> String | Nil
33
33
  apkstats.target_sdk #=> String | Nils
34
+ apkstats.reference_count #=> Fixnum
35
+ apkstats.dex_count #=> Fixnum
34
36
  ```
35
37
 
36
38
  ### Get a comparison report
@@ -43,12 +45,14 @@ For example, the report will be like below.
43
45
 
44
46
  Property | Summary
45
47
  :--- | :---
46
- New File Size | 1621248 Bytes. (1.55 MB
48
+ New File Size | 1621248 Bytes. (1.55 MB)
47
49
  File Size Change | -13352 Bytes. (-13.04 KB)
48
50
  Download Size Change | +41141 Bytes. (+40.18 KB)
49
51
  Removed Required Features | - android.hardware.camera
50
52
  Removed Non-required Features | - android.hardware.camera.front (not-required)
51
53
  Removed Permissions | - android.permission.INTERNET<br>- android.permission.CAMERA
54
+ New Number of dex file(s) | 15720
55
+ Number of dex file(s) Change | 1
52
56
 
53
57
  ## Development
54
58
 
@@ -37,6 +37,17 @@ module Apkstats::Command
37
37
  run_command("manifest", "target-sdk", apk_filepath)
38
38
  end
39
39
 
40
+ def method_reference_count(apk_filepath)
41
+ ApkAnalyzer.parse_reference_to_map(run_command("dex", "references", apk_filepath))
42
+ .values
43
+ .map(&:to_i)
44
+ .inject(:+)
45
+ end
46
+
47
+ def dex_count(apk_filepath)
48
+ ApkAnalyzer.parse_reference_to_map(run_command("dex", "references", apk_filepath)).size
49
+ end
50
+
40
51
  def self.parse_permissions(command_output)
41
52
  command_output.split(/\r?\n/).map { |s| to_permission(s) }
42
53
  end
@@ -59,6 +70,13 @@ module Apkstats::Command
59
70
  ::Apkstats::Entity::Feature.new(name, not_required: kind == "not-required", implied_reason: kind == "implied:" && tail)
60
71
  end
61
72
 
73
+ def self.parse_reference_to_map(command_output)
74
+ command_output.split(/\r?\n/).each_with_object({}) do |s, acc|
75
+ dex_file, method_count = s.strip.split(/\t/, 2)
76
+ acc[dex_file] = method_count
77
+ end
78
+ end
79
+
62
80
  private
63
81
 
64
82
  def run_command(*args)
@@ -21,6 +21,8 @@ module Apkstats::Command
21
21
  # permissions: Array<String>,
22
22
  # min_sdk: String,
23
23
  # target_sdk: String,
24
+ # method_reference_count: Integer,
25
+ # dex_count: Integer,
24
26
  # },
25
27
  # other: {
26
28
  # file_size: Integer,
@@ -30,6 +32,8 @@ module Apkstats::Command
30
32
  # permissions: Array<String>,
31
33
  # min_sdk: String,
32
34
  # target_sdk: String,
35
+ # method_reference_count: Integer,
36
+ # dex_count: Integer,
33
37
  # },
34
38
  # diff: {
35
39
  # file_size: Integer,
@@ -48,6 +52,8 @@ module Apkstats::Command
48
52
  # },
49
53
  # min_sdk: Array<String>,
50
54
  # target_sdk: Array<String>,
55
+ # method_reference_count: Integer,
56
+ # dex_count: Integer,
51
57
  # }
52
58
  # }
53
59
  #
@@ -10,10 +10,12 @@ module Apkstats::Entity
10
10
  permissions
11
11
  min_sdk
12
12
  target_sdk
13
+ method_reference_count
14
+ dex_count
13
15
  ).freeze
14
16
 
15
17
  # Integer
16
- attr_accessor :file_size, :download_size
18
+ attr_accessor :file_size, :download_size, :method_reference_count, :dex_count
17
19
 
18
20
  # String
19
21
  attr_accessor :min_sdk, :target_sdk
@@ -63,5 +63,15 @@ module Apkstats::Entity
63
63
  # String
64
64
  [@base[__method__], @other[__method__]].uniq
65
65
  end
66
+
67
+ def method_reference_count
68
+ # Integer
69
+ @base[__method__].to_i - @other[__method__].to_i
70
+ end
71
+
72
+ def dex_count
73
+ # Integer
74
+ @base[__method__].to_i - @other[__method__].to_i
75
+ end
66
76
  end
67
77
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Apkstats
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -52,6 +52,14 @@ module Danger
52
52
  #
53
53
  # apkstats.target_sdk
54
54
  #
55
+ # @example Show the methods reference count of your apk file.
56
+ #
57
+ # apkstats.method_reference_count
58
+ #
59
+ # @example Show the number of dex of your apk file.
60
+ #
61
+ # apkstats.dex_count
62
+ #
55
63
  # @see Jumpei Matsuda/danger-apkstats
56
64
  # @tags android, apk_stats
57
65
  #
@@ -81,7 +89,7 @@ module Danger
81
89
  # @return [String]
82
90
  attr_accessor :apk_filepath
83
91
 
84
- # rubocop:disable Metrics/AbcSize
92
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
85
93
 
86
94
  # Get stats of two apk files and calculate diffs between them.
87
95
  #
@@ -122,7 +130,7 @@ module Danger
122
130
  result[:base][:file_size].tap do |file_size|
123
131
  size = Apkstats::Helper::Bytes.from_b(file_size)
124
132
 
125
- md << "New File Size | #{size.to_b} Bytes. (#{size.to_mb} MB " << "\n"
133
+ md << "New File Size | #{size.to_b} Bytes. (#{size.to_mb} MB) " << "\n"
126
134
  end
127
135
 
128
136
  diff[:file_size].tap do |file_size|
@@ -137,6 +145,22 @@ module Danger
137
145
  md << "Download Size Change | #{size.to_s_b} Bytes. (#{size.to_s_kb} KB) " << "\n"
138
146
  end
139
147
 
148
+ result[:base][:method_reference_count].tap do |method_reference_count|
149
+ md << "New Method Reference Count | #{method_reference_count}" << "\n"
150
+ end
151
+
152
+ diff[:method_reference_count].tap do |method_reference_count|
153
+ md << "Method Reference Count Change | #{method_reference_count}" << "\n"
154
+ end
155
+
156
+ result[:base][:dex_count].tap do |dex_count|
157
+ md << "New Number of dex file(s) | #{dex_count}" << "\n"
158
+ end
159
+
160
+ diff[:dex_count].tap do |dex_count|
161
+ md << "Number of dex file(s) Change | #{dex_count}" << "\n"
162
+ end
163
+
140
164
  report_hash_and_arrays = lambda { |key, name|
141
165
  list_up_entities = lambda { |type_key, label|
142
166
  diff[key][type_key].tap do |features|
@@ -162,7 +186,7 @@ module Danger
162
186
  e.backtrace&.each { |line| STDOUT.puts line }
163
187
  end
164
188
 
165
- # rubocop:enable Metrics/AbcSize
189
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
166
190
 
167
191
  # Show the file size of your apk file.
168
192
  #
@@ -220,6 +244,22 @@ module Danger
220
244
  run_command(__method__)
221
245
  end
222
246
 
247
+ # Show the methods reference count of your apk file.
248
+ #
249
+ # @return [Fixnum] return positive value if exists, otherwise -1.
250
+ def method_reference_count(_opts = {})
251
+ result = run_command(__method__)
252
+ result || -1
253
+ end
254
+
255
+ # Show the number of dex of your apk file.
256
+ #
257
+ # @return [Fixnum] return positive value if exists, otherwise -1.
258
+ def dex_count(_opts = {})
259
+ result = run_command(__method__)
260
+ result || -1
261
+ end
262
+
223
263
  private
224
264
 
225
265
  def run_command(name)
@@ -10,6 +10,7 @@ module Apkstats::Command
10
10
  let(:apk_other3) { fixture_path + "app-other3.apk" }
11
11
  let(:apk_other4) { fixture_path + "app-other4.apk" }
12
12
  let(:apk_other5) { fixture_path + "app-other5.apk" }
13
+ let(:apk_method64k) { fixture_path + "app-method64k.apk" }
13
14
 
14
15
  it "should use custom path if set" do
15
16
  expect(ApkAnalyzer.new({}).command_path).to eq("#{ENV.fetch('ANDROID_HOME')}/tools/bin/apkanalyzer")
@@ -55,6 +56,16 @@ module Apkstats::Command
55
56
  it "target_sdk should return target sdk" do
56
57
  expect(command.target_sdk(apk_base)).to eq("28")
57
58
  end
59
+
60
+ it "method_reference_count should return reference count" do
61
+ expect(command.method_reference_count(apk_base)).to eq(15_720)
62
+ expect(command.method_reference_count(apk_method64k)).to eq(124_304)
63
+ end
64
+
65
+ it "dex_count should return dex count" do
66
+ expect(command.dex_count(apk_base)).to eq(1)
67
+ expect(command.dex_count(apk_method64k)).to eq(2)
68
+ end
58
69
  end
59
70
 
60
71
  context "to_permission" do
@@ -31,6 +31,8 @@ module Apkstats::Entity
31
31
  ]),
32
32
  min_sdk: "16",
33
33
  target_sdk: "26",
34
+ method_reference_count: 20_000,
35
+ dex_count: 1,
34
36
  }
35
37
  end
36
38
 
@@ -57,6 +59,8 @@ module Apkstats::Entity
57
59
  ]),
58
60
  min_sdk: "21",
59
61
  target_sdk: "27",
62
+ method_reference_count: base_apk_values[:method_reference_count] + 2000,
63
+ dex_count: base_apk_values[:dex_count] + 1,
60
64
  }
61
65
  end
62
66
 
@@ -105,6 +109,8 @@ module Apkstats::Entity
105
109
  )
106
110
  expect(diff.min_sdk).to eq(%w(16 21))
107
111
  expect(diff.target_sdk).to eq(%w(26 27))
112
+ expect(diff.method_reference_count).to eq(-2000)
113
+ expect(diff.dex_count).to eq(-1)
108
114
  end
109
115
  end
110
116
  end
@@ -22,6 +22,8 @@ module Apkstats::Entity
22
22
  ]),
23
23
  min_sdk: "16",
24
24
  target_sdk: "26",
25
+ method_reference_count: 20_000,
26
+ dex_count: 1,
25
27
  }
26
28
  end
27
29
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-apkstats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jumpei Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-01 00:00:00.000000000 Z
11
+ date: 2018-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -209,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
209
  version: '0'
210
210
  requirements: []
211
211
  rubyforge_project:
212
- rubygems_version: 2.7.6
212
+ rubygems_version: 2.4.5
213
213
  signing_key:
214
214
  specification_version: 4
215
215
  summary: This is a danger plugin to inspect android application file.