无需不断重建 swf 即可修补 actionscript
Posted
技术标签:
【中文标题】无需不断重建 swf 即可修补 actionscript【英文标题】:patching actionscript without constantly rebuilding swf 【发布时间】:2016-12-30 12:51:24 【问题描述】:如何在不不断重建 sfw 的情况下修补 actionscript? 我需要修改一个相当大的 actionscript 项目,并且生成的 swf 用于实时站点。我遇到的问题是我需要对 swf 进行快速的小更新,并且每天在实时站点上更新 swf 十次是不可接受的(我无法控制那部分,我需要让另一个人把结果在现场)。 我有什么选择来解决这个问题?当谈到动作脚本和所有与 Flash 相关的东西时,我是一个完全的菜鸟,我什至不确定什么是可能的,什么不是。我正在考虑以下方法,哪些是可能/可接受的?
假设实时站点位于www.livesite.com/game.html
并且此页面加载www.livesite.com/flashgame.swf
。在flashgame.swf
中,有一个类com/livesite/Magic.as
被实例化,并且该类的实例具有类com/livesite/MagicWork.as
的成员变量xxx123
。我只需要修改这个MagicWork
类。现在,我只需对其进行修改、构建并要求将更新的flashgame.swf
直播。所以,我想避免那个手动步骤。
我的所有想法都可以分为两种基本方法:1) 保持 flashgame.swf 完全不变,然后加载包含 MagicWork
类的替代实现的 flashgame.mod.swf,然后使用 javascript 访问该实例的内部结构Magic 类并将其 xxx123
成员更新为来自 flashgame.mode.swf
的 MagicWork
类的实例。我需要修改game.html
以加载我的javascript,以便我的js 文件将加载flashgame.mod.swf
和flashgame.swf
中的补丁代码。通过修补我的意思是 javascript 样式覆盖 Magic.xxx123 到一个新值。 flashgame.mode.swf
理想情况下会驻留在我自己控制的主机上。那种东西是可能的,如果不是什么是不可能的?
2) 我可以在flashgame.swf
中进行一次性更改,以便它可以在运行时有效地加载我自己的代码并修补它的xxx123
成员。这可能吗?
【问题讨论】:
为什么需要多次重新发布到现场制作网站?! @Brian 我不需要,但如果我需要,我不想手动询问 10 次。我正在从事早期项目,该项目部分取决于它在现场网站上的工作方式。因此,如果有任何问题,可以快速修复并立即更新。关键是它是为 0.001% 的用户启用的,所以它不会对所有 ppl 产生影响,在那里犯错是可以的。 好的,那么解决您的问题的方法是直接访问“0.001% 实时站点”,这样您就可以更新 swf——不要更改代码以从 pavelscustomworld.org 加载依赖项 swf . 不,这实际上是以这种方式作为模块加载的重点。最终会是这样。基本上更大的flashgame.swf
项目独立存在,mod
是独立的,可以独立更新。将它们分开不仅是解决手动更新问题的“奇怪”方式,而且无论如何都是最终必须的方式。
您是否正在考虑使用运行时共享库? Flash Player 能够在运行时加载外部代码库,这些代码库可以与您正在播放的主 .swf 文件分开。但是外部库仍然需要在公共 Web 服务器上进行编译和部署。
【参考方案1】:
我之前已经写过关于加载运行时共享库的说明。我将把这个过程中最重要的部分放在这里,并在最后添加一个指向全文的链接。
您需要按以下方式标记您的主应用程序入口点。
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
然后创建一个名为 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);
Main类的完整实现是这样的。
[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);
部署运行时共享库
使用运行时共享库令人困惑的一点是,必须在部署应用程序时从 SWC 中提取 SWF。这并不是很明显,我最终花了几天时间将编译好的 SWC 文件放在不同的位置,并想知道为什么应用程序无法在运行时加载它。 Adobe 网站上的一篇晦涩难懂的文章明确说明了这一特定步骤并直截了当。
完整的文章和相同的例子可以在http://www.notadesigner.com/runtime-shared-libraries-with-plain-actionscript/获得。
【讨论】:
以上是关于无需不断重建 swf 即可修补 actionscript的主要内容,如果未能解决你的问题,请参考以下文章
如何修补/invoker/jmxinvokerservlet/漏洞