制作一个Flex AIR 程序调用 可执行程序(mxmlc.exe) 并且 生成.as文件并编译为.swf文件

在工作中遇到这么一个问题:

需要对一堆图片进行处理,具体处理细节是设定每一个图片的网格即每个网格是这一图片的某个矩形区域,并压缩。

如果没有接触过swf也不是写AS程序可能不会想到把这些图片和网格信息压缩成一个swf,而直接会想到的就是zip或者其他压缩格式。

SWF在被flashplayer执行时有它的先天优势,无需解包省去了相当大的一段时间;

PS:这个工具不是为程序员而作的,而且更不是为flash程序员做,而是给美术他们做的,所以制作这个软件的时候,相当大的一部分是再解决环境设置方面。

这里叙述的是如何把这些图片和信息文件也就是文本文件压缩为swf:

AIR可以操作文件系统,这就为我们打开了生成文件之路,并且能够执行一部分可执行文件(已知的有exe,py), 这些功能使得在某些方面有着相当大的发挥空间。

1.首先解决的是如何打开一个文件夹,和如何读取文件 写入文件, 参考File和FileStream 这2个类,基本毫无障碍。这里就不叙述了。

2.重点是调用exe, 和我们需要使用的是mxmlc.exe这样一个比较特别的可执行程序;

    首先需要介绍的是mxmlc.exe是什么: 它就是flash SDK 里面其中的一个 编译主程序入口,使用它我们就能把一个AS3或者Flex工程编译为SWF

    首先需要选择是哪个版本的SDK我使用的是4.6.0版本

   mxmlc.exe执行程序需要的是一个jre环境所以引发的下一个问题是jre环境的配置。

  因为本软件是做给其他不懂程序的美术们使用,所以最好的情况是这些环境都应该已经在这个程序中了;不然让美术们去配置flash sdk和jre环境 结果可想而知。

  如何找到这SDK和jre环境:

  1.SDK,就在你的flash builder安装目录下,拷贝一份就行, 可能会有多个版本,我选择的是4.6.0(其他版本的SDK对本教程也没多大区别)

  2.jre环境, 不用去其他地方找了,他也在flash builder安装目录下。

3.配置环境的重点:

  1.这2个环境文件 拷贝到哪里, 我本人拷贝到了这个软件制作的debug目录下也就是bin-debug目录下
    PS:如果拷贝到src(源文件)目录中, 2个环境包大概有900M左右大小,编译的时候可耗时间了,不推荐直接放入src

  2.目录形式是bin-debug - 4.6.0
                        - jre
  3.使用AIR的类调用执行程序的时候mxmlc会调用这个jre

  4.但是如果不改变4.6.0/bin/jvm.config这个文件的配置信息java.home=那么mxmlc就不会执行成功,会返回报错,没有找到JVM。
    4.1)纠结的问题从这时开始了, 在测试时按照我的目录结构(bin-debug) 那么java.home应该设置为java.home=../../jre
        因为mxmlc.exe文件和jre包的相对关系就是: 上层的上层的然后是jre
        bin-debug - 4.6.0/bin/mxmlc.exe
                  - jre
        如果是设置成这个了,恭喜了,你碰到头大的事情了,返回报错 ,没有找到JVM
        需要设置为java.home=../../../jre, 这样在debug的时候调用就会成功,程序便会通过。
    如果有童鞋知道这个原因的请回复我呀,不胜感激。
    4.2)有趣的是如果你使用一个bat文件去调用mxmlc编译的时候 这个设置必须修改回java.home=../../jre不然报错,没有找到JVM。

    4.3)这个文件中java.home参数纠结还没完呢, 最后程序制作完毕, 使用native installer选项导出一个安装包的时候, 同样的,
        把你刚才设置好java.home的2个环境包 原封不动的拷贝到你的安装包安装完成后的目录下,执行,同样他会报错,没有找到JVM。
        并且修改为java.home=../../jre和java.home=../../../jre都无效,试过才知道最终需要修改为java.home=jre才能成功调用
        那么这么说来,最后安装完成后的软件的main.exe程序执行后,mxmlc.exe和jre的关系变成了main.exe和jre的直接关系了?

    以上是经过本人反复试验得出的java.home路径总结。非常的头大。

4.环境配置结束现在需要回过头来,开始生成文件细节描述了。如何加载文件就不说了,这个比较基本也不会碰到很奇怪的问题。

  1.我们导出的结果是一个as文件,最后需要编译为swf,在flash的定义中,被动态加载的swf文件是被保护的,
    所以需要在此as文件中的构造函数里加入Security.allowDomain("*");(别忘了package 中必须import flash.system.Security;
    否则, 此后 我们的主程序加载这个文件后获取文件中的信息的时候会报安全错误。

  2. 图片信息的Embed
    基本格式是
    [Embed(source="1.png", compression="true", quality="50", smoothing="false")]
    public var img:Class;
    需要注意的是compression="true", quality="50"其中的compression值不能为false否则编译不会通过,quality是指需要的图片质量,
    也就是图片压缩率

  3.如果是文本信息那么基本格式是
    [Embed(source="1.txt", mimeType="application/octet-stream")]
    public var info:Class;
    需要注意和图片不同的地方是设置mimeType="application/octet-stream"

  4.此as文件的全文格式可以参考普通主文件

5.使用NativeProcess和NativeProcessStartupInfo调用mxmlc.exe

  首先设置好NativeProcessStartupInfo的执行文件也就是executable属性为mxmlc.exe

  然后NativeProcessStartupInfo的arguments属性需要设置一番, 重点有2处:
  5.1)第一设置的是你需要编译的那个文件url, 首先需要确定需要处理的这个文件是否已经是生成了得。

  5.2)第二设置的是-static-link-runtime-shared-libraries=true,本人碰到的问题就是没有设置这个参数,
      结果载入swf后报了一个ByteArrayAsset找不到该类的错误
      但是如果用的就是动态运行时连接共享库的话,这条应该也可以忽略,加入这条后swf会增加10多k(本人电脑上是这么多)

问题的解决总是那么的纠结,解决以后得成就感也是非常之大。
这个工具引发的遐想也是很多的,比如今后再也不用zip打包了,既然mxmlc能编译工程,那么何不自己做个发布工具,这样的话,可以随心所欲控制发布,做到提交版本无错又灵

活。人工操作时不时就会有这样那样的错误,解决这些问题就必须要有这样的工具去完成。有同样兴趣有同样需要解决这些问题的童鞋可以联系我啊。
PS:源代码会在下一篇博客中放出。

附上表:
mxmlc编译参数表:
accessible=true|false 是否具有可理解性(如为残疾人提供方便的性能)
actionscript-file-encoding 设置文件编码,如Shitf_JIS
advanced mxmlc -help advanced,如这样的高级参数
allow-source-path-overlap=true|false 验证source-path中定义的路径是否出现重叠,出现互相包含的现象
as3=true|false 是否使用as3对象模型,默认为ture,如果选false,则es一定要定义为true
benchmark=true|false 是否输出编译时期的详细内容,默认是true
context-root; context-path 设置flex-services.xml中的{context.root},如果没有详细定义,那flex将用空值。
contributor name 添加到swf文件里,name是贡献者的名字
creator name 添加到swf文件里,name是作者的名字
date text 添加到swf文件里,text是数据的内容
debug=true|false 是否可以进行调试
debug-password string 远程调试用,设置密码
default-background-color int 默认背景颜色,默认为null,例如: -default-background-color=0xCCCCFF
default-frame-rate int 设置帧数,默认为24
default-script-limits max-recursion-depth max-execution-time 定义应用脚本程序的执行限制
最大的递归默认是:1000
最大的执行时间默认是:60,你不能设置比60还大。
default-size width height 设置应用程序的大小,单位是像素
defaults-css-url string 设置css的路径
description text 添加到swf文件里的描述内容,text是描述的内容
dump-config filename 将次配置内容输出到filename的文件里,如:
mxmlc -dump-config myapp-config.xml
es=true|false 略
externs symbol [...] 略
external-library-path path-element [...] 外部类的路径
file-specs path-element [...] 指定源文件去编译,这默认的是 mxmlc编译器
fonts.languages.language-range lang range 指定 Unicode编码语言的范围
fonts.managers manager-class [...] 字体管理器,默认的是 flash.fonts.JREFontManager,也可以使用 flash.fonts.BatikFontManager
fonts.max-cached-fonts string 在服务器缓存上可以保存的最大字体数
fonts.max-glyphs-per-face string 最大限度的字符缓存
frames.frame label class name [...] 将一系列的类名指定到相应label标记的帧上
generate-frame-loader=true|false 绑定到默认的loader类上。
headless-server=true|false 能否设置编译器的执行头文件,如:System.setProperty(”java.awt.headless”, “true”)
help 帮助
include-libraries library [...] 连接所有的在swc中的类,不管是否有被引用
includes class [...] 引用具体的类,使用此参数
incremental=true|false 增加编辑,默认的是false
keep-generated-actionscript=true|false 保持原有的as,放在 /generated目录下,默认的值是false
language code 设置swf文件的元数据
lazy-init=true|false 预设字母表的编码,默认是false
library-path path-element [...] 连接SWC文件得到swf文件,默认的路径是libs目录和相同目录下的所有swc文件。可以用=替换现在的swc,也可以用+=添加。也可以通过配置文

件(略)。
link-report filename 打印详细的连接报告
load-config filename 指定编译器详细的配置文件,覆盖所有的命令行参数,可以通过+=连接多个配置文件。
load-externs filename [...] 外部足见的动态连接的信息保存(略)
locale string 将路径定位存到locale,就可以通过{local}调用了,如:
mxmlc -locale en_EN -source-path locale/{locale} -file-specs MainApp.mxml
localized-description text lang Swf文件的元数据
namespaces.namespace uri manifest 指定mxml 文件的命名空间,可以用 uri或本地的证明文件。
optimize=true|false 优化as,减少文件大小,增加性能,默认为false
output filename 指定输出文件名字,如果不指定就用当前文件名。如果路径不存在,将会自动生成。
publisher name Swf文件的元数据,发布人的名字
resource-bundle-list filename 打印所有源数据包名字,并打包到一个swc文件中,filename将是这个swc的文件名。
runtime-shared-libraries url [...] 指定一系列运行时共享库,如果library.swf在 web_root/libraries目录下,那你可以使用 libraries/library.swf.来调用。
services filename 指定 services-config.xml文件,该文件用在FDS中
show-binding-warnings=true|false 当flash player不能探测时,显示警告。默认为true
show-actionscript-warnings=true|false 发生as类错误时,发出提示。默认为true。
show-deprecation-warnings=true|false 为flex组件显示不可用。默认为true
source-path path-element [...] 添加源路径的路径或文件,会自动寻找mxml 和as文件。可以使用通配符包含所有的文件和子路径,连接全部的文件,不能单个使用类和路径,

可以使用+=。
strict=true|false 输出为定义的属性和函数,也能执行编译时期类型的验证和提供默认参数。默认为true
theme filename [...] 指定主题数组
title text Swf的元数据
use-network=true|false 指定当前应用程序的网络服务,默认为true.如果设为false就只能访问本地,不能访问网络。
verbose-stacktraces=true|false 默认值为false,只在运行发生错误时候,提供错误显示。
version 编译器的版本号
warn-warning_type=true|false 是否验证自定义警告类型。
warnings=true|false 如果设置false就废除所有的警告,此参数覆盖 warn-warning_typed的值默认为true。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值