danger-apkstats 0.0.2 → 0.1.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 +4 -4
- data/.rubocop.yml +19 -1
- data/.travis.yml +18 -5
- data/Dangerfile.sample +15 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +136 -0
- data/Guardfile +4 -2
- data/README.md +25 -4
- data/Rakefile +12 -10
- data/danger-apkstats.gemspec +20 -19
- data/lib/apkstats/command/apk_analyzer.rb +56 -21
- data/lib/apkstats/command/executable.rb +62 -0
- data/lib/apkstats/entity/apk_info.rb +40 -0
- data/lib/apkstats/entity/apk_info_diff.rb +67 -0
- data/lib/apkstats/entity/feature.rb +100 -0
- data/lib/apkstats/entity/permission.rb +86 -0
- data/lib/apkstats/gem_version.rb +3 -1
- data/lib/apkstats/helper/bytes.rb +65 -0
- data/lib/apkstats/plugin.rb +199 -38
- data/lib/danger_apkstats.rb +2 -0
- data/lib/danger_plugin.rb +2 -0
- data/spec/apkstats_spec.rb +4 -24
- data/spec/command/apk_analyzer_spec.rb +130 -0
- data/spec/entity/apk_info_diff_spec.rb +110 -0
- data/spec/entity/apk_info_spec.rb +49 -0
- data/spec/entity/features_spec.rb +42 -0
- data/spec/entity/permissions_spec.rb +37 -0
- data/spec/fixture/app-base.apk +0 -0
- data/spec/fixture/app-other1.apk +0 -0
- data/spec/fixture/app-other2.apk +0 -0
- data/spec/fixture/app-other3.apk +0 -0
- data/spec/fixture/app-other4.apk +0 -0
- data/spec/fixture/app-other5.apk +0 -0
- data/spec/fixture/github_pr.json +345 -0
- data/spec/helper/bytes_spec.rb +95 -0
- data/spec/spec_helper.rb +10 -2
- data/spec/stub/command.rb +20 -0
- metadata +38 -3
- data/lib/apkstats/command/executable_command.rb +0 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 06da284025d85c4baf756df842fef7ed035bbc6a4b51e3869b03df48f851b480
|
|
4
|
+
data.tar.gz: ed4436f89c1b65211bd338aa4e48095df59c7f518c69a185836cdde7655d2149
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d67745379004649774230e918514f09ac792050190540f23efab90c29308b9b3fe098884288c975f2c74a37e1aab2d9434881224a4e9682a0be1bf58859a17a4
|
|
7
|
+
data.tar.gz: 869be5736265bffec15b3468846b346a6a45c3b4796e7a80b4cf1448845009f22d9c6e5fb12bebc4c4d7a6e363bffa62a386cd4be18b39eeeeb9c31de139cd8c
|
data/.rubocop.yml
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
# If you don't like these settings, just delete this file :)
|
|
4
4
|
|
|
5
5
|
AllCops:
|
|
6
|
-
|
|
6
|
+
Exclude:
|
|
7
|
+
- 'vendor/**/*'
|
|
8
|
+
- 'spec/fixtures/**/*'
|
|
9
|
+
- 'tmp/**/*'
|
|
10
|
+
TargetRubyVersion: 2.3.7
|
|
11
|
+
|
|
12
|
+
Metrics/ModuleLength:
|
|
13
|
+
Exclude:
|
|
14
|
+
- 'spec/**/*'
|
|
15
|
+
Enabled: true
|
|
7
16
|
|
|
8
17
|
Style/StringLiterals:
|
|
9
18
|
EnforcedStyle: double_quotes
|
|
@@ -150,3 +159,12 @@ PercentLiteralDelimiters:
|
|
|
150
159
|
|
|
151
160
|
Security/YAMLLoad:
|
|
152
161
|
Enabled: false
|
|
162
|
+
|
|
163
|
+
Style/TrailingCommaInArguments:
|
|
164
|
+
Enabled: true
|
|
165
|
+
|
|
166
|
+
Style/TrailingCommaInArrayLiteral:
|
|
167
|
+
Enabled: false
|
|
168
|
+
|
|
169
|
+
Style/TrailingCommaInHashLiteral:
|
|
170
|
+
Enabled: false
|
data/.travis.yml
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
cache:
|
|
3
3
|
directories:
|
|
4
|
-
- bundle
|
|
4
|
+
- vendor/bundle
|
|
5
|
+
- sdk
|
|
5
6
|
|
|
6
7
|
rvm:
|
|
7
|
-
- 2.
|
|
8
|
-
- 2.
|
|
9
|
-
- 2.
|
|
8
|
+
- 2.3.7
|
|
9
|
+
- 2.4.4
|
|
10
|
+
- 2.5.1
|
|
10
11
|
|
|
11
12
|
script:
|
|
12
|
-
|
|
13
|
+
- |
|
|
14
|
+
version='4333796'
|
|
15
|
+
|
|
16
|
+
if [ "$(cat sdk/.sdk_tools_version || echo)" != "$version" ]; then
|
|
17
|
+
rm -fr sdk || :
|
|
18
|
+
mkdir -p sdk/licenses
|
|
19
|
+
curl -o sdk-tools-linux.zip "https://dl.google.com/android/repository/sdk-tools-linux-$version.zip"
|
|
20
|
+
unzip "sdk-tools-linux.zip" -d sdk
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
echo "d56f5187479451eabf01fb78af6dfcb131a6481e" > sdk/licenses/android-sdk-license
|
|
24
|
+
sdk/tools/bin/sdkmanager "build-tools;27.0.3"
|
|
25
|
+
- ANDROID_HOME="$PWD/sdk" bundle exec rake spec
|
data/Dangerfile.sample
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
apkstats.command_type=:apk_analyzer
|
|
2
|
+
apkstats.apk_filepath='./spec/fixture/app-base.apk'
|
|
3
|
+
|
|
4
|
+
# custom command path
|
|
5
|
+
# apkstats.command_path='/path/to/analysis_command'
|
|
6
|
+
|
|
7
|
+
message(apkstats.file_size)
|
|
8
|
+
message(apkstats.download_size)
|
|
9
|
+
message(apkstats.required_features)
|
|
10
|
+
message(apkstats.non_required_features)
|
|
11
|
+
message(apkstats.permissions)
|
|
12
|
+
message(apkstats.min_sdk)
|
|
13
|
+
message(apkstats.target_sdk)
|
|
14
|
+
|
|
15
|
+
apkstats.compare_with('/spec/fixture/app-other5.apk', do_report: true)
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
danger-apkstats (0.1.0)
|
|
5
|
+
danger-plugin-api (~> 1.0)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
addressable (2.5.2)
|
|
11
|
+
public_suffix (>= 2.0.2, < 4.0)
|
|
12
|
+
ast (2.4.0)
|
|
13
|
+
claide (1.0.2)
|
|
14
|
+
claide-plugins (0.9.2)
|
|
15
|
+
cork
|
|
16
|
+
nap
|
|
17
|
+
open4 (~> 1.3)
|
|
18
|
+
coderay (1.1.2)
|
|
19
|
+
colored2 (3.1.2)
|
|
20
|
+
cork (0.3.0)
|
|
21
|
+
colored2 (~> 3.1)
|
|
22
|
+
danger (5.6.4)
|
|
23
|
+
claide (~> 1.0)
|
|
24
|
+
claide-plugins (>= 0.9.2)
|
|
25
|
+
colored2 (~> 3.1)
|
|
26
|
+
cork (~> 0.1)
|
|
27
|
+
faraday (~> 0.9)
|
|
28
|
+
faraday-http-cache (~> 1.0)
|
|
29
|
+
git (~> 1)
|
|
30
|
+
kramdown (~> 1.5)
|
|
31
|
+
no_proxy_fix
|
|
32
|
+
octokit (~> 4.7)
|
|
33
|
+
terminal-table (~> 1)
|
|
34
|
+
danger-plugin-api (1.0.0)
|
|
35
|
+
danger (> 2.0)
|
|
36
|
+
diff-lcs (1.3)
|
|
37
|
+
faraday (0.15.2)
|
|
38
|
+
multipart-post (>= 1.2, < 3)
|
|
39
|
+
faraday-http-cache (1.3.1)
|
|
40
|
+
faraday (~> 0.8)
|
|
41
|
+
ffi (1.9.25)
|
|
42
|
+
formatador (0.2.5)
|
|
43
|
+
git (1.4.0)
|
|
44
|
+
guard (2.14.2)
|
|
45
|
+
formatador (>= 0.2.4)
|
|
46
|
+
listen (>= 2.7, < 4.0)
|
|
47
|
+
lumberjack (>= 1.0.12, < 2.0)
|
|
48
|
+
nenv (~> 0.1)
|
|
49
|
+
notiffany (~> 0.0)
|
|
50
|
+
pry (>= 0.9.12)
|
|
51
|
+
shellany (~> 0.0)
|
|
52
|
+
thor (>= 0.18.1)
|
|
53
|
+
guard-compat (1.2.1)
|
|
54
|
+
guard-rspec (4.7.3)
|
|
55
|
+
guard (~> 2.1)
|
|
56
|
+
guard-compat (~> 1.1)
|
|
57
|
+
rspec (>= 2.99.0, < 4.0)
|
|
58
|
+
jaro_winkler (1.5.1)
|
|
59
|
+
kramdown (1.17.0)
|
|
60
|
+
listen (3.0.7)
|
|
61
|
+
rb-fsevent (>= 0.9.3)
|
|
62
|
+
rb-inotify (>= 0.9.7)
|
|
63
|
+
lumberjack (1.0.13)
|
|
64
|
+
method_source (0.9.0)
|
|
65
|
+
multipart-post (2.0.0)
|
|
66
|
+
nap (1.1.0)
|
|
67
|
+
nenv (0.3.0)
|
|
68
|
+
no_proxy_fix (0.1.2)
|
|
69
|
+
notiffany (0.1.1)
|
|
70
|
+
nenv (~> 0.1)
|
|
71
|
+
shellany (~> 0.0)
|
|
72
|
+
octokit (4.9.0)
|
|
73
|
+
sawyer (~> 0.8.0, >= 0.5.3)
|
|
74
|
+
open4 (1.3.4)
|
|
75
|
+
parallel (1.12.1)
|
|
76
|
+
parser (2.5.1.2)
|
|
77
|
+
ast (~> 2.4.0)
|
|
78
|
+
powerpack (0.1.2)
|
|
79
|
+
pry (0.11.3)
|
|
80
|
+
coderay (~> 1.1.0)
|
|
81
|
+
method_source (~> 0.9.0)
|
|
82
|
+
public_suffix (3.0.2)
|
|
83
|
+
rainbow (3.0.0)
|
|
84
|
+
rake (10.5.0)
|
|
85
|
+
rb-fsevent (0.10.3)
|
|
86
|
+
rb-inotify (0.9.10)
|
|
87
|
+
ffi (>= 0.5.0, < 2)
|
|
88
|
+
rspec (3.7.0)
|
|
89
|
+
rspec-core (~> 3.7.0)
|
|
90
|
+
rspec-expectations (~> 3.7.0)
|
|
91
|
+
rspec-mocks (~> 3.7.0)
|
|
92
|
+
rspec-core (3.7.1)
|
|
93
|
+
rspec-support (~> 3.7.0)
|
|
94
|
+
rspec-expectations (3.7.0)
|
|
95
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
96
|
+
rspec-support (~> 3.7.0)
|
|
97
|
+
rspec-mocks (3.7.0)
|
|
98
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
99
|
+
rspec-support (~> 3.7.0)
|
|
100
|
+
rspec-support (3.7.1)
|
|
101
|
+
rubocop (0.58.2)
|
|
102
|
+
jaro_winkler (~> 1.5.1)
|
|
103
|
+
parallel (~> 1.10)
|
|
104
|
+
parser (>= 2.5, != 2.5.1.1)
|
|
105
|
+
powerpack (~> 0.1)
|
|
106
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
107
|
+
ruby-progressbar (~> 1.7)
|
|
108
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
109
|
+
ruby-progressbar (1.9.0)
|
|
110
|
+
sawyer (0.8.1)
|
|
111
|
+
addressable (>= 2.3.5, < 2.6)
|
|
112
|
+
faraday (~> 0.8, < 1.0)
|
|
113
|
+
shellany (0.0.1)
|
|
114
|
+
terminal-table (1.8.0)
|
|
115
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
|
116
|
+
thor (0.20.0)
|
|
117
|
+
unicode-display_width (1.4.0)
|
|
118
|
+
yard (0.9.15)
|
|
119
|
+
|
|
120
|
+
PLATFORMS
|
|
121
|
+
ruby
|
|
122
|
+
|
|
123
|
+
DEPENDENCIES
|
|
124
|
+
bundler (~> 1.3)
|
|
125
|
+
danger-apkstats!
|
|
126
|
+
guard (~> 2.14)
|
|
127
|
+
guard-rspec (~> 4.7)
|
|
128
|
+
listen (= 3.0.7)
|
|
129
|
+
pry
|
|
130
|
+
rake (~> 10.0)
|
|
131
|
+
rspec (~> 3.4)
|
|
132
|
+
rubocop
|
|
133
|
+
yard
|
|
134
|
+
|
|
135
|
+
BUNDLED WITH
|
|
136
|
+
1.16.1
|
data/Guardfile
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# A guardfile for making Danger Plugins
|
|
2
4
|
# For more info see https://github.com/guard/guard#readme
|
|
3
5
|
|
|
4
6
|
# To run, use `bundle exec guard`.
|
|
5
7
|
|
|
6
|
-
guard :rspec, cmd:
|
|
7
|
-
require
|
|
8
|
+
guard :rspec, cmd: "bundle exec rspec" do
|
|
9
|
+
require "guard/rspec/dsl"
|
|
8
10
|
dsl = Guard::RSpec::Dsl.new(self)
|
|
9
11
|
|
|
10
12
|
# RSpec files
|
data/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[](https://travis-ci.com/jmatsu/danger-apkstats) [](https://badge.fury.io/rb/danger-apkstats)
|
|
2
|
+
|
|
1
3
|
# danger-apkstats
|
|
2
4
|
|
|
3
5
|
A description of danger-apkstats.
|
|
@@ -14,13 +16,32 @@ A description of danger-apkstats.
|
|
|
14
16
|
# Sample
|
|
15
17
|
|
|
16
18
|
```
|
|
17
|
-
apkstats.
|
|
18
|
-
apkstats.apk_filepath='app-debug.apk' # required
|
|
19
|
+
apkstats.apk_filepath='app-debug.apk' # required.
|
|
19
20
|
apkstats.compare_with('app-other.apk', do_report: true)
|
|
20
|
-
apkstats.
|
|
21
|
-
apkstats.
|
|
21
|
+
apkstats.file_size #=> Fixnum
|
|
22
|
+
apkstats.download_size #=> Fixnum
|
|
23
|
+
apkstats.required_features #=> Array<String> | Nil
|
|
24
|
+
apkstats.non_required_features #=> Array<String> | Nil
|
|
25
|
+
apkstats.permissions #=> Array<String> | Nil
|
|
26
|
+
apkstats.min_sdk #=> String | Nil
|
|
27
|
+
apkstats.target_sdk #=> String | Nils
|
|
22
28
|
```
|
|
23
29
|
|
|
30
|
+
## Compare apk files
|
|
31
|
+
|
|
32
|
+
The report will be like below.
|
|
33
|
+
|
|
34
|
+
### Apk comparision results
|
|
35
|
+
|
|
36
|
+
Property | Summary
|
|
37
|
+
:--- | :---
|
|
38
|
+
New File Size | 1621248 Bytes. (1.55 MB
|
|
39
|
+
File Size Change | -13352 Bytes. (-13.04 KB)
|
|
40
|
+
Download Size Change | +41141 Bytes. (+40.18 KB)
|
|
41
|
+
Removed Required Features | - android.hardware.camera
|
|
42
|
+
Removed Non-required Features | - android.hardware.camera.front (not-required)
|
|
43
|
+
Removed Permissions | - android.permission.INTERNET<br>- android.permission.CAMERA
|
|
44
|
+
|
|
24
45
|
## Development
|
|
25
46
|
|
|
26
47
|
1. Clone this repo
|
data/Rakefile
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/gem_tasks"
|
|
4
|
+
require "rspec/core/rake_task"
|
|
5
|
+
require "rubocop/rake_task"
|
|
4
6
|
|
|
5
7
|
RSpec::Core::RakeTask.new(:specs)
|
|
6
8
|
|
|
7
9
|
task default: :specs
|
|
8
10
|
|
|
9
11
|
task :spec do
|
|
10
|
-
Rake::Task[
|
|
11
|
-
Rake::Task[
|
|
12
|
-
Rake::Task[
|
|
12
|
+
Rake::Task["specs"].invoke
|
|
13
|
+
Rake::Task["rubocop"].invoke
|
|
14
|
+
Rake::Task["spec_docs"].invoke
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
desc
|
|
17
|
+
desc "Run RuboCop on the lib/specs directory"
|
|
16
18
|
RuboCop::RakeTask.new(:rubocop) do |task|
|
|
17
|
-
task.patterns = [
|
|
19
|
+
task.patterns = ["lib/**/*.rb", "spec/**/*.rb"]
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
desc
|
|
22
|
+
desc "Ensure that the plugin passes `danger plugins lint`"
|
|
21
23
|
task :spec_docs do
|
|
22
|
-
sh
|
|
24
|
+
sh "bundle exec danger plugins lint"
|
|
23
25
|
end
|
data/danger-apkstats.gemspec
CHANGED
|
@@ -1,42 +1,43 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require
|
|
5
|
+
require "apkstats/gem_version.rb"
|
|
5
6
|
|
|
6
7
|
Gem::Specification.new do |spec|
|
|
7
|
-
spec.name =
|
|
8
|
+
spec.name = "danger-apkstats"
|
|
8
9
|
spec.version = Apkstats::VERSION
|
|
9
|
-
spec.authors = [
|
|
10
|
-
spec.email = [
|
|
11
|
-
spec.description =
|
|
12
|
-
spec.summary =
|
|
13
|
-
spec.homepage =
|
|
14
|
-
spec.license =
|
|
10
|
+
spec.authors = ["Jumpei Matsuda"]
|
|
11
|
+
spec.email = ["jmatsu.drm@gmail.com"]
|
|
12
|
+
spec.description = "To inpsect android application file with danger."
|
|
13
|
+
spec.summary = "This is a danger plugin to inspect android application file."
|
|
14
|
+
spec.homepage = "https://github.com/jmatsu/danger-apkstats"
|
|
15
|
+
spec.license = "MIT"
|
|
15
16
|
|
|
16
17
|
spec.files = `git ls-files`.split($/)
|
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
-
spec.require_paths = [
|
|
20
|
+
spec.require_paths = ["lib"]
|
|
20
21
|
|
|
21
|
-
spec.add_runtime_dependency
|
|
22
|
+
spec.add_runtime_dependency "danger-plugin-api", "~> 1.0"
|
|
22
23
|
|
|
23
24
|
# General ruby development
|
|
24
|
-
spec.add_development_dependency
|
|
25
|
-
spec.add_development_dependency
|
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
|
26
27
|
|
|
27
28
|
# Testing support
|
|
28
|
-
spec.add_development_dependency
|
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.4"
|
|
29
30
|
|
|
30
31
|
# Linting code and docs
|
|
31
32
|
spec.add_development_dependency "rubocop"
|
|
32
33
|
spec.add_development_dependency "yard"
|
|
33
34
|
|
|
34
35
|
# Makes testing easy via `bundle exec guard`
|
|
35
|
-
spec.add_development_dependency
|
|
36
|
-
spec.add_development_dependency
|
|
36
|
+
spec.add_development_dependency "guard", "~> 2.14"
|
|
37
|
+
spec.add_development_dependency "guard-rspec", "~> 4.7"
|
|
37
38
|
|
|
38
39
|
# If you want to work on older builds of ruby
|
|
39
|
-
spec.add_development_dependency
|
|
40
|
+
spec.add_development_dependency "listen", "3.0.7"
|
|
40
41
|
|
|
41
42
|
# This gives you the chance to run a REPL inside your tests
|
|
42
43
|
# via:
|
|
@@ -45,5 +46,5 @@ Gem::Specification.new do |spec|
|
|
|
45
46
|
# binding.pry
|
|
46
47
|
#
|
|
47
48
|
# This will stop test execution and let you inspect the results
|
|
48
|
-
spec.add_development_dependency
|
|
49
|
+
spec.add_development_dependency "pry"
|
|
49
50
|
end
|
|
@@ -1,35 +1,70 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Apkstats::Command
|
|
2
4
|
class ApkAnalyzer
|
|
3
|
-
include
|
|
5
|
+
include Apkstats::Command::Executable
|
|
4
6
|
|
|
5
|
-
def
|
|
6
|
-
|
|
7
|
+
def initialize(opts)
|
|
8
|
+
@command_path = opts[:command_path] || "#{ENV.fetch('ANDROID_HOME')}/tools/bin/apkanalyzer"
|
|
9
|
+
end
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
else
|
|
11
|
-
return nil, err
|
|
12
|
-
end
|
|
11
|
+
def file_size(apk_filepath)
|
|
12
|
+
run_command("apk", "file-size", apk_filepath)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def
|
|
16
|
-
run_command(
|
|
15
|
+
def download_size(apk_filepath)
|
|
16
|
+
run_command("apk", "download-size", apk_filepath)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def
|
|
20
|
-
run_command(
|
|
19
|
+
def required_features(apk_filepath)
|
|
20
|
+
::Apkstats::Entity::Features.new(ApkAnalyzer.parse_features(run_command("apk", "features", apk_filepath)))
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
def non_required_features(apk_filepath)
|
|
24
|
+
all_features = ApkAnalyzer.parse_features(run_command("apk", "features", "--not-required", apk_filepath))
|
|
25
|
+
Apkstats::Entity::Features.new(all_features.select(&:not_required?))
|
|
26
|
+
end
|
|
24
27
|
|
|
25
|
-
def
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
def permissions(apk_filepath)
|
|
29
|
+
::Apkstats::Entity::Permissions.new(ApkAnalyzer.parse_permissions(run_command("manifest", "permissions", apk_filepath)))
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def min_sdk(apk_filepath)
|
|
33
|
+
run_command("manifest", "min-sdk", apk_filepath)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def target_sdk(apk_filepath)
|
|
37
|
+
run_command("manifest", "target-sdk", apk_filepath)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.parse_permissions(command_output)
|
|
41
|
+
command_output.split(/\r?\n/).map { |s| to_permission(s) }
|
|
29
42
|
end
|
|
30
43
|
|
|
31
|
-
def
|
|
32
|
-
|
|
44
|
+
def self.to_permission(str)
|
|
45
|
+
# If maxSdkVersion is specified, the output is like `android.permission.INTERNET' maxSdkVersion='23`
|
|
46
|
+
name_seed, max_sdk_seed = str.strip.split(/\s/)
|
|
47
|
+
::Apkstats::Entity::Permission.new(name_seed.gsub(/'$/, ""), max_sdk: max_sdk_seed && max_sdk_seed[/[0-9]+/])
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.parse_features(command_output)
|
|
51
|
+
command_output.split(/\r?\n/).map { |s| to_feature(s) }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def self.to_feature(str)
|
|
55
|
+
# format / name implied: xxxx
|
|
56
|
+
# not-required and implied cannot co-exist so it's okay to parse them like this
|
|
57
|
+
name, kind, tail = str.strip.split(/\s/, 3)
|
|
58
|
+
|
|
59
|
+
::Apkstats::Entity::Feature.new(name, not_required: kind == "not-required", implied_reason: kind == "implied:" && tail)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def run_command(*args)
|
|
65
|
+
out, err, status = Open3.capture3("#{command_path} #{args.join(' ')}")
|
|
66
|
+
raise err unless status.success?
|
|
67
|
+
out.rstrip
|
|
33
68
|
end
|
|
34
69
|
end
|
|
35
|
-
end
|
|
70
|
+
end
|