Static analysis blocks a dedicated screensaver — false-positive "in-channel screensaver" (Req 4.5)

I’m publishing a standalone screensaver, Illustrated Gospels (app type Theme, category Screensavers). Static Analysis returns two blocking errors that prevent me from scheduling for publishing:

“Channels are prohibited from offering in-channel screensavers or any feature that overrides the Roku system screensaver.” (Requirement 4.5, appears twice)

This is a dedicated screensaver, not a channel embedding one:

  • Manifest declares screensaver_title=Illustrated Gospels
  • Entry point is RunScreenSaver() in source/main.brs; there is no Main() or RunUserInterface()
  • No streaming/channel functionality — it only cross-fades images and exits on any remote input

The tool appears to be misclassifying the screensaver as a channel. How do I clear these false positives so the app can be scheduled, or what is the correct app-type/config for a standalone screensaver?

Does your screensaver only implement top level RunScreenSaver() and **RunScreenSaverSettings()**functions? I think the static analysis can be tripped up if you also have a **Main()**function provided.

Thanks – to answer your question directly: no, there’s no Main(). The app
declares exactly one top-level function, RunScreenSaver(). There’s no
RunUserInterface() either. RunScreenSaverSettings() isn’t implemented, since
the screensaver has no settings screen.

Manifest:

title=Illustrated Gospels
major_version=1
minor_version=0
build_version=00001
screensaver_title=Illustrated Gospels
ui_resolutions=fhd
rsg_version=1.3
mm_icon_focus_hd=pkg:/images/icon_focus_hd.png
mm_icon_focus_sd=pkg:/images/icon_focus_sd.png
splash_screen_hd=pkg:/images/splash_hd.jpg
splash_screen_fhd=pkg:/images/splash_fhd.jpg

Static analysis reports:

  1. Channels are prohibited from offering in-channel screensavers or any
    feature that overrides the Roku system screensaver. (Error, req 4.5)
  2. (same message, duplicated)
  3. Channel type is channel but Main() or RunUserInterface() function is
    missing. (Error)

I ran two controlled experiments to isolate this.

First, I temporarily added an empty Main(). Error 3 cleared and analysis
proceeded to surface warnings it had never reached before. So the analyzer is
definitely reading the package I upload – this is not a stale-package issue.
(I also verified the md5 of the package returned by the dashboard’s Download
link against the .pkg I uploaded. They match.)

Second, I removed mm_icon_focus_* and splash_screen_*, on the theory that
those channel-shaped attributes might be causing the app to be typed as a
channel. That produced a new req-6.4 error for the missing mm_icon_focus_hd,
and the two req-4.5 errors were completely unchanged. So those attributes are
required, and they are not the cause. I’ve restored them.

I’ve also confirmed the dashboard App type field has no effect (changing it
from Theme to App/Utility did not change the analysis results).

So: the app declares screensaver_title, has no prohibited entry points, and
the analyzer still types it as “channel,” which in turn produces the two
requirement-4.5 errors. Nothing I can change in the package affects this.

Is the channel type stored server-side on the listing, fixed at creation? If
so, can it be changed to screensaver, or do I need to create a new listing?
There is no “screensaver” option in the App type dropdown.

I’d rather not ship an empty Main() to pass the scan, since that would make
the requirement-4.5 errors legitimate.

Solved. Posting the fix separately so it’s easy to find.

It was one line in the manifest. I had both of these:

title=Illustrated Gospels
screensaver_title=Illustrated Gospels

A standalone screensaver uses screensaver_title INSTEAD OF title, not in
addition to it. title is the channel attribute. Its presence is what made
static analysis report “Channel type is channel,” and that in turn made my
perfectly legal screensaver_title look like a channel overriding the system
screensaver – the two requirement-4.5 errors.

Deleting the title= line cleared all three errors at once. Static analysis now
reports “package detected as Screensaver.”

So to answer the original question in this thread: no, a stray Main() was not
the problem. I have neither Main() nor RunUserInterface(). That error –
“Channel type is channel but Main() or RunUserInterface() function is
missing” – is a symptom of the wrong channel type, not the cause of it.
Adding an empty Main() does silence it, but it makes the 4.5 errors
legitimate, because then you really are a channel shipping a screensaver.
Don’t do that.

Credit to the older thread “Issue with Screensaver: Channel type is channel”
(Dec 2023). renojim’s answer there was “your manifest is all wrong,” which is
correct, but I didn’t understand what was wrong until I diffed the OP’s repo
and found a commit named “Fixed Manifest” whose only meaningful change was
replacing title= with screensaver_title=.

Two suggestions for Roku:

  1. The channel manifest docs list the required screensaver attributes without
    saying that title must be ABSENT. It reads as though title is merely
    optional. It isn’t – it actively breaks screensaver detection.

  2. The error message points at Main() and RunUserInterface(), which are the
    two functions screensavers are explicitly prohibited from having. That
    sends you looking in exactly the wrong place.

Thanks for that followup. Yes, the “no title attribute” requirement definitely should be emphasized.