RetroArch 1.9.0 won’t be releasing on Google Play Store for now, next version severely downgraded to comply with new policies

We regret to inform you that RetroArch 1.9.0 will not be releasing on the Google Play Store for now.

RetroArch has been available on Android through the Google Play Store since 2012. We encountered two snags this week while trying to update RetroArch on Google Play. First, it complained that our APK size was too big, and that an APK could not be any bigger than 100MB. So we had to go back and start removing some shaders in order to get things to fit.

After this, we tried uploading again. This time, we hit another snag that we have not encountered before:

Issue: Violation of Malicious Behavior policy

An app distributed via Google Play may not modify, replace, or update itself using any method other than Google Play’s update mechanism. Likewise, an app may not download executable code (e.g. dex, JAR, .so files) from a source other than Google Play.

The way we interpret it, the former is not an issue since RetroArch cannot update itself. The latter is probably the issue. We take it that apparently now the Core Updater service is a point of contention, and that it has to go from RetroArch Android. We were not aware of this, and throughout the app’s near-decade presence on the Google Play Store, there has never been a problem before on this front.

Unfortunately, this means that we have to go back to the drawing board now and fundamentally re-engineer RetroArch for Android. However it will be re-tooled, it will unfortunately be a huge setback from an Enduser Experience for the user, there’s no way around that.

Some possibilities that might exist:

  1. We keep RetroArch dynamically linked, but each core has to be installed separately through the Google Play interface as installable DLC. NOTE: We have no idea if this even works the way it can with Steam, so it would have to be explored first.
  2. We make RetroArch statically linked and therefore there needs to be a separate new app store entry for every single combination of RetroArch with every single core.

Whichever of the two we choose, it will mean no more Core Updater. Given the interpretation of the rules, updating assets is probably still permissible as it would be pretty silly to block that, so things like updating shaders and overlays would likely still remain included.

We cannot stress how much of a pain in the ass it will be to have to retool RetroArch like this. It’s almost at the point where it’s almost not worth it from our perspective to do it like this and we feel tempted to just tell people to download it from our site instead, as we certainly have never made a single buck on the Google Play Store to begin with, so there’s no direct profit incentive there. We also don’t know if we even have the manpower right now to be able to make these fundamental changes, but we will certainly attempt to try.

For now, we recommend to users that want the ‘proper’ version to just go to our Downloads page and download RetroArch 1.9.0 from there on Android. You will be installing the APK directly on your phone. You might have to enable ‘Allow outside APKs to be installed’ or some similar setting on your phone for it to be able to be installed, but theoretically any Android phone should be able to install APKs outside of the Play Store.

Where to download RetroArch for Android for now

If you want the latest 1.9.0 version, you can either get it for now on F-Droid, or on our Downloads page here.

Right now on the Play Store, version 1.8.9 should still be available for now.

We apologize for the inconvenience and we hope we can offer a solution soon that is agreeable to both Google and that doesn’t cause us a huge maintenance burden either (although it assuredly will be). We also right now don’t really have a plan ready that will allow us to quickly move on this front, so we’ll just have to see how things go.

RetroArch 1.9.0 released!


RetroArch 1.9.0 has just been released.

Grab it here.

A Libretro Cores Progress Report will follow later.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

Highlights

Explore View for playlists

Probably the highlight of this release – there is a new ‘Explore’ view for all playlists.

The Explore view takes advantage of the Libretro databases’ metadata history of content. It allows you to search / find content based on criteria such as:

  • Amount of players
  • Developer
  • Publisher
  • System (game console/platform that the game released on)
  • Origin (country of origin that the game was developed in)
  • By Release Year
  • By Genre

The ‘Explore’ view only shows the content that has been added to your playlists. It will not show entries that haven’t yet been added to your collection.

The metadata is currently a bit on the incomplete side, but you can expect us to add more and more metadata to the Libretro database as we go along. This is only the beginning.

Usecases

There are tons of ways you can use the Explore view to find what you want. Here are some of them:

Granular filtering

Here is a good example of the kind of powerful context-sensitive filtering that is possible with the Explore view.

  • Go to Explore
  • Type in ‘super’, will list all entries in your collection that has ‘super’ in the name. 219 entries are shown.
  • We will now filter the entries by a specific developer to narrow down our search. We go to ‘Additional Filters’, and select a developer of choice. Now out of 219 entries, only 25 entries are still shown that matches this criteria (name has ‘super’ in the title, AND is from a specific developer)
  • Let’s add another filter to narrow down the search even more. We go to ‘Additional Filters’ again, and this time we select ‘By Release Year’, ‘1993’. There’s now only 6 entries shown that matches this criteria (name has ‘super’ in the title, AND is from a specific developer, AND was released in the year 1993).
  • Let’s add another filter. We go to ‘Additional Filters’, ‘Region’, ‘Europe’). Now only 3 entries are shown that matches this criteria (name has ‘super’ in the title, AND is from a specific developer, AND was released in the year 1993, AND was released in region ‘Europe’).

NOTE: It should be mentioned that in the future, if you want the metadata to be updated automatically in existing versions of RetroArch, you should go to ‘Online Updater’ and select ‘Update Databases’. After this, you might have to restart.

Enhanced playlist search functionality

Before, RetroArch’s inbuilt ‘search’ function was woefully inadequate:

  • The user presses RetroPad ‘X’ (or keyboard ‘/’, or Material UI’s search icon), and enters a search term
  • The navigation pointer jumps to the first match
  • That’s it. There is no way to continue searching from that point, or to do much of anything, really. It’s mostly a non-feature…

    The search functionality has now been enhanced as follows:

    • When viewing a playlist, the user presses RetroPad X (or /, etc.) as normal, and enters a search term
    • This becomes a filter – all matching entries will be displayed
    • The user can then perform another search to further refine the results. An arbitrary number of filters may be stacked in this fashion
    • Pressing ‘cancel’ clears the last entered filter

    Here’s an example of the search feature in action:

    Content loading animations

    A new “Load Content” Startup Notification option has been added under Settings > On-Screen Display > On-Screen Notifications. When enabled, a brief animation is shown whenever content is launched – it looks something like this –

    • The animation is disabled when running a core without content (there are some underlying technical issues that prevent this)
    • The animation is disabled when running content with ‘in-built’ cores (imageviewer, music/video player).
    • The animation works both for content launched via the menu and via the command line

    Easy dropdown lists for input remapping

    Before, when you wanted to remapp inputs via the Quick Menu (Quick Menu > Controls > Port N Controls), the user had to press left/right ad nauseam in order select an appropriate core input for each controller button. This is somewhat cumbersome, and highly awkward on touchscreen devices.

    In this new version we have added drop-down lists to the input remap entries. For example, when viewing this:

    …the user can now press OK (or keyboard enter, or tap/click the entry) to open a list of available inputs:

    This works for both controller and keyboard Device Types.

    In addition:

    • You can now use the RetroPad start button to reset (unbind) controller keyboard remaps (when Device Type is a keyboard type, obviously!)
    • Fixed a bug whereby pressing RetroPad select on certain entries would spawn a message box with no text – this would be invisible, and would therefore appear to ‘hang’ the menu.

    FFMpeg/Video Player Improvements

    • A new progress overlay bar has been added to the ffmpeg core (embedded in RetroArch for Windows/Linux). When you skip forwards or backwards via the directional keys or D-pad, you will see this interface appear for a brief period of time.
    • Lockups could occur when playing videos if a forwards seek operation would take the target playback position past the end of the file. We have added the following workaround: seek operations are limited to a point 1 second before the end of the file, and if the user attempts to seek past the end then playback of the file will restart from the beginning.
    • Solved several big memory leaks upon opening videos

    iOS/tvOS Metal Renderer

    RetroArch on iOS/tvOS now supports Apple’s Metal graphics API. Slang shader support is already implemented and all software rendered cores should work.

    Currently the iOS/tvOS build will default to OpenGL because of a few outstanding issues that still have to be resolved:

    • Slang shaders degrade performance noticeably on most cores
    • When audio is interrupted, it doesn’t resume with the Metal renderer (OpenGL seems ok)

    Other general menu improvements

    • The RGUI menu now shows boolean settings as a ‘toggle switch’ if you have the setting ‘Show Switch Icons’ enabled (Settings -> User Interface -> Appearance).
    • Previously, RetroArch would have the bad habit of resetting the selection cursor to the first entry in the menu after returning from almost every list of selectable values for a setting. For example, if you go to Settings -> Drivers -> Audio and change the audio driver (or press Back), the selection cursor will be reset to the first entry of the Drivers menu instead of the Audio item from where we were originally. This has been fixed.
    • People previously complained that it was possible to set drivers to ‘null’ that are necessary for RetroArch to work, such as ‘Menu’ and ‘Video’. It’s now no longer possible to set a driver to ‘null’ unless there is no driver available for this type.
    • MaterialUI – The Playlist screen now shows icons of the associated system.
    • The three separate Scan Directory/Scan File/Manual Scan entries are now moved into a submenu called ‘Import Content’. They are no longer shown in any ‘top level’ menu. This unclutters the Playlist screen.
    • You can now selectively hide/enable widget notifications of several types. For instance, autoconfig messages, load content animation popups, cheat code notifications, fastforward notifications, screenshot indications, and more can all be individually configured. You no longer have to disable widgets altogether if you don’t like any one of the widget UI elements, you can now just opt to disable the widget that you don’t like.
    • (Windows only) Screen resolution dropdown list improvements – it no longer includes multiple duplicate entries.

    File I/O/Memory improvements

    A significant amount of time has been spent reducing RetroArch’s memory footprint and reducing disk I/O overhead when doing menial operations such as loading a configuration file or a playlist inside RetroArch.

    Changelog

    There’s much more to this release than meets the eye. See the CHANGELOG below for a more detailed breakdown.

    1.9.0

    • 3DS: Fix sound crackling when paused
    • ANDROID/VIBRATION: Fixes “Vibrate on Key Press” having no effect on Android devices, which occurred because only the off time/strength was defined in what should have been a pair of off/on values
    • AUTOCONFIG: Ensure correct directory is used when saving autoconfig profiles
    • BLUETOOTH: Add a Bluetooth driver (Lakka-only for now)
    • CHEATS: Fix for wrong number of remaining cheat search matches on some machines
    • CHEEVOS: Option to play sound on achievement unlock.
    • CHEEVOS: Upgrade to rcheevos 9.1
    • CHEEVOS: Restore display of unlocked achievements across hardcore modes
    • CHEEVOS: Hash buffered data when available
    • CHEEVOS: Fix ‘Auto Save State freezes RetroArch while Cheevos is enabled’
    • CORE OPTIONS: Pressing OK (or clicking/tapping) on a ‘boolean toggle’ core option no longer opens a drop-down list. The value now toggles directly, just like boolean options everywhere else in the menu
    • CORE OPTIONS: Toggling an option that changes the number of core options being displayed (i.e. things like `Show Advanced Audio/Video Settings) no longer resets the navigation pointer to the start of the list
    • CORE OPTIONS: Before, RetroArch would identify core option values as being ‘boolean’ if they had labels matching the specific strings enabled or disabled. Most core devs would abide by this, but not always… As a result, we sometimes would end up with misidentified values, with all kinds of Enabled, Off, True, etc. strings littering the menu, in place of proper toggle switches. All boolean-type value labels are now detected, and replaced with standard ON/OFF strings.
    • CLI: A new command line option –load-menu-on-error has been added
    • CRT: On the fly CRT porch adjuments – these changes allow a user to adjust how the porch algorithm generates the 15khz/31khz output. Giving the ability to change over/under scan.
    • CONFIG FILE: Optimise parsing of configuration files
    • D3D9/D3D11: Fix core-initiated D3D9/D3D11 driver switches
    • DRIVERS: Implemented protection to avoid setting critical drivers to nothing thus preventing the user from locking him/herself out of the program
    • EMSCRIPTEN: Fix input code to ignore unknown keys
    • FFMPEG CORE: Prevent seeking past the end of files (hang fix)
    • FILE I/O: VFS and NBIO interfaces will now use 64-bit fseek/ftell where possible, should allow for reading/writing to files bigger than 2GB
    • INPUT MAPPING/REMAPPING: Add input remap drop-down lists
    • IOS: Fixed iOS 6 version
    • IOS: Hide the home indicator as it obscures the content too frequently
    • IOS/METAL: Metal video driver now works on RetroArch iOS
    • IOS/METAL: Support getting video metrics to support proper touchscreen interactions
    • LOCALIZATION: Updates for several languages (synchronized from Crowdin)
    • MEMORY/LINUX/ANDROID: Fix reporting of free memory
    • MEMORY/WINDOWS: Fix reporting of free memory
    • MENU: Enlarged INT/UINT selection limit from 999 to 9999
    • MENU: Fix cursor forced to first entry after displaying lists
    • MENU: Make Notification Font option visible when Graphics Widgets are enabled
    • MENU/RGUI: Add optional ‘toggle switch’ icons
    • MENU/WIDGETS: Add optional widget-based ‘load content’ launch feedback animation
    • MENU/WIDGETS: Make notification font size option visible when graphics widgets are enabled
    • ODROID GO ADVANCE: Video driver – fix race condition with RGUI callback
    • PLAYLISTS: Change playlists to use dynamic arrays. Instead of a fixed initial 12MB memory allocation (99999 * 128 byte (on 64bit arch)), use a dynamically growing array
    • PLAYLISTS: Playlist base content directory paths – portable playlists
    • PLAYLISTS/SEARCH: Enhanced playlist search functionality
    • PLAYLISTS/DATABASE: Add ‘Explore’ view
    • PLAYLISTS/DATABASE/EXPLORE: Show system icons in explore view
    • PS2: Improve FPS Limiter
    • RUNAHEAD: Prevent runahead from being disabled permanently when an error occurs
    • SCANNER: Add more region codes for GameCube/Wii game detection
    • SHADERS/SLANG: Increased Slang max Parameters, Textures & Passes
    • VIDEO FILTERS/BLARGG: Make Blargg_snes filter customizable
    • WINDOWS/RAWINPUT: Fix invalid calls to dinput_handle_message when input driver is not set to dinput
    • X11: Add lightgun support

    Other news

    We will follow this up with more news soon on all the recent core developments that have been going on. As usual with these blog posts, there’s a lot we don’t have time to touch on when it comes to bugfixes, improvements and additions to the Libretro/RetroArch project.

    New and improved versions of the Dolphin and Citra cores will be coming soon. The PPSSPP core is now being actively updated again and should be up-to-date with the Git upstream repository. In addition to this, there are several other big new things that will be discussed soon.