headdesk 0.12.0 → 0.13.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/.gitignore +2 -0
- data/Gemfile.lock +7 -0
- data/README.md +0 -1
- data/docs/firebase_messaging_event.md +43 -0
- data/headdesk.gemspec +2 -1
- data/lib/headdesk/apktool.rb +1 -1
- data/lib/headdesk/check.rb +1 -1
- data/lib/headdesk/checks/activity_alias.rb +10 -7
- data/lib/headdesk/checks/facebook.rb +7 -2
- data/lib/headdesk/checks/firebase_messaging_event.rb +36 -0
- data/lib/headdesk/checks/teak.rb +13 -12
- data/lib/headdesk/cli.rb +1 -0
- data/lib/headdesk/cli_commands/blame.rb +3 -2
- data/lib/headdesk/cli_commands/unpack.rb +2 -2
- data/lib/headdesk/data/facebook_sdk_versions.yaml +15 -0
- data/lib/headdesk/version.rb +1 -1
- metadata +26 -6
- data/docs/teak/caching.md +0 -24
- data/lib/headdesk/checks/teak/caching.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7556187a87dbdfa6c3f9cec106695a8043091cd0c3cf43cfeb8d1b59bae32f2c
|
4
|
+
data.tar.gz: f968c92aa363c253af156ecf84e46b7319015ff1356e6cd4fbb550bbf06c360f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9690e535090b5c68192ff6fb04898f6517d47891c1f2196f2d926b1a8c7cdfe34a2795b28412c26bac5d29a0845ea76bef030ed53551da3a092859b06b78710c
|
7
|
+
data.tar.gz: ed9291760f36a5390a1bb5b867e663dd238915e6c0e1bc6e6deee31e273aee2e861aaa184864b10f79a15b8cc936783b5be2511c1f58e155004395971efd16d6
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -25,6 +25,7 @@ GEM
|
|
25
25
|
descendants_tracker (0.0.4)
|
26
26
|
thread_safe (~> 0.3, >= 0.3.1)
|
27
27
|
diff-lcs (1.3)
|
28
|
+
docile (1.3.1)
|
28
29
|
equalizer (0.0.11)
|
29
30
|
gem-release (2.0.1)
|
30
31
|
gems (1.1.1)
|
@@ -73,6 +74,11 @@ GEM
|
|
73
74
|
ruby-progressbar (~> 1.7)
|
74
75
|
unicode-display_width (~> 1.4.0)
|
75
76
|
ruby-progressbar (1.10.0)
|
77
|
+
simplecov (0.16.1)
|
78
|
+
docile (~> 1.1)
|
79
|
+
json (>= 1.8, < 3)
|
80
|
+
simplecov-html (~> 0.10.0)
|
81
|
+
simplecov-html (0.10.2)
|
76
82
|
thor (0.20.3)
|
77
83
|
thread_safe (0.3.6)
|
78
84
|
unicode-display_width (1.4.1)
|
@@ -93,6 +99,7 @@ DEPENDENCIES
|
|
93
99
|
reek (~> 5.0)
|
94
100
|
rspec (~> 3.8)
|
95
101
|
rubocop (~> 0, >= 0.49.0)
|
102
|
+
simplecov (~> 0, >= 0.16.0)
|
96
103
|
|
97
104
|
BUNDLED WITH
|
98
105
|
2.0.1
|
data/README.md
CHANGED
@@ -21,7 +21,6 @@ This is output from the check that ensures that the version of the Facebook SDK
|
|
21
21
|
* [facebook](docs/facebook.md)
|
22
22
|
* [receiver](docs/receiver.md)
|
23
23
|
* [teak/api21_icon](docs/teak/api21_icon.md)
|
24
|
-
* [teak/caching](docs/teak/caching.md)
|
25
24
|
* [teak/configuration](docs/teak/configuration.md)
|
26
25
|
|
27
26
|
## Installation
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# firebase_messaging_event
|
2
|
+
Ensures that there is only one `<service>` with `<intent-filter` for `com.google.firebase.MESSAGING_EVENT` declared in the `AndroidManifest.xml`
|
3
|
+
|
4
|
+
## Will Fail If
|
5
|
+
* More than one `<service>` has an `<intent-filter>` for `com.google.firebase.MESSAGING_EVENT` without specifying an `android:priority`
|
6
|
+
|
7
|
+
## Exports
|
8
|
+
The services which have an `<intent-filter>` for `com.google.firebase.MESSAGING_EVENT` present in `AndroidManifest.xml`
|
9
|
+
|
10
|
+
### Example
|
11
|
+
```json
|
12
|
+
{
|
13
|
+
"filters":[
|
14
|
+
{
|
15
|
+
"name":"com.google.firebase.messaging.FirebaseMessagingService",
|
16
|
+
"priority":-500
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"name":"com.leanplum.LeanplumPushFirebaseMessagingService",
|
20
|
+
"priority":0
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"name":"io.teak.sdk.push.FCMPushProvider",
|
24
|
+
"priority":0
|
25
|
+
}
|
26
|
+
]
|
27
|
+
}
|
28
|
+
```
|
29
|
+
|
30
|
+
## Reason
|
31
|
+
If multiple listeners for `com.google.firebase.MESSAGING_EVENT` exist, only the highest priority `<service>` will receive the message. This can cause unexpected behavior.
|
32
|
+
|
33
|
+
## Resolution
|
34
|
+
Remove the `<service>` blocks which have `<intent-filter>` for `com.google.firebase.MESSAGING_EVENT`, or add `android:priority` to the `<intent-filter>` to manually specify which `<service>` will process the message.
|
35
|
+
|
36
|
+
For example, this gets inserted by Firebase automatically, and sets its priority to `-500`:
|
37
|
+
```xml
|
38
|
+
<service android:exported="false" android:name="com.google.firebase.messaging.FirebaseMessagingService">
|
39
|
+
<intent-filter android:priority="-500">
|
40
|
+
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
|
41
|
+
</intent-filter>
|
42
|
+
</service>
|
43
|
+
```
|
data/headdesk.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.homepage = 'https://github.com/GoCarrot/headdesk'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
18
|
-
spec.post_install_message = 'For breaking change announcements...'
|
18
|
+
# spec.post_install_message = 'For breaking change announcements...'
|
19
19
|
|
20
20
|
# Specify which files should be added to the gem when it is released.
|
21
21
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency 'reek', '~> 5.0'
|
33
33
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
34
34
|
spec.add_development_dependency 'rubocop', '~> 0', '>= 0.49.0'
|
35
|
+
spec.add_development_dependency 'simplecov', '~> 0', '>= 0.16.0'
|
35
36
|
|
36
37
|
spec.add_dependency 'awesome_print', '~> 1.8'
|
37
38
|
spec.add_dependency 'gems', '~> 1.1'
|
data/lib/headdesk/apktool.rb
CHANGED
data/lib/headdesk/check.rb
CHANGED
@@ -53,7 +53,7 @@ module Headdesk
|
|
53
53
|
status: @status
|
54
54
|
}
|
55
55
|
@report[:name] = self.class.check_name if self.class.respond_to?(:check_name)
|
56
|
-
@report[:doc] = "https://github.com/GoCarrot/headdesk/blob
|
56
|
+
@report[:doc] = "https://github.com/GoCarrot/headdesk/blob/v#{Headdesk::VERSION}/docs/#{self.class.doc}" if self.class.respond_to?(:check_name)
|
57
57
|
end
|
58
58
|
|
59
59
|
def describe(desc = nil)
|
@@ -16,18 +16,21 @@ module Headdesk
|
|
16
16
|
include Check::APK
|
17
17
|
|
18
18
|
check_name 'activity_alias'
|
19
|
-
describe
|
19
|
+
describe '<activity-alias> is used to preserve app shortcuts'
|
20
20
|
def call
|
21
21
|
describe 'AndroidManifest.xml contains one or more <activity-alias>'
|
22
22
|
skip_check if: apk.android_manifest.xpath('application/activity-alias').empty?
|
23
23
|
|
24
24
|
aliases = []
|
25
25
|
apk.android_manifest.xpath('application/activity-alias').each do |activity_alias|
|
26
|
-
|
27
|
-
|
26
|
+
old_activity = activity_alias.attributes['name']
|
27
|
+
new_activity = activity_alias.attributes['targetActivity']
|
28
28
|
|
29
|
-
describe "<activity
|
30
|
-
fail_check if:
|
29
|
+
describe "AndroidManifest.xml contains <activity> '#{new_activity}'"
|
30
|
+
fail_check if: apk.android_manifest.xpath("application/activity[@android:name='#{new_activity}']").empty?
|
31
|
+
|
32
|
+
describe "<activity-alias> '#{old_activity}' -> '#{new_activity}' has '<intent-filter>'"
|
33
|
+
fail_check if: activity_alias.xpath('intent-filter').empty?
|
31
34
|
|
32
35
|
describe "<intent-filter> contains '<action android:name=\"android.intent.action.MAIN\" />'"
|
33
36
|
fail_check if: activity_alias.xpath("intent-filter/action[@android:name='android.intent.action.MAIN']").empty?
|
@@ -36,8 +39,8 @@ module Headdesk
|
|
36
39
|
fail_check if: activity_alias.xpath("intent-filter/category[@android:name='android.intent.category.LAUNCHER']").empty?
|
37
40
|
|
38
41
|
aliases << {
|
39
|
-
name:
|
40
|
-
targetActivity:
|
42
|
+
name: old_activity,
|
43
|
+
targetActivity: new_activity
|
41
44
|
}
|
42
45
|
end
|
43
46
|
export aliases: aliases
|
@@ -29,8 +29,13 @@ module Headdesk
|
|
29
29
|
sdk[:major] == major && sdk[:minor] == minor && sdk[:patch] == patch
|
30
30
|
end).first
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
begin
|
33
|
+
describe "Found Facebook SDK version #{sdk_in_use[:version]}"
|
34
|
+
fail_check if: -> { !sdk_in_use }
|
35
|
+
rescue NoMethodError => _e
|
36
|
+
describe "Facebook SDK version #{major}.#{minor}.#{patch} not found, run 'bundle exec bin/facebook_sdk_versions'"
|
37
|
+
fail_check
|
38
|
+
end
|
34
39
|
|
35
40
|
export facebook_sdk: sdk_in_use
|
36
41
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Headdesk
|
4
|
+
module Checks
|
5
|
+
#
|
6
|
+
# An <activity-alias> is most commonly used to change the class of the MAIN
|
7
|
+
# activity, while preserving shortcuts.
|
8
|
+
#
|
9
|
+
# com.google.firebase.MESSAGING_EVENT
|
10
|
+
#
|
11
|
+
class FirebaseMessagingEvent
|
12
|
+
include Check::APK
|
13
|
+
|
14
|
+
check_name 'firebase_messaging_event'
|
15
|
+
describe '<intent-filter> for \'com.google.firebase.MESSAGING_EVENT\''
|
16
|
+
def call
|
17
|
+
intent_filters = apk.android_manifest.xpath("application/service/intent-filter/action[@android:name='com.google.firebase.MESSAGING_EVENT']")
|
18
|
+
describe 'AndroidManifest.xml contains one or more <service> with <intent-filter> for \'com.google.firebase.MESSAGING_EVENT\''
|
19
|
+
skip_check if: intent_filters.empty?
|
20
|
+
|
21
|
+
filters = []
|
22
|
+
intent_filters.each do |filter|
|
23
|
+
filters << {
|
24
|
+
name: filter.parent.parent.attributes['name'].to_s,
|
25
|
+
priority: filter.parent.attributes['priority'].to_s.to_i
|
26
|
+
}
|
27
|
+
end
|
28
|
+
export filters: filters
|
29
|
+
|
30
|
+
max_priority = filters.max_by { |elem| elem[:priority].to_i }[:priority]
|
31
|
+
describe 'AndroidManifest.xml contains only one <service> with highest \'android:priority\' <intent-filter>'
|
32
|
+
fail_check if: filters.select { |elem| elem[:priority] == max_priority }.size > 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/headdesk/checks/teak.rb
CHANGED
@@ -31,21 +31,22 @@ module Headdesk
|
|
31
31
|
#
|
32
32
|
module InstanceMethods
|
33
33
|
def preconditions?
|
34
|
-
|
34
|
+
begin
|
35
|
+
major, minor, revision = apk.find_class('io.teak.sdk.Teak')
|
36
|
+
.field('SDKVersion')
|
37
|
+
.value
|
38
|
+
.to_version
|
39
|
+
@teak_sdk = OpenStruct.new(
|
40
|
+
version: "#{major}.#{minor}.#{revision}",
|
41
|
+
major: major, minor: minor, revision: revision
|
42
|
+
)
|
43
|
+
rescue NoMethodError => _e
|
44
|
+
return false
|
45
|
+
end
|
46
|
+
true
|
35
47
|
end
|
36
48
|
|
37
49
|
def teak_sdk
|
38
|
-
return @teak_sdk if @teak_sdk
|
39
|
-
|
40
|
-
major, minor, revision = apk.find_class('io.teak.sdk.Teak')
|
41
|
-
.field('SDKVersion')
|
42
|
-
.value
|
43
|
-
.to_version
|
44
|
-
@teak_sdk = OpenStruct.new(
|
45
|
-
version: "#{major}.#{minor}.#{revision}",
|
46
|
-
major: major, minor: minor, revision: revision
|
47
|
-
)
|
48
|
-
|
49
50
|
@teak_sdk
|
50
51
|
end
|
51
52
|
end
|
data/lib/headdesk/cli.rb
CHANGED
@@ -9,6 +9,7 @@ module Headdesk
|
|
9
9
|
#
|
10
10
|
# Find out which JAR/AAR is bringing in symbols
|
11
11
|
#
|
12
|
+
# :reek:NilCheck, :reek:NestedIterators
|
12
13
|
module Blame
|
13
14
|
include Headdesk::CliCommand
|
14
15
|
|
@@ -56,7 +57,7 @@ module Headdesk
|
|
56
57
|
all_matches.each do |package, symbols|
|
57
58
|
STDOUT.puts '📦 ' + package
|
58
59
|
symbols.each do |match|
|
59
|
-
STDOUT.puts " ↳ #{match[0]}#{match[1].green}#{match[2]
|
60
|
+
STDOUT.puts " ↳ #{match[0]}#{match[1].green}#{match[2]&.chomp('.')}"
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -72,7 +73,7 @@ module Headdesk
|
|
72
73
|
.each(&:strip!)
|
73
74
|
.map { |line| matcher.match(line) }
|
74
75
|
.compact
|
75
|
-
.map { |match| match.captures.map { |capture| capture
|
76
|
+
.map { |match| match.captures.map { |capture| capture&.tr('/', '.') } }
|
76
77
|
end
|
77
78
|
end
|
78
79
|
end
|
@@ -55,8 +55,8 @@ module Headdesk
|
|
55
55
|
CLI.command_help(Thor::Base.shell.new, 'unpack')
|
56
56
|
exit 1
|
57
57
|
rescue StandardError => rb_err
|
58
|
-
STDERR.puts
|
59
|
-
STDERR.puts
|
58
|
+
STDERR.puts rb_err.message.red
|
59
|
+
STDERR.puts rb_err.backtrace.ai
|
60
60
|
exit 1
|
61
61
|
end
|
62
62
|
end
|
@@ -1,4 +1,19 @@
|
|
1
1
|
---
|
2
|
+
- :major: 4
|
3
|
+
:minor: 41
|
4
|
+
:patch: 0
|
5
|
+
:version: 4.41.0
|
6
|
+
:date: 2019-03-08
|
7
|
+
- :major: 4
|
8
|
+
:minor: 40
|
9
|
+
:patch: 0
|
10
|
+
:version: 4.40.0
|
11
|
+
:date: 2019-01-22
|
12
|
+
- :major: 4
|
13
|
+
:minor: 39
|
14
|
+
:patch: 0
|
15
|
+
:version: 4.39.0
|
16
|
+
:date: 2018-12-05
|
2
17
|
- :major: 4
|
3
18
|
:minor: 38
|
4
19
|
:patch: 1
|
data/lib/headdesk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: headdesk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pat Wilson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -100,6 +100,26 @@ dependencies:
|
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 0.49.0
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: simplecov
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 0.16.0
|
113
|
+
type: :development
|
114
|
+
prerelease: false
|
115
|
+
version_requirements: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 0.16.0
|
103
123
|
- !ruby/object:Gem::Dependency
|
104
124
|
name: awesome_print
|
105
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -195,9 +215,9 @@ files:
|
|
195
215
|
- docs/activity_alias.md
|
196
216
|
- docs/api26.md
|
197
217
|
- docs/facebook.md
|
218
|
+
- docs/firebase_messaging_event.md
|
198
219
|
- docs/receiver.md
|
199
220
|
- docs/teak/api21_icon.md
|
200
|
-
- docs/teak/caching.md
|
201
221
|
- docs/teak/configuration.md
|
202
222
|
- exe/headdesk
|
203
223
|
- ext/apktool_2.3.4.jar
|
@@ -214,10 +234,10 @@ files:
|
|
214
234
|
- lib/headdesk/checks/activity_alias.rb
|
215
235
|
- lib/headdesk/checks/api26.rb
|
216
236
|
- lib/headdesk/checks/facebook.rb
|
237
|
+
- lib/headdesk/checks/firebase_messaging_event.rb
|
217
238
|
- lib/headdesk/checks/receiver.rb
|
218
239
|
- lib/headdesk/checks/teak.rb
|
219
240
|
- lib/headdesk/checks/teak/api21_icon.rb
|
220
|
-
- lib/headdesk/checks/teak/caching.rb
|
221
241
|
- lib/headdesk/checks/teak/teak.rb
|
222
242
|
- lib/headdesk/cli.rb
|
223
243
|
- lib/headdesk/cli_commands/analyze.rb
|
@@ -234,7 +254,7 @@ homepage: https://github.com/GoCarrot/headdesk
|
|
234
254
|
licenses:
|
235
255
|
- MIT
|
236
256
|
metadata: {}
|
237
|
-
post_install_message:
|
257
|
+
post_install_message:
|
238
258
|
rdoc_options: []
|
239
259
|
require_paths:
|
240
260
|
- lib
|
@@ -250,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
250
270
|
version: '0'
|
251
271
|
requirements: []
|
252
272
|
rubyforge_project:
|
253
|
-
rubygems_version: 2.7.
|
273
|
+
rubygems_version: 2.7.9
|
254
274
|
signing_key:
|
255
275
|
specification_version: 4
|
256
276
|
summary: headdesk helps identify and solve common issues in mobile development by
|
data/docs/teak/caching.md
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# teak/caching
|
2
|
-
Ensures that the APK contains a notification icon for both Android 5+ (API 21+) as well as pre-Android 5, and that these are different icons.
|
3
|
-
|
4
|
-
## Will Skip If
|
5
|
-
* The Teak SDK is not present.
|
6
|
-
* The version of the Teak SDK is greater or equal to 2.0.0.
|
7
|
-
|
8
|
-
## Will Fail If
|
9
|
-
* `io_teak_enable_caching` is not specified.
|
10
|
-
* `io_teak_enable_caching` is not set to `true`.
|
11
|
-
|
12
|
-
## Exports
|
13
|
-
None.
|
14
|
-
|
15
|
-
## Reason
|
16
|
-
The Teak SDK uses [Android HTTP Caching](https://developer.android.com/training/efficient-downloads/redundant_redundant#ResponseCache) to prevent downloading redundant Notification assets.
|
17
|
-
|
18
|
-
The `io_teak_enable_caching` setting allows you to disable this behavior, however it should be enabled unless your app, or an SDK that you use, makes uncommon assumptions.
|
19
|
-
|
20
|
-
## Resolution
|
21
|
-
Upgrade to the Teak 2.0 SDK, or add this to your Android resources XML:
|
22
|
-
```xml
|
23
|
-
<bool name="io_teak_enable_caching">true</bool>
|
24
|
-
```
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Headdesk
|
4
|
-
module Checks
|
5
|
-
module Teak
|
6
|
-
#
|
7
|
-
# Check to make sure that an APK, which uses Teak, has caching enabled.
|
8
|
-
#
|
9
|
-
class Caching
|
10
|
-
include Checks::Teak::APK
|
11
|
-
|
12
|
-
check_name 'caching'
|
13
|
-
describe 'Check for io_teak_enable_caching'
|
14
|
-
def call
|
15
|
-
describe 'Teak SDK version is lower than 2.0.0'
|
16
|
-
major, = apk.find_class('io.teak.sdk.Teak')
|
17
|
-
.field('SDKVersion')
|
18
|
-
.value
|
19
|
-
.to_version
|
20
|
-
skip_check if: major.to_i >= 2
|
21
|
-
|
22
|
-
describe "APK enables caching of Teak notification content (via 'io_teak_enable_caching')"
|
23
|
-
fail_check unless: apk.resources
|
24
|
-
.values
|
25
|
-
.bool
|
26
|
-
.io_teak_enable_caching
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|