danger-apkstats 0.1.2 → 0.2.0

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
- 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.