<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gaurav&#039;s Blog &#187; RSL</title>
	<atom:link href="http://gauravj.com/blog/tag/rsl/feed/" rel="self" type="application/rss+xml" />
	<link>http://gauravj.com/blog</link>
	<description>Tips and Tools of Flex</description>
	<lastBuildDate>Wed, 28 Mar 2012 17:55:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>RSL enhancements in Hero</title>
		<link>http://gauravj.com/blog/2011/01/rsl-enhancement-in-hero/</link>
		<comments>http://gauravj.com/blog/2011/01/rsl-enhancement-in-hero/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 17:04:13 +0000</pubDate>
		<dc:creator>Gaurav</dc:creator>
				<category><![CDATA[Flex Framework]]></category>
		<category><![CDATA[Flex Tools]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RSL]]></category>

		<guid isPermaLink="false">http://gauravj.com/blog/?p=830</guid>
		<description><![CDATA[<p>While RSLs help to reduce the size for your Flex applications, they can sometimes be tricky to use. So to simplify the usage of RSLs, we made some enhancements in the upcoming Flex SDK release (code-named Hero).</p> <p>These enhancements should provide the following benefits:</p> Applications will only load RSLs that are required Modules (and <span style="color:#777"> . . . &#8594; Read More: <a href="http://gauravj.com/blog/2011/01/rsl-enhancement-in-hero/">RSL enhancements in Hero</a></span>]]></description>
			<content:encoded><![CDATA[<p>While RSLs help to reduce the size for your Flex applications, they can sometimes be tricky to use. So to simplify the usage of RSLs, we made some enhancements in the upcoming Flex SDK release (code-named <a href="http://opensource.adobe.com/wiki/display/flexsdk/Hero">Hero</a>).</p>
<p>These enhancements should provide the following benefits:</p>
<ul>
<li>Applications will only load RSLs that are required</li>
<li>Modules (and sub applications) will use RSLs which are already loaded by the parent application (or module)</li>
<li>Enable sharing of RSLs between modules (and sub applications)</li>
<li>Simply usage of Monkey Patch with Flex RSLs</li>
</ul>
<h3>Only load what&#8217;s needed</h3>
<p>In Flex 4, all RSLs that were listed in the flex-config.xml (at compile time) were loaded by the app when it was launched. But with the Hero release the compiler will remove any RSLs which are not needed by your application. This means that the load time for your app should improve because it won&#8217;t load any extra RSL. The RSLs removed by the compiler will be the placeholder RSLs. This feature is controlled by a new compiler switch called <strong>-remove-unused-rsls</strong> which defaults to true.</p>
<p>Also if you compile your app using the command line compiler, then it will print the names of the RSLs that are needed by your application. The following is an example of compiler output where the app uses 3 out of the 10 RSLs listed in flex-config.xml<br />
<img alt="" src="http://www.gauravj.com/blog/examples/RSLs/RSL_feedback.png" title="RSL_feedback.png" class="aligncenter" width="803" height="72" /></p>
<p>There could be cases where the compiler may remove RSL which is needed by your app (say if you used soft-linking to load classes from a swc). If you run into such a situation then you can override the compiler&#8217;s decision, to remove the RSL, by using the <strong>-force-rsls</strong> compiler switch. This option takes the path of the swcs for which the RSLs should be force loaded.</p>
<h3>Use what&#8217;s already loaded</h3>
<p>Starting with Hero, modules and sub-applications will use the RSLs loaded by the parent app instead of loading a duplicate copy. </p>
<p>When a module or sub-application loads a new RSL, the RSL will be loaded into the default application domain and if this was the placeholder RSL for the parent app then it will be loaded into the parent&#8217;s application domain. Now if the parent app loads another module or sub-app which needs the same RSL then it will be able to use the RSL loaded by previous module or sub app.</p>
<p>The image below is an example of application where the OSMF RSL is removed by the compiler and so it becomes the placeholder RSL for the main app.<br />
<img alt="" src="http://www.gauravj.com/blog/examples/RSLs/placeholder.png" title="placeholder" class="aligncenter" width="269" height="228" /></p>
<p>In the following image, the main app loads a module that uses spark video player. The module needs OSMF RSL so it loads it into the app domain of the parent application because OSMF RSL is a placeholder RSL. The module does not load the Framework or Spark RSLs because those were already loaded by the parent app.<br />
<img alt="" src="http://www.gauravj.com/blog/examples/RSLs/moduleLoadsRSL.png" title="module loads RSL" class="aligncenter" width="269" height="230" /></p>
<p>Now if the main app loads another sub app which needs OSMF RSL, then the sub-app will simply be able to use the OSMF RSL loaded by the module. </p>
<p>You can also specify the application domain where the module should load the RSL. The <strong>-application-domain</strong> compiler option takes the path of the swc and then the name of the application domain. The valid values for application domain  are &#8216;current&#8217;, &#8216;default&#8217;, &#8216;parent&#8217;, or &#8216;top-level&#8217;</p>
<h3>Smaller Framework RSL</h3>
<p>In Hero, we also reduced the size of the framework RSL. This was done by removing all mx components from framework.swc and moving them to a separate swc called mx.swc. So if you are creating pure spark apps then you don&#8217;t need to load any mx classes. </p>
<h3>Monkey Patch RSL</h3>
<p>The only way to use monkey patches with Flex RSLs is to load monkey patched file as RSL itself. But again it was quite tedious to create a monkey patched RSL, so to simplify that a new compiler option (called <strong>-include-inheritance-dependencies-only</strong>) was added. This option can be used when compiling the monkey patched library. This options works with -include-classes flag and it only pulls dependencies which are of type inheritance. An example for usage of this option: </p>
<p><code>bin/compc -include-classes=spark.components.Button -sp=frameworks/projects/spark/src/ -include-inheritance-dependencies-only=true -output=patch.swc</code></p>
<p>In the above example, the output swc will contain spark.components.Button and only it&#8217;s inheritance dependencies. And the library.swf contained in the output swc can be used as an RSL if you were to monkey patch the spark button component.</p>
<p>Most of these changes (except for the -application-domain compiler option) are already available in the latest <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+Hero">Hero preview build</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://gauravj.com/blog/2011/01/rsl-enhancement-in-hero/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Creating smaller swfs (Part III)</title>
		<link>http://gauravj.com/blog/2009/07/creating-smaller-swfs-part-iii/</link>
		<comments>http://gauravj.com/blog/2009/07/creating-smaller-swfs-part-iii/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 19:41:15 +0000</pubDate>
		<dc:creator>Gaurav</dc:creator>
				<category><![CDATA[Flex Framework]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Fonts]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[RSL]]></category>

		<guid isPermaLink="false">http://gauravj.com/blog/?p=376</guid>
		<description><![CDATA[<p>Here is the part three.. </p> <p>The very fact that you are writing applications using Flex proves that you care about user interface. And one of the features of Flex that enables you to provide a better user experience is font embedding. There are many benefits of using embedded fonts but the most important <span style="color:#777"> . . . &#8594; Read More: <a href="http://gauravj.com/blog/2009/07/creating-smaller-swfs-part-iii/">Creating smaller swfs (Part III)</a></span>]]></description>
			<content:encoded><![CDATA[<p>Here is the part three.. </p>
<p>The very fact that you are writing applications using Flex proves that you care about user interface. And one of the features of Flex that enables you to provide a better user experience is font embedding. There are many benefits of using embedded fonts but the most important one is that it provides consistency regarding how the application will appear across different client environments and you don&#8217;t need to make sure whether the font is pre-installed. But there can also be few disadvantages of using embedded fonts, like when you use embedded font it gets stitched into your SWF which results in increasing the overall size of the SWF. </p>
<p>So lets look at how you can reap the benefits of using embedded fonts while still avoiding the start up time cost due to a larger SWF. The trick for doing this is to use Modules (for embedding fonts) and avoid embedding the fonts in the main SWF. That way you can achieve smaller start up time and fetch the fonts when you need to use them.</p>
<p>Here is an example of an application that displays text using four different fonts: </p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Application</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> </span>
<span style="color: #000000;">		layout=<span style="color: #ff0000;">&quot;vertical&quot;</span> width=<span style="color: #ff0000;">&quot;650&quot;</span> height=<span style="color: #ff0000;">&quot;400&quot;</span></span>
<span style="color: #000000;">		verticalAlign=<span style="color: #ff0000;">&quot;middle&quot;</span> horizontalAlign=<span style="color: #ff0000;">&quot;center&quot;</span> </span>
<span style="color: #000000;">		creationComplete=<span style="color: #ff0000;">&quot;creationCompleteHandler(event)&quot;</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #339933;">&lt;mx:Script&gt;</span>
<span style="color: #339933;">		&lt;![CDATA[</span>
<span style="color: #339933;">			import mx.events.ModuleEvent;</span>
<span style="color: #339933;">			import mx.modules.ModuleManager;</span>
<span style="color: #339933;">			import mx.modules.IModuleInfo;</span>
<span style="color: #339933;">			import mx.events.FlexEvent;</span>
<span style="color: #339933;">			import mx.controls.Alert;</span>
<span style="color: #339933;">			import mx.validators.Validator;</span>
<span style="color: #339933;">			private var fontModuleInfo:IModuleInfo;</span>
&nbsp;
<span style="color: #339933;">			protected function button_clickHandler(event:MouseEvent):void {</span>
<span style="color: #339933;">				if(currentState != 'LoggedIn') {</span>
<span style="color: #339933;">					var validators:Array = [];</span>
<span style="color: #339933;">					validators[0] = this.v0;</span>
<span style="color: #339933;">					validators[1] = this.v1;</span>
&nbsp;
<span style="color: #339933;">					var inValid:Array = Validator.validateAll(validators);</span>
<span style="color: #339933;">					if(inValid.length ==0) {</span>
<span style="color: #339933;">						if(tiUserName.text == 'guest' </span>
<span style="color: #339933;">							&amp;&amp; tiPassword.text =='guest') {</span>
<span style="color: #339933;">							currentState = 'LoggedIn';</span>
<span style="color: #339933;">						} else {</span>
<span style="color: #339933;">							Alert.show(&quot;Invalid username&quot; +</span>
<span style="color: #339933;">								&quot; or password.&quot;); </span>
<span style="color: #339933;">						}</span>
<span style="color: #339933;">					}</span>
<span style="color: #339933;">				} else {</span>
<span style="color: #339933;">					currentState = '';</span>
<span style="color: #339933;">				}</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">			protected function creationCompleteHandler(event:FlexEvent):void </span>
<span style="color: #339933;">			{</span>
<span style="color: #339933;">				fontModuleInfo = ModuleManager.getModule(&quot;FontModule.swf&quot;);</span>
<span style="color: #339933;">				fontModuleInfo.addEventListener(ModuleEvent.READY,</span>
<span style="color: #339933;">					readyHandler);</span>
<span style="color: #339933;">				fontModuleInfo.load();</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">			private function readyHandler(event:Event):void {</span>
<span style="color: #339933;">				fontModuleInfo.factory.create();</span>
<span style="color: #339933;">			}</span>
&nbsp;
<span style="color: #339933;">		]]&gt;</span>
<span style="color: #339933;">	&lt;/mx:Script&gt;</span>
&nbsp;
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:StringValidator</span> source=<span style="color: #ff0000;">&quot;{tiUserName}&quot;</span> property=<span style="color: #ff0000;">&quot;text&quot;</span> id=<span style="color: #ff0000;">&quot;v0&quot;</span></span>
<span style="color: #000000;">						required=<span style="color: #ff0000;">&quot;true&quot;</span> maxLength=<span style="color: #ff0000;">&quot;10&quot;</span> </span>
<span style="color: #000000;">						trigger=<span style="color: #ff0000;">&quot;{loginButton}&quot;</span> triggerEvent=<span style="color: #ff0000;">&quot;click&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:StringValidator</span> source=<span style="color: #ff0000;">&quot;{tiPassword}&quot;</span> property=<span style="color: #ff0000;">&quot;text&quot;</span> id=<span style="color: #ff0000;">&quot;v1&quot;</span></span>
<span style="color: #000000;">						required=<span style="color: #ff0000;">&quot;true&quot;</span> maxLength=<span style="color: #ff0000;">&quot;10&quot;</span> </span>
<span style="color: #000000;">						trigger=<span style="color: #ff0000;">&quot;{loginButton}&quot;</span> triggerEvent=<span style="color: #ff0000;">&quot;click&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
&nbsp;
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:states</span><span style="color: #7400FF;">&gt;</span></span>
		<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:State</span> name=<span style="color: #ff0000;">&quot;LoggedIn&quot;</span><span style="color: #7400FF;">&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:RemoveChild</span> target=<span style="color: #ff0000;">&quot;{loginPanel}&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:AddChild</span> relativeTo=<span style="color: #ff0000;">&quot;{loginButton}&quot;</span> position=<span style="color: #ff0000;">&quot;before&quot;</span><span style="color: #7400FF;">&gt;</span></span>
				<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Panel</span> id=<span style="color: #ff0000;">&quot;pnl&quot;</span> title=<span style="color: #ff0000;">&quot;Labels with different fonts. </span>
<span style="color: #000000;">						  Embedded fonts can be rotated.&quot;</span> paddingTop=<span style="color: #ff0000;">&quot;10&quot;</span> </span>
<span style="color: #000000;">						  paddingBottom=<span style="color: #ff0000;">&quot;10&quot;</span> paddingLeft=<span style="color: #ff0000;">&quot;10&quot;</span> paddingRight=<span style="color: #ff0000;">&quot;10&quot;</span><span style="color: #7400FF;">&gt;</span></span>
					<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> id=<span style="color: #ff0000;">&quot;lblVerdana&quot;</span> </span>
<span style="color: #000000;">						  styleName=<span style="color: #ff0000;">&quot;myVerdanaDescriptor&quot;</span> rotation=<span style="color: #ff0000;">&quot;1&quot;</span>  </span>
<span style="color: #000000;">						  text=<span style="color: #ff0000;">&quot;The quick brown fox jumps over the lazy dog.&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
					<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> id=<span style="color: #ff0000;">&quot;lblCandara&quot;</span> </span>
<span style="color: #000000;">						  styleName=<span style="color: #ff0000;">&quot;myCandaraDescriptor&quot;</span> rotation=<span style="color: #ff0000;">&quot;1&quot;</span></span>
<span style="color: #000000;">						  text=<span style="color: #ff0000;">&quot;The quick brown fox jumps over the lazy dog.&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
					<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> id=<span style="color: #ff0000;">&quot;lblVrinda&quot;</span> </span>
<span style="color: #000000;">						  styleName=<span style="color: #ff0000;">&quot;myVrindaDescriptor&quot;</span> rotation=<span style="color: #ff0000;">&quot;1&quot;</span></span>
<span style="color: #000000;">						  text=<span style="color: #ff0000;">&quot;The quick brown fox jumps over the lazy dog.&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
					<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Label</span> id=<span style="color: #ff0000;">&quot;lblMinion&quot;</span> </span>
<span style="color: #000000;">						  styleName=<span style="color: #ff0000;">&quot;myMinionDescriptor&quot;</span> rotation=<span style="color: #ff0000;">&quot;1&quot;</span></span>
<span style="color: #000000;">						  text=<span style="color: #ff0000;">&quot;The quick brown fox jumps over the lazy dog.&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
				<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Panel</span><span style="color: #7400FF;">&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:AddChild</span><span style="color: #7400FF;">&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:SetProperty</span> target=<span style="color: #ff0000;">&quot;{loginButton}&quot;</span> </span>
<span style="color: #000000;">							name=<span style="color: #ff0000;">&quot;label&quot;</span> value=<span style="color: #ff0000;">&quot;Log Out&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
		<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:State</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:states</span><span style="color: #7400FF;">&gt;</span></span>
&nbsp;
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Panel</span> id=<span style="color: #ff0000;">&quot;loginPanel&quot;</span> </span>
<span style="color: #000000;">			  title=<span style="color: #ff0000;">&quot;Login&quot;</span>  borderAlpha=<span style="color: #ff0000;">&quot;0.15&quot;</span></span>
<span style="color: #000000;">			  horizontalScrollPolicy=<span style="color: #ff0000;">&quot;off&quot;</span> verticalScrollPolicy=<span style="color: #ff0000;">&quot;off&quot;</span><span style="color: #7400FF;">&gt;</span></span>
&nbsp;
		<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Form</span> id=<span style="color: #ff0000;">&quot;loginForm&quot;</span> <span style="color: #7400FF;">&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:FormItem</span> label=<span style="color: #ff0000;">&quot;Username:&quot;</span><span style="color: #7400FF;">&gt;</span></span>
				<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:TextInput</span> id=<span style="color: #ff0000;">&quot;tiUserName&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:FormItem</span><span style="color: #7400FF;">&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:FormItem</span> label=<span style="color: #ff0000;">&quot;Password:&quot;</span><span style="color: #7400FF;">&gt;</span></span>
				<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:TextInput</span> id=<span style="color: #ff0000;">&quot;tiPassword&quot;</span> </span>
<span style="color: #000000;">							  displayAsPassword=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #7400FF;">/&gt;</span></span>
			<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:FormItem</span><span style="color: #7400FF;">&gt;</span></span>
		<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Form</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Panel</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Button</span> label=<span style="color: #ff0000;">&quot;Login&quot;</span> id=<span style="color: #ff0000;">&quot;loginButton&quot;</span> </span>
<span style="color: #000000;">			   click=<span style="color: #ff0000;">&quot;button_clickHandler(event)&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Application</span><span style="color: #7400FF;">&gt;</span></span></pre></div></div>

</blockquote>
<p>And here is the module (FontModule.mxml) used to embed fonts:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;">&lt;?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Module</span> xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span><span style="color: #7400FF;">&gt;</span></span>
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;mx:Style</span><span style="color: #7400FF;">&gt;</span></span>
		@font-face {
			src:url(&quot;verdana.TTF&quot;);
			fontFamily: myVerdana;
		}
&nbsp;
		.myVerdanaDescriptor
		{
			fontFamily: myVerdana;
			color: red;
			fontSize: 24;
		}
&nbsp;
		@font-face {
			src:url(&quot;MinionPro-Regular.otf&quot;);
			fontFamily: myMinion;
		}
&nbsp;
		.myMinionDescriptor
		{
			fontFamily: myMinion;
			color: green;
			fontSize: 24;
		}
&nbsp;
		@font-face {
			src:url(&quot;Vrinda.ttf&quot;);
			fontFamily: myVrinda;
		}
&nbsp;
		.myVrindaDescriptor
		{
			fontFamily: myVrinda;
			color: red;
			fontSize: 24;
		}
&nbsp;
		@font-face {
			src:url(&quot;CANDARA.TTF&quot;);
			fontFamily: myCandara;
		}
&nbsp;
		.myCandaraDescriptor
		{
			fontFamily: myCandara;
			color: green;
			fontSize: 24;
		}
	<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Style</span><span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;"><span style="color: #7400FF;">&lt;/mx:Module</span><span style="color: #7400FF;">&gt;</span></span></pre></div></div>

</blockquote>
<p>Below is the running sample, to log in <strong>use &#8220;guest&#8221; as user name and password</strong> and click on the button.<br />
<center><br />
<iframe src ="http://gauravj.com/blog/examples/Modules/Fonts/Sample.html" width="650" height="400"></p>
<p>Your browser does not support iframes.</p>
<p></iframe><br />
</center></p>
<p>The size benefits:</p>
<table border="1">
<tr>
<th>Configuration</th>
<th>Swf size</th>
<th>Comments</th>
</tr>
<tr>
<td>If fonts are embedded in main swf</td>
<td>607 KB</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>If fonts are fonts embedded in module</td>
<td>267 KB</td>
<td>The font Module is 354 KB</td>
</tr>
<tr>
<td>If fonts are fonts embedded in module and main app uses default SDK RSLs. (as is the case with the above example)</td>
<td>84 KB</td>
<td>This app was compiled with Flex 4 beta build. With a more recent Flex 4 build there should be increased benefits for swf size reduction.</td>
</tr>
</table>
<p>So we trimmed the SWF by 86% for this sample.</p>
<p>The above approach works if you don&#8217;t need embedded fonts right at the application start up. In the above example the font module is loaded after the main app is initialized, as we don&#8217;t need to show text using embedded fonts on the log in screen. This way the user experiences a reduced start up time and you can still use the fonts you like <img src='http://gauravj.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>If you app uses multiple fonts and some of them are not required at the application start up, consider embedding fonts in a module.</p>
]]></content:encoded>
			<wfw:commentRss>http://gauravj.com/blog/2009/07/creating-smaller-swfs-part-iii/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Creating smaller swfs (Part II)</title>
		<link>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-ii/</link>
		<comments>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-ii/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 04:00:51 +0000</pubDate>
		<dc:creator>Gaurav</dc:creator>
				<category><![CDATA[Flex Framework]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[MXML]]></category>
		<category><![CDATA[RSL]]></category>

		<guid isPermaLink="false">http://gauravj.com/blog/?p=149</guid>
		<description><![CDATA[<p>Here is the &#8220;Part II&#8221; of creating smaller swfs. In case you haven&#8217;t checked out the &#8220;Part I&#8221;, it can be found here: Creating smaller swfs (Part I). In this post, let&#8217;s focus on modules and how they can help in reducing the swf size.</p> What are Modules? <p>Modules are Flex swf files that <span style="color:#777"> . . . &#8594; Read More: <a href="http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-ii/">Creating smaller swfs (Part II)</a></span>]]></description>
			<content:encoded><![CDATA[<p>Here is the &#8220;Part II&#8221; of creating smaller swfs. In case you haven&#8217;t checked out the &#8220;Part I&#8221;, it can be found here: <font color="#AAAAFF"><strong><em><a href="http://gauravj.com/blog/?p=20">Creating smaller swfs (Part I)</a></em></strong></font>.  In this post, let&#8217;s focus on modules and how they can help in reducing the swf size.</p>
<h2>What are Modules?</h2>
<p>Modules are Flex swf files that can be <em>dynamically</em> loaded by other swf files. So they allow you to break your large application into smaller pieces and gives you the flexibility to load the the required piece when/if required. In case you are wondering &#8220;How is Module different than RSL (since RSL can also be a swf and can be loaded by your application)&#8221;, the difference is that RSLs can <em><strong>only</strong></em> be loaded in frame 1 (i.e before your application initializes) but Modules can be loaded and unloaded <em><strong>whenever you want</strong></em> (after your application initializes) through out the life cycle of your application. Also note that you can not run modules independently, they always need to be loaded by another application. Benefits of modules are much more than just helping you to make your swf smaller, some of the benefits are:</p>
<ul>
<li><em>Improve start up time</em> by reducing the swf size.</li>
<li><em>Improves development time</em> because modules allows for code separation and can be independently compiled. So you can break you app into different functional pieces and have different developers/teams work on the different pieces as Modules.</li>
<li><em>Improves build time</em> because you need not recompile your entire application if changes are made to an independent module.</li>
<li><em>Improves integration</em> where you can&#8217;t upgrade all your code to the most recent version of Flex.</li>
</ul>
<h2>How to write Modules?</h2>
<p>You can write a module either using ActionScript or MXML. If your module is going to use any part of the Flex framework code then you must write a module based on mx.modules.Module. In case your module is <strong><em>not</em></strong>  going to use any part of the Flex framework code then you can write a module based on mx.modules.ModuleBase but then you must write it using ActionScript.</p>
<p>Here is an example of a module written using MXML (DataGridModule.mxml):</p>
<blockquote><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
		   width="400" height="300" creationComplete="module1_creationCompleteHandler(event)"&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.controls.Alert;
			import mx.rpc.events.FaultEvent;
			import mx.events.FlexEvent;

			protected function module1_creationCompleteHandler(event:FlexEvent):void
			{
				srv.send();
			}

			protected function srv_faultHandler(event:FaultEvent):void
			{
				Alert.show("Can not retrieve data");
			}
		]]&gt;
	&lt;/mx:Script&gt;

	&lt;mx:HTTPService id="srv" url="catalog.xml" fault="srv_faultHandler(event)" /&gt;

	&lt;mx:DataGrid dataProvider="{srv.lastResult.report.account}" width="100%" height="100%"&gt;
		&lt;mx:columns&gt;
			&lt;mx:DataGridColumn dataField="month" headerText="Month"/&gt;
			&lt;mx:DataGridColumn dataField="sales" headerText="Sales" textAlign="right"/&gt;
			&lt;mx:DataGridColumn dataField="expenses" headerText="Expenses" textAlign="right"/&gt;
		&lt;/mx:columns&gt;
	&lt;/mx:DataGrid&gt;
&lt;/mx:Module&gt;
</code></pre>
</blockquote>
<p>As you can see the only thing special about the above code is the wrapping &lt;mx:Module&gt; tag, otherwise it looks pretty similar to a custom component (You can simply replace &lt;mx:Module&gt;, with say &lt;mx:VBox&gt; or &lt;mx:HBox&gt; and use it as a custom component)</p>
<p>The following is an example of a Module using ActionScript (ActionModule.as) which extends mx.modules.ModuleBase:</p>
<blockquote><pre><code>package
{
	import mx.modules.ModuleBase;

	public class ActionModule extends ModuleBase
	{
		public function ActionModule()
		{
			super();
		}

		public function calculateAverageProfit(arr:Array): String
		{
			var profit:Number = 0;

			for(var counter:int = 0; counter < arr.length; counter++)
			{
				var obj:Object = arr[counter];
				profit += obj.sales - obj.expenses;
			}

			return new Number(profit/arr.length).toFixed(2);
		}
	}
}</code></pre>
</blockquote>
<p>Since the above module (ActionModule.as) is for calculation purpose only, it doesn't depend upon any framework code and hence can extend from mx.modules.ModuleBase instead of mx.modules.Module</p>
<h2>How to use Modules?</h2>
<p>So now you probably have some idea about writing the modules, once you write the Modules, there are two techniques to load them into your application. </p>
<ol>
<li>Use ModuleLoader</li>
<li>Use ModuleManager and IModuleInfo</li>
</ol>
<p>Following is an example of an app which loads Module(s) (using both the techniques):</p>
<blockquote><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
creationComplete="srv.send();"&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.modules.IModuleInfo;
			import mx.modules.ModuleManager;
			import mx.events.ModuleEvent;
			import mx.collections.ArrayCollection;
			import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;
			import mx.rpc.events.FaultEvent;
			import mx.events.FlexEvent;

			private var result:ArrayCollection;

			private var moduleInfo:IModuleInfo;

			private var obj:Object;

			protected function srv_faultHandler(event:FaultEvent):void
			{
				Alert.show("Can not retrieve data");
			}
			protected function modLoader_errorHandler(event:ModuleEvent):void
			{
				Alert.show("Error in loading the Module.");
			}

			protected function srv_resultHandler(event:ResultEvent):void
			{
				result = event.result.report.account;
				linechart.dataProvider = result;
			}

			protected function showDataGrid_clickHandler(event:MouseEvent):void
			{
				modLoader.url = "DataGridModule.swf";
			}

			protected function showProfit_clickHandler(event:MouseEvent):void
			{
				moduleInfo = ModuleManager.getModule("ActionModule.swf");
				moduleInfo.addEventListener(ModuleEvent.READY, readyHandler);
				moduleInfo.addEventListener(ModuleEvent.ERROR, modLoader_errorHandler);
				moduleInfo.load();
			}

			private function readyHandler(event:ModuleEvent):void
			{
				obj = moduleInfo.factory.create();
				profitLbl.text = "Average Profit: $" + obj.calculateAverageProfit(result.source)
                                                 + " (in millions)";
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:HTTPService id="srv" url="catalog.xml" fault="srv_faultHandler(event)"
                         result="srv_resultHandler(event)"/&gt;

	&lt;mx:LineChart id="linechart" color="0x323232" height="50%" showDataTips="true" &gt;
		&lt;mx:horizontalAxis&gt;
			&lt;mx:CategoryAxis categoryField="month"/&gt;
		&lt;/mx:horizontalAxis&gt;
		&lt;mx:series&gt;
			&lt;mx:LineSeries yField="sales" form="curve" displayName="Sales"/&gt;
			&lt;mx:LineSeries yField="expenses" form="curve" displayName="Expenses"/&gt;
		&lt;/mx:series&gt;
	&lt;/mx:LineChart&gt;
	&lt;mx:Legend dataProvider="{linechart}" color="0x323232"/&gt;
	&lt;mx:Label id="profitLbl" /&gt;
	&lt;mx:Button id="showProfit" click="showProfit_clickHandler(event)"
                 label="Show Average Profit"/&gt;
	&lt;mx:Button id="showDataGrid" click="showDataGrid_clickHandler(event)"
                 label="Show Details"/&gt;

	&lt;mx:ModuleLoader id="modLoader" error="modLoader_errorHandler(event)" /&gt;
&lt;/mx:Application&gt;
</code></pre>
</blockquote>
<p>In the above example the DataGridModule.swf is loaded using &lt;mx:ModuleManager/&gt;, the load is invoked when the url property is set (modLoder.url ="DataGridModule.swf"), which fires the urlChange event. Also you can invoke the load operation using the loadModule() method of ModuleLoader.  You can unload a module using the unloadModule() method.</p>
<p>The ActionModule.swf is loaded using ModuleManager and IModuleInfo, ModuleManager is used to get a reference to the IModuleInfo for ActionModule.swf and the actual load is invoked using the load() method on IModuleInfo.   </p>
<p>Notice that both techniques allow you to add a error handler (see modLoader_errorHandler() which takes event of type ModuleEvent), a error handler can be helpful to debug issue with module loading. Also there are other event types that you can use to find info related to loading (ModuleEvent.PROGRESS, ModuleEvent.READY, ModuleEvent.SETUP)</p>
<p>Here is the running swf. When you press on the button to "Show Average Profit", it loads the ActionModule.swf (which calculates the average profit). When you press on "Show Details", it loads the data grid module which shows the data in a datagrid.</p>
<p><center><br />
<iframe src ="http://gauravj.com/blog/examples/Modules/Dashboard.html" width="500" height="700"></p>
<p>Your browser does not support iframes.</p>
<p></iframe><br />
</center></p>
<p>Now for the size benefits:</p>
<table border="1">
<tr>
<th>Configuration</th>
<th>Swf size</th>
<th>Comments</th>
</tr>
<tr>
<td>Without Modules and RSLs</td>
<td>484 KB</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>With Modules</td>
<td>415 KB</td>
<td>In this case the benefit is small because we moved only a small portion of code into the module. Reduction in swf size depends upon the amount of code you move into modules. Expect higher benefits for large applications.</td>
</tr>
<tr>
<td>With Modules and RSLs</td>
<td>159 KB</td>
<td>This app was compiled with Flex 4 beta build. With a more recent Flex 4 build there should be increased benefits for swf size reduction.</td>
</tr>
</table>
<h2>Optimizing Modules</h2>
<p>So far you have seen how to use modules and how they can help to reduce the swf size. But when you compile a module swf, lot of core classes of the Flex framework (which are dependencies of mx.modules.Module) also get stitched into the module swf file, this creates a situation where you duplicate the same classes into your application (once in the main app and then in each module which is loaded by the app). However there is a compiler option to avoid this situation. You can compile you main app with the <strong>-link-report</strong> option, it will give you the link-report (a report that has the information regarding the byte code linkage) for your application. Then you can compile your module(s) with the <strong>-load-externs</strong> option and you can point the load-externs to the generated link report from the compilation of the main app. Its like telling the compiler that you already have taken care of classes which are in the link report, so don't add those to the module swf file.</p>
<p>Here are the example command I used:</p>
<p># compile main app - this will generate the main app swf and a link report named myLinkReport.xml<br />
./mxmlc -link-report=myLinkReport.xml Dashboard.mxml</p>
<p># compile module<br />
./mxmlc -load-externs=myLinkReport.xml DataGridModule.mxml</p>
<p>Or you can also use Flex/Flash Builder to set up the module optimization. You can do this via the project properties. Here are the steps:</p>
<ol>
<li>Right Click on the project and go to properties</li>
<li>Choose Flex Modules</li>
<p><img src="http://www.gauravj.com/blog/examples/Modules/modulesDialog.jpg" /><br />
You can see the modules in this dialog and whether they are being optimized or not. You can add new modules using the "Add" button.</p>
<li>Edit setting using the edit button or double click on the module</li>
<p><img src="http://www.gauravj.com/blog/examples/Modules/editModule.jpg" /><br />
Using this dialog, you can choose whether to optimize(and for which application) or not
</ol>
<p>The <strong>only situation</strong> where you should <strong>not</strong> optimize your modules is when you want to use your modules in different applications. Because optimized modules can only be used with application for which they were optimized.</p>
<h2>Shared Code problem</h2>
<p>When modules are loaded, the classes that are contained in the module are added into the child domain of the current application domain. So classes that are part of the module are owned by the module and not be the application. This can create an issue when two modules are using the same classes. When the first module has loaded, its class definitions gets registered, and module loaded after wards finds itself in a situation where the class definition that it contains doesn't matches with what is already registered. This usually creates issue with the manager classes like HistoryManager, PopUpManager etc. The error usually is a "Type Coercion" error, for example:</p>
<blockquote><p><strong>Type Coercion failed:</strong> cannot convert mx.managers::PopUpManagerImpl@ to mx.managers.IPopUpManager</p></blockquote>
<p>The solution is to make these classes part of the main app (so the main app is the owner of these class definitions and both managers can share them). If you simply add the import and variable declaration to the script block of the main app, you can avoid the issue with the classes that cause shared code problem</p>
<blockquote><p><code>import  mx.managers.HistoryManager;<br />
private var managerObj: HistoryManager;</code></p></blockquote>
<p>Alternatively you can also refactor code into a shared module and load the shared module <strong>before</strong> loading any other module.</p>
<h2>Modules and RSLs</h2>
<p>Using both modules are RSLs can significantly reduce swf size and start-up time. But if your app is using RSL (say for framework.swc) then your module swf does not need to use framework.swc as RSL. In such cases the library that will be loaded as RSL by the main app should just be in the external-library-path of the module. </p>
<p>This way since the RSL will already be loaded by the main app and available for consumption, for the module, the module will further save on load time because it won't even try to load the RSL (btw since the RSL is already loaded by the main app, the module will get it quickly get it from the cache so the saving per module is small but can add up if you are using lots of modules)</p>
<p>There is a bug (see <a href="http://bugs.adobe.com/jira/browse/FB-15470">FB-15470</a>) related to this in Flex Builder 3. The fix for the bug will be available in Flash Builder 4</p>
<p>So if you are using FB 3, here is how you can do this manually:<br />
You should move the modules into a seperate Flex Builder project and not list the libraries as rsls (instead just as -external-library-path for the libraries). That way the modules won't try to reload the rsls (because they would have already been loaded by the main app (for the project containing the main app you can continue to have the libraries listed as rsls)) </p>
]]></content:encoded>
			<wfw:commentRss>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-ii/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Creating smaller swfs (Part I)</title>
		<link>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-i/</link>
		<comments>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-i/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 05:12:27 +0000</pubDate>
		<dc:creator>Gaurav</dc:creator>
				<category><![CDATA[Flex Framework]]></category>
		<category><![CDATA[examples]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RSL]]></category>

		<guid isPermaLink="false">http://gauravj.com/blog/?p=20</guid>
		<description><![CDATA[<p>Is swf size a major concern for you? Do you want to reduce the start up time for your applications?</p> <p>If yes, read on..</p> What&#8217;s in the swf? <p>If you think your swf is bigger than you expect, it would be helpful to know what&#8217;s in your swf. When you compile your swf, the <span style="color:#777"> . . . &#8594; Read More: <a href="http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-i/">Creating smaller swfs (Part I)</a></span>]]></description>
			<content:encoded><![CDATA[<p>Is swf size a major concern for you? Do you want to reduce the start up time for your applications?</p>
<p>If yes, read on..</p>
<h2>What&#8217;s in the swf?</h2>
<p>If you think your swf is bigger than you expect, it would be helpful to know what&#8217;s in your swf. When you compile your swf, the flex swc(s) are in the library-path, and so when your app uses a flex component it gets linked into your swf file. Not just that, any component on which the component your app uses depends will also get linked into your swf. So if you use a mx.controls.Button in your app, your swf will have the ABC (ActionScript Byte Code) for Button and also the ABC for classes that are used by mx.controls.Button (like mx.core.UIComponent etc.). So as you write your app the more components you use, the bigger your swf gets. Also in addition to the byte code, if you use embedded fonts or images that adds to the swf size.</p>
<p>Also MXML is a convenience feature, so while it speed up the development time, it also adds to your swf size as compared to a pure action script application. To see how much code the compiler generates in the background for your mxml files, try compiling with the <strong>-keep</strong> flag.</p>
<h2>How to create smaller swfs?</h2>
<p>Your really want to create rich beautiful application and leverage the components provided by Flex, so stripping down the components from your apps is not a viable option. But there are few other options that you can consider:</p>
<ul>
Leverage the player cache by using RSLs<br />
Break your app into Modules<br />
Embed fonts into Modules<br />
Load assets at Runtime
</ul>
<p>To make it easier to digest, I will cover each of the above in separate posts. So for now lets look at the 1st  option (&#8220;Leverage the player cache by using RSLs&#8221;) which gives the most bang for the buck.</p>
<h2>What is RSL?</h2>
<p>RSL (abbreviation for Runtime shared libraries) are libraries that you can preload (a Flex application has 2 frames and the RSLs get loaded in frame 1) before loading you application.  But the real benefit of RSLs is not that you can preload them, but that the RSLs get cached and when cached they need not be re-downloaded. The runtime shared libraries were added to the Flex SDK starting from Flex 3 and can be found under &lt;sdk folder&gt;/frameworks/rsls folder. The RSLs come in two flavors signed (*.swz) and unsigned (*.swf). The RSLs can be signed by Adobe only, so you can not sign your custom RSLs.</p>
<p>One major difference between the signed and unsigned RSLs is the caching mechanism. The unsigned RSLs are cached in the browser cache and will get cleared when the browser cache is cleared, but the signed RSLs is cached directly by the flash player and it doesn&#8217;t get cleared when the browser&#8217;s cache is cleared. This is really really important and it implies, that if your users have the signed RSLs in their player&#8217;s cache then they don&#8217;t need to download it again. Its like the RSLs becomes part of the player.</p>
<h2>How to use the RSLs?</h2>
<p>In order to use the rsls for you applications, you need to do two things:</p>
<ul>
1. Compile your app with the <em>-runtime-shared-library-path</em> option<br />
2. Deploy the rsls as per the location specified in the rsl-url
</ul>
<p>The -runtime-shared-library-path has the following format:<br />
<em><font color="#AAAAFF"><br />
-runtime-shared-library-path [path-element] [rsl-url] [policy-file-url]</font><br />
</em></p>
<p>where<br />
<em><font color="#AAAAFF"><br />
[path-element]</font></em> is the location of the swc for which you want to use the rsl.<br />
<em><font color="#AAAAFF"><br />
[rsl-url]</font></em> is the url from which the rsl will be loaded. This can be absolute url or it can be relative path to your swf.<br />
<em><font color="#AAAAFF"><br />
[policy-file-url]</font></em> url for the crossdomain.xml &#8211; in case the rsl is being loaded from a different domain. </p>
<p>Here is an example for compiling an app using framework.swc as rsl:</p>
<blockquote><p>
<font color="#AAAAFF"><br />
./mxmlc -runtime-shared-library-path=&lt;sdk-root&gt;/frameworks/libs/framework.swc,framework_4.0.0.7217.swz myapp.mxml</font>
</p></blockquote>
<p>in the above example there is no policy-file-url because the rsl location is same as the application swf. And in this case the rsl need to be present in the same directory as the swf file.</p>
<p>Another way of doing this is to use setting from flex-config.xml. The rsl configuration is present in the flex-config.xml it looks like: </p>
<blockquote><p>
<font color="#AAAAFF"><br />
&lt;!&#8211; runtime-shared-library-path: specifies a SWC or directory to link against and an RSL URL to load with optional failover URLs &#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;   &lt;runtime-shared-library-path&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      &lt;path-element&gt;libs/framework.swc&lt;/path-element&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      &lt;rsl-url&gt;framework_3.2.0.3958.swz&lt;/rsl-url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      &lt;policy-file-url&gt;&lt;/policy-file-url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      &lt;rsl-url&gt;framework_3.2.0.3958.swf&lt;/rsl-url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      &lt;policy-file-url&gt;&lt;/policy-file-url&gt;<br />
&nbsp;&nbsp;&nbsp;   &lt;/runtime-shared-library-path&gt;<br />
   &lt;!&#8211; static-link-runtime-shared-libraries: statically link the libraries specified by the -runtime-shared-libraries-path option.&#8211;&gt;<br />
&nbsp;&nbsp;&nbsp;   &lt;static-link-runtime-shared-libraries&gt;true&lt;/static-link-runtime-shared-libraries&gt;<br />
</font>
</p></blockquote>
<p>Above is an example from from the flex 3.2 build (3.2.0.3958). If you rely on the setting from flex-config.xml, then you need to make sure that the rsl is deployed to the location (rsl-url) specified in the flex-config.xml (in the above example it is required in the same location as the swf). And you need to make sure that static-link-runtime-libraries is set to false (as against to the default (true) in the flex-config.xml). So you can simple compile using:</p>
<blockquote><p>
<font color="#AAAAFF"><br />
./mxmlc -static-link-runtime-shared-libraries=false myapp.mxml</font>
</p></blockquote>
<p>Or you can also use Flex/Flash Builder to do the job. You can configure your application via the project properties to use RSLs. Here are the steps:</p>
<ul>
1. Right Click on the project and go to properties<br />
2. Choose the build path and select the tab for Library Path<br />
3. Expand the library that you want to use as RSL and go to the link type.<br />
<img src="http://www.gauravj.com/blog/examples/RSLs/buildPath.JPG" /></p>
<p>4. Double click on the link type to open the library path dialog.<br />
5. From the drop down choose linkage as &#8220;Runtime shared Library&#8221; (you may have to unselect the checkbox to enable the drop down)<br />
<img src="http://www.gauravj.com/blog/examples/RSLs/libraryPath.JPG" /></p>
<p>6. The list in the library path dialog contains the rsl-url(s) in the order in which the app will try to look for the RSLs<br />
7. You can add new by clicking on the &#8220;Add&#8221; button which will open up the RSL url dialog<br />
<img src="http://www.gauravj.com/blog/examples/RSLs/rslPath.JPG" /></p>
<p>8. Also you can perform other operations (&#8220;Edit/Remove existing or change the <del datetime="2009-06-17T17:12:02+00:00"> look-up</del>RSL load order using Up/Down buttons).
</ul>
<p>It may look a bit complex (if you are looking at RSLs for the first time) but it actually is quite simple (I promise)</p>
<h2>What do my users need to do?</h2>
<p>Nothing. Really nothing !! <del datetime="2009-06-17T17:12:02+00:00">(As long as they have flash player 9.0.115 or above).</del><br />
If you setup for signed rsl <strong>only</strong> then your users will need flash player 9.0.115 or above. But if you set up an unsigned rsl as a fall back url (to the signed rsl) then nothing required at all.</p>
<p>BTW, the penetration for Flex framework RSL is already pretty high. </p>
<p>For example, if you can see the application below you already have the signed rsls cached for the Flex SDK 4 build. </p>
<p><center><br />
<iframe src ="http://gauravj.com/blog/examples/RSLs/HelloWorld.html" width="200" height="200"></p>
<p>Your browser does not support iframes.</p>
<p></iframe><br />
</center></p>
<p>The simple (tiny) app above is 210 K when the libraries are linked in, but reduces to 68 K with the RSLs. So for a medium size app you can easily save 500+ K just by using framework.swc as an RSL.</p>
<p>And the flex-config.xml that I used to build the app can be found <a href="http://gauravj.com/blog/examples/RSLs/flex-config.xml">here</a> and the RSLs are hosted by Adobe. So if you are using Flash Builder beta build, feel free to use this flex-config.xml and build you app using the hosted RSLs.</p>
<h2>What next?</h2>
<p>Play with the RSL feature (if you haven&#8217;t already) and if you are using Flex 4 beta you should try the Adobe hosted RSL (the flex-config.xml you can use is present <a href="http://www.gauravj.com/blog/examples/RSLs/flex-config.xml">here</a>)</p>
<p>If you face any issues feel free to log bugs at http://bugs.adobe.com/flex or feel free to drop comments here (but logging bug is a better option).</p>
]]></content:encoded>
			<wfw:commentRss>http://gauravj.com/blog/2009/06/creating-smaller-swfs-part-i/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

