Pavel Pavel - 3 months ago 14
ActionScript Question

patching actionscript without constantly rebuilding swf

How can I patch actionscript without constantly rebuilding sfw?
There is a fairly large actionscript project that I need to modify and resulting swf is used on a live site. The problem I have is that I need to make quick small updates to the swf and it's not acceptable to update the swf on live site ten time a day (I don't control that part, I need to ask another person to put the result on live site).
What options do I have to workaround that issue? I'm a complete noob when it comes to actionscript and all flash related stuff and I'm not even sure what is possible and what isn't. I'm thinking about the following approaches, which ones are possible/acceptable?

Imagine that live site is on

www.livesite.com/game.html
and this page loads
www.livesite.com/flashgame.swf
. In that
flashgame.swf
among many others there is a class
com/livesite/Magic.as
that gets instantiated and instance of that class has a member variable
xxx123
of class
com/livesite/MagicWork.as
. I only need to modify this
MagicWork
class. Now, I simply modify it, build and ask to put updated
flashgame.swf
live. So, I want to avoid that manual step.

All my ideas can be split in two basic approaches: 1) keep flashgame.swf totally unmodified and then load flashgame.mod.swf that contains alternative implementation of that
MagicWork
class, then using javascript access internals of instance of that Magic class and update its
xxx123
member to be an instance of
MagicWork
class from
flashgame.mode.swf
. I'd need to modify
game.html
to load my javascript so that my js file would load
flashgame.mod.swf
and patch code inside
flashgame.swf
. By patching I mean javascript-style overwriting of Magic.xxx123 to a new value.
flashgame.mode.swf
would ideally reside on my own host that I control. Is that kind of stuff possible, if not what's not possible?
2) I could make one-time change in
flashgame.swf
so that it would effectively load itself my own code at runtime and patch it's
xxx123
member. Is that possible?

Answer

I had already written a note about loading runtime shared libraries previously. I'll put the most essential parts of the process here, and add a link to the full article at the end.

You need to tag your main application entry point in the following manner.

[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{

}

Then create a class called Preloader.

public class Preloader
{

    public function Preloader()
    {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.loader_completeHandler);
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.loader_ioErrorHandler);
        var request:URLRequest = new URLRequest("math.swf");
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
        loader.load(request, context);
    }

    private function loader_completeHandler(event:Event):void
    {
        var mainClass:Class = getDefinitionByName("Main") as Class;
        var mainInstance:Main = new mainClass();
        this.addChild(mainInstance);
    }
}

The full implementation of the Main class is like this.

[Frame(factoryClass="Preloader")]
public function Main()
{
    var integer:IntegerArithmetic = new IntegerArithmetic(); // Type declared in math.swf
    var operand1:int = 10;
    var operand2:int = 10;
    var result:int = integer.add(operand1, operand2);
}

Deploying Runtime Shared Libraries

The confusing bit about using a runtime shared library is realizing that the SWF has to be extracted from the SWC at the time of deploying the application. This was not immediately obvious and I ended up spending days placing a compiled SWC file in various locations and wondering why the application was unable to load it at runtime. An obscure article on the Adobe website made explicit this particular step and set things straight.

The full article along with the same example is available at http://www.notadesigner.com/runtime-shared-libraries-with-plain-actionscript/.

Comments