/apparat

A framework to optmize ABC, SWC and SWF files.

Primary LanguageScalaGNU Lesser General Public License v2.1LGPL-2.1

Apparat
http://apparat.googlecode.com/

Apparat is a framework to work with ABC, SWC and SWF files. You can use the core framework
to build scripted applications that modify the content of a SWF file or use any of the
predefined available tools.

All tools will show their usage information if you omit any parameters. Apparat tries to make
use of an advanced compression with 7-Zip. If Apparat can find 7-Zip on your PATH it will use
it to compress your content.
To test if 7-Zip is available you should simply enter "7z" on Windows or "7za" on Linux/OS X
in the command line.

- Apparat Shell

  The shell is a tool to spawn Apparat only once and keep it running. Since it is a Java 
  application you will save JVM startup time and the overhead to allocate threadpools when
  running Apparat. 
  
  The shell has been created to work asynchronous with multiple requests so any number
  of applications and requests can run simoultaneously.
  
  All predefined tools can be executed from the shell just like from the command line.
  
- Concrete
  
  The Concrete tool allows you to speficy abstract methods and check at compile time
  if they are overriden. To mark a method abstract you add the [Abstract] metadata to it.
  
  When compiling your project you need to keep this metadata. This is done by specifying
  "-keep-as3-metadata=Abstract" as a compiler argument.

  Concrete takes one parameter "-i" which is the list of input files. You will need to include
  all SWC or SWF files that have been used to compile this project. This means even for
  a simple project you have to specify playerglobal.swc for instance since it is used to
  compile your project.
  
  To seperate multiple libraries use your systems path separator character. This is ";" on 
  Windows machines and ":" on Mac OS X or Linux.
  
  Example (Windows):
    concrete -i test.swf;C:\path\to\playerglobal.swc
	
  Example (Linux/OS X):
	concrete -i test.swf:/path/to/playerglobal.swc

- Coverage

  With the Coverage tool you can insert coverage information into your code. Apparat assumes
  that a class "apparat.coverage.Coverage" exists or is provided at runtime.
  
  An example of the Coverage class can look like this:
  
  package apparat.coverage {
    public final class Coverage {
	  public static function onSample(file: String, line: int): void {
	    trace("Touched line", line, "in", file);
	  }
	}
  }
  
  To run coverage you specify an input file with the "-i" parameter and an optional output file
  with the "-o" parameter.
  
  You can add multiple source-paths in the "-s" parameter. The tool will instrument only files
  that are also on the source-path. Like the Concrete tool you can chain multiple paths with 
  the path separator of your operating system.
  
  Example:
    coverage -i input.swf -o output.swf -s C:\path\to\as3\source

- Dump

  This tool can be used to generate detailed information of a given file.
  
  Specify the input with the "-i" parameter. An optional directory can be given with the "-o"
  parameter. Dump will output all files in this directory which is by default the directory
  of the given input file.
  
  If you speficy the "-swf" parameter the tag information of the file is exported. If you
  speficy the "-uml" parameter a UML graph for the given file is generated in DOT format. This
  format can be opened with OmniGraffle in OS X or you can transform it to an image or SVG
  with Graphviz.
  
  If you spefiy the "-abc" parameter, dump will output detailed ABC information. If "-abc" is 
  specified you can also change the way how methods are written. "-bc raw" will show raw bytes,
  "-bc cfg" will output methods a s control flow graphs in DOT format. "-bc default" will use
  Apparat's default bytecode representation.
  
- Reducer

  You can use reducer for advanced compression of your SWF files. Reducer tries to compress
  embedded PNG graphics. You can leverage this option also with the ActionScript compiler
  by specifing "[Embed(src=..., compress=true)]". However to speedup compilation you can ignore
  the compress parameter and let Reducer do the job since it makes use of multicore 
  architectures.
  
  "-i" specifies the input file, "-o" an optional output file. "-q" specifies the JPEG 
  compression level. "-q 1.0" is maximum quality, "-q 0.0" is minimum quality. You will get
  also good compression results for "-q 1.0". "-d" speficies the strength of the Flash Players
  internal deblocking filter.

  Example:
    reducer -i input.swf -o output.swf -q 0.96	  

- Stripper

  This tool removes all debug information from a SWF file. It is a type-safe removal keeping
  side-effects. This means a loop like this
  
  while(iter.hasNext) { trace(iter.next()) }
  
  Would be rewritten like
  
  while(iter.hasNext) { iter.next() }
  
  Stripper removes also all debug releated bytecode.
  
  Example:
    stripper -i input.swf -o output.swf
	stripper -i inputAndOutput.swc
	
- Turbo Diesel Sport Injection

  The TDSI tool performs various bytecode transformations. Besides specific transformations the
  application will always try to do certain peephole optimizations. Most of them will fix
  problems with older ActionScript compiler versions.
  
  -f [true|false]
  If you specify the "-f" argument TDSI will try to fix certain problems with files generated
  by the Alchemy compiler. This transformation will only affect code generated from C/C++ 
  sources. This option defaults to false. The best way to optimize an Alchemy file with TDSI
  is by calling "tdsi -i input.swc -o output.swc -f true -a false -e false -m false".
  
  This transformation is by default turned off.
  
  -a [true|false]
  This option will inline Alchemy operations from ActionScript. If you use the Memory class 
  provided by the apparat-ersatz library those operations will be replaced with fast Alchemy
  op codes. More information is available at http://code.google.com/p/apparat/wiki/MemoryPool
  
  This transformation is by default turned on.

  -e [true|false]
  Perform inline expansion. If your class extends the apparat.inline.Inline class all its static
  methods will be inlined when called. Those methods may not contain exceptions and must
  be static.
  
  This transformation is by default turned on.
  
  -m [true|false]
  Whether or not to enable macro expansion. Macros are like a type-safe copy and paste that 
  happens at compile time. More information is available here:
  http://code.google.com/p/apparat/wiki/MemoryPool
  
  Example:
    Perform alchemy-, inline- and macroexpansion
    tdsi -i input.swf -o output.swf
	
	Optimize a SWC generated by Alchemy
	tdsi -i input.swc -o output.swc -f true -a false -e false -m false
	
	Optimize a SWC generated by Alchemy will all other features turned on
	tdsi -i input.swc -o output.swc -f