init python:

    if renpy.android:
        settings.default("crashdefendersetting", 0)

        # Attempts at fixing the texture leak plaguing
        # android devices, mainly running on Android11 & Android 12.
        class Android11TextureLeakFix(NoRollback):
            def __init__(self, limit=100):
                self.statements = 0

                self.set_mode(settings.get("crashdefendersetting"))

            def set_mode(self, mode):
                if mode == 3:
                    self.limit = 15
                elif mode == 2:
                    self.limit = 25
                elif mode == 1:
                    self.limit = 55
                else:
                    self.limit = 0

            def __call__(self, name):
                if renpy.is_init_phase() or self.limit == 0:
                    return

                self.statements += 1

                if self.statements > self.limit:
                    self.statements = 0

                    # Big thanks to Andykl (https://github.com/Andykl)
                    # for finding the issue and inventing this workaround.
                    # https://github.com/renpy/renpy/issues/3643

                    cache = renpy.display.im.cache
                    cache_size = cache.get_total_size()
                    cache_limit = cache.cache_limit * 0.95

                    if cache_size >= cache_limit:
                        if config.developer:
                            print("Cache limit reached, purging cache... ({}/{})\n{}".format(cache_size, cache_limit, renpy.get_filename_line()))

                        cache.clear()

                    if renpy.game.interface is not None:
                        if config.developer:
                            print("Statements limit reached, cleaning textures... ({})\n{}".format(self.limit, renpy.get_filename_line()))

                        renpy.game.interface.full_redraw = True
                        renpy.game.interface.restart_interaction = True

                        if renpy.display.draw is not None:
                            renpy.display.draw.kill_textures()

                        renpy.display.render.free_memory()

        crashdefender = Android11TextureLeakFix()

        config.statement_callbacks.append(crashdefender)

init -10 python:

    if renpy.windows:
        # On windows, Renpy does not support backslashes in some of its functions,
        # but because the code needs to be platform-independent,
        # we require to monkey patch those functions in order
        # to remain compatible with all platforms without losing functionality.

        @renpy.pure
        def _loadable(filename):
            filename = filename.replace("\\", "/")

            return renpy.loader.loadable(filename)

        renpy.loadable = _loadable
