{"id":2134,"date":"2014-09-22T16:59:57","date_gmt":"2014-09-22T20:59:57","guid":{"rendered":"https:\/\/www.tmurgent.com\/TMBlog\/?p=2134"},"modified":"2014-09-22T21:23:07","modified_gmt":"2014-09-23T01:23:07","slug":"on-streaming-and-formats-in-app-v","status":"publish","type":"post","link":"https:\/\/www.tmurgent.com\/TmBlog\/?p=2134","title":{"rendered":"On Streaming and Formats in App-V"},"content":{"rendered":"<h1><span style=\"color: #333399; font-size: 150%;\"><b>On Streaming and Formats in App-V<\/b><\/span><\/h1>\n<p><span style=\"color: #333399;\"><b>Tim Mangan<br \/>\nTMurgent Technologies, LLP<br \/>\nSeptember 22, 2014<br \/>\nRelated Product:\u00a0 App-V 5.0 SP2 HF5 and prior<\/b><\/span><\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/www.tmurgent.com\/TmBlog\/wp-content\/uploads\/2014\/10\/Streaming.jpg\" align=\"left\" \/>When we created the original application virtualization product, SoftGrid, streaming was a very important part of the implementation.\u00a0 Over the years, the streaming aspect has become less important to implementations, while remaining important to the decision makers that choose application virtualization with App-V.\u00a0 What some may not realize is how App-V 5 changed how streaming is done from the previously generation product.\u00a0 This document identifies the differences and suggests that in most cases, streaming should not play such a large role in the decision to virtualize.<\/p>\n<h2>Historical Roots<\/h2>\n<p>Softricity, which created the original version of App-V called SoftGrid, was born out of another company called SoftwareWow.\u00a0 SoftwareWow focused on Application Streaming for delivery of the applications, but did not virtualize the applications.\u00a0 I joined SoftwareWow in 1999 due to my background as an expert in developing network protocols.<\/p>\n<p>When we made the change to Softricity to build SoftGrid, streaming remained as one of the core properties of the product value.\u00a0 We led discussions with customers based on three tenants: Centralized Delivery, Streaming, and Virtualization:<\/p>\n<ul>\n<li>Back then, most software was manually installed by an IT Admin.\u00a0 We didn\u2019t have SCCM or use other Electronic Delivery Systems, with the exception of some home-grown scripting.\u00a0 Install once and deliver globally was a great value proposition to the enterprise.<\/li>\n<li>Because of our streaming background, delivery via streaming was important to us.\u00a0 And we found that customers reacted extremely well to the streaming.\u00a0 If they remembered nothing else of what the sales person told them, they remembered the demo.\u00a0 The user doesn\u2019t have the app, a shortcut appears, they launch the app and just the portions needed stream over and the app launches quickly.\u00a0 Most competitors also implemented and featured streaming, with the exception of ThinStall (later known as ThinApp), which focused solely on the virtualization feature.<\/li>\n<li>Solving application conflict, especially \u201cDLL hell\u201d, and allowing multiple versions of the same application simultaneously.<\/li>\n<\/ul>\n<h2>What is Streaming?<\/h2>\n<p>But what is \u201cstreaming\u201d?\u00a0 When viewed from the standpoint of the receiver (the virtualization client software), streaming is acting on the contents of the source (the virtual package) before receiving the entire contents. \u00a0In the case of App-V the entire contents refers to the entire App-V package file.<\/p>\n<p>The concept of dynamic application delivery is more appealing when the dynamic delivery is fast.\u00a0 While we can always suggest faster disks, faster networks, and faster processors, streaming is quite appealing as it allows for a more immediate consumption of the application.\u00a0 Of course, in reality we usually aim to get the entire package pre-cached by pre-deploying the package before the user even asks for it.<\/p>\n<p>This streaming is implemented differently in the original implementation (SoftGrid and App-V prior to 5.0) and in 5.0.\u00a0 But in both cases, the streaming is implemented with an understanding that the Windows file system supports the consuming of files based on 4k file boundaries.<\/p>\n<h1>Streaming Prior to 5.0<\/h1>\n<p>Streaming with SoftGrid, and App-V prior to version 5.0, was implemented based on in two ways.<\/p>\n<p>First of these was the development of a streaming source file format.\u00a0 Internally known as the \u201cJigsaw format\u201d, the base file format of the SFT package file included a division of internal files based on 4k file blocks, to mimic how Windows pages executable files from the local disk when running applications.\u00a0 This file format, along with the file system drivers implemented at the client, allowed for the client to request individual blocks on demand.\u00a0 For efficiency, the format actually packaged multiple of these blocks into a delivery chunk, and the chunk could be individually compressed for improved storage and delivery.\u00a0 Originally there were 8 blocks (32kb before compression) in a chunk by default, and later 16 block chunks were used.<\/p>\n<p>Second, the Jigsaw format allowed for customization of the layout of chunks within the file to optimize delivery.\u00a0 We focused on optimizing the initial launch of the application, defining a \u201cFeature Block\u201d that would contain only those blocks needed to start the application.\u00a0 This allowed for the client to make a single efficient request for the data, and because this feature block was stored contiguously on the disk, it made reading of the block when stored on rotating media more efficient also.<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/www.tmurgent.com\/TmBlog\/wp-content\/uploads\/2014\/10\/AppV4.png\" width=\"600\" \/><\/p>\n<p>As a side note, we originally implemented two \u201cfeature blocks\u201d, the first (FB1) containing the blocks to start the application, and the second (FB2) which held the remainder of the contents, which normally would be requested individually by the client on demand.\u00a0 But our plans called for implementing additional feature blocks eventually.\u00a0 We believed that we could monitor package use of FB2 at the client in order to define additional feature blocks that contained contents needed for a particular feature (such as the \u201cmail merge\u201d feature in Word).\u00a0 So while never implemented, the idea was that we could have multiple of these feature blocks defined in the file format, with the final block being used as FB2 was currently used.<\/p>\n<p>The package metadata included a listing of file offsets against the overall Sft file.\u00a0 So if the application requested the bytes from the range 0 to 4k of DataFile2, this would be known to the client as part of Chunk N+1, which would be downloaded and decompressed if not present at the client.<\/p>\n<p>This streaming could have been implemented using complete files, which is how Citrix Streaming was implemented.<\/p>\n<p>SoftGrid and App-V before 5.0 also used an external XML file to control the virtual application and streaming process.\u00a0 The OSD was actually a very early attempt at logically defining a software package for publishing purposes.\u00a0 Originally proposed by Microsoft and Marimba in the mid-1990s, the proposal to the IETF went nowhere and was then abandoned until we picked it up and extended it for application virtualization when we built SoftGrid.\u00a0 As we will see in App-V 5, the idea of a common file format to define a software package is of interest today by many technologies.<\/p>\n<h2>Streaming in 5.0<\/h2>\n<p>App-V 5.0 uses a different format to define the package.\u00a0 See <a href=\"https:\/\/blogs.technet.com\/b\/gladiatormsft\/archive\/2014\/09\/20\/app-v-5-on-app-v-package-modernization-with-the-opc-open-package-container-or-one-package-container-to-rule-them-all.aspx\">https:\/\/blogs.technet.com\/b\/gladiatormsft\/archive\/2014\/09\/20\/app-v-5-on-app-v-package-modernization-with-the-opc-open-package-container-or-one-package-container-to-rule-them-all.aspx<\/a>\u00a0for a blog post introducing the format used.<\/p>\n<p>This format is rooted in the Open Packaging Conventions (OPC) of ISO 29500-2 (<a href=\"https:\/\/www.iso.org\/iso\/iso_catalogue\/catalogue_tc\/catalogue_detail.htm?csnumber=51459\">https:\/\/www.iso.org\/iso\/iso_catalogue\/catalogue_tc\/catalogue_detail.htm?csnumber=51459<\/a>), which is the basis of formats for Microsoft Open Office (<a href=\"https:\/\/msdn.microsoft.com\/en-us\/magazine\/cc163372.aspx\">https:\/\/msdn.microsoft.com\/en-us\/magazine\/cc163372.aspx<\/a>), AppX, the package format for \u201cModern\u201d applications (<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/apps\/hh464929(v=VS.85).aspx\">https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/apps\/hh464929(v=VS.85).aspx<\/a>), and App-V (not yet formally documented).\u00a0 In addition to sharing a base of ISO 29500-2 with these other formats, App-V leverages some of the XML formats used in AppX.<\/p>\n<p>OPC defines a flexible container format to encapsulate a \u201cpackage\u201d that contains multiple items.\u00a0 For the Open Office format, the container can represent a Word or Excel document, for example.\u00a0 For AppX, the container would represent an application.\u00a0 For App-V, the container represents a package of virtual applications.<\/p>\n<p>OPC allows for use of the Zip format for the overall container.\u00a0 Zip was originally defined by PKWare, but they made the format public in 1989 (<a href=\"https:\/\/www.pkware.com\/documents\/casestudies\/APPNOTE.TXT\">https:\/\/www.pkware.com\/documents\/casestudies\/APPNOTE.TXT<\/a>).\u00a0 OPC specifies a subset of the ZIP format for usage, and imposes a number of restrictions on options that specifically may not be used.<\/p>\n<p>The ZIP format consists of a header (located near the end of the file), a central directory, and a number of records.\u00a0 The central directory provides the list of files, and for each file the offsets compressed into which records.\u00a0 Each record is up to 64KB (pre-compressed) of an individual file. In addition to the compressed data, the record contains the full file name, attributes, and extended attributes.\u00a0 Although App-V could have added its own extended attributes as part of the record,<\/p>\n<p>OPC mandates the 64-bit extensions to zip, and that only the \u201cdeflate\u201d protocol may be used for the compression. There are also a number of other restrictions, such as allowable file-names, and a prohibition to encrypting files (you could include a file that was externally encrypted, but if you use the ZIP encryption you need to get a license from PKWare).<\/p>\n<p>OPC also defines, but does not require, one specially named folder in the archive (_rels).\u00a0 This folder contains xml files defining relationships.\u00a0 App-V does not make use of this optional part of the OPC.<\/p>\n<h3>Content Types<\/h3>\n<p>OPC defines some particular files, which generally are optional.\u00a0 One required file is the \u201c[ContentTypes].xml\u201d file.\u00a0 The ContentTypes file defines how every file should be interpreted based on the file extension or filename.\u00a0 This xml file consists of \u201cDefault\u201d elements that map each of the file extensions found in the file to a file type and subtype, and \u201cOverride\u201d elements that map specific files.<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"623\"><span style=\"font-size: 80%;\">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;&lt;Types xmlns=&#8221;https:\/\/schemas.openxmlformats.org\/package\/2006\/content-types&#8221;&gt;<\/span><span style=\"font-size: 80%;\">&lt;Default Extension=&#8221;dat&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;dll&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;HxS&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;hxc&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;hxt&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;hxk&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xml&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;rll&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;XLL&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;XLAM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xltx&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;IDX_DLL&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;XLS&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;XLSX&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CHM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;DOC&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;txt&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xsn&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;EXE&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;GRA&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;FLT&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;EPS&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;GIF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;JPG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;PNG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;WPG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ADM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;odc&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;INI&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ICO&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;TTF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CNT&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;HLP&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;manifest&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;HTM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;PPT&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;XLA&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CNV&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;DIC&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;MSG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;trx_dll&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;msi&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ONE&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;onepkg&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;H&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ECF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;FAE&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CFG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;HOL&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;SAM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;OFT&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;POTX&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ACL&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;LNG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;LEX&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;dub&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;SCM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CSS&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;OPG&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;dotx&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ITS&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xsl&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;tlb&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;rdlc&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xap&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;config&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;xrm-ms&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;mui&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;TTC&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;OCX&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ORP&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;PSP&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;chr&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;SHP&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;INF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ELM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;OLB&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;man&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CAB&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;eftx&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;thmx&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ODF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;pri&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;propdesc&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;gpd&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;cat&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;MOF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;WAV&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;kic&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;CPL&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;msp&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;WMF&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;MID&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;BMP&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;BDR&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;ICM&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;PUB&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;POC&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<br \/>\n&lt;Default Extension=&#8221;DPV&#8221; ContentType=&#8221;appv\/vfs-file&#8221; \/&gt;<\/span><br \/>\n<span style=\"font-size: 80%;\"><br \/>\n&lt;Override PartName=&#8221;\/AppxManifest.xml&#8221; ContentType=&#8221;application\/vnd.ms-appx.manifest+xml&#8221; \/&gt;<br \/>\n&lt;Override PartName=&#8221;\/AppxBlockMap.xml&#8221; ContentType=&#8221;application\/vnd.ms-appx.blockmap+xml&#8221; \/&gt;<\/span><br \/>\n<span style=\"font-size: 80%;\"><br \/>\n&lt;\/Types&gt;<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Although I am unsure if the [ContentTypes].xml file is actually used by the App-V client, the sequencer does product such a file as part of the package, which would be necessary to claim compliance with the format.\u00a0 As shown in the example (from the virtual Microsoft Office 2013 package), there are only two \u201coverride\u201d elements:<\/p>\n<ul>\n<li>AppXManifest mapped to \u201capplication\/vnd.ms-appx.manifest+xml\u201d.<\/li>\n<li>AppXBlockMap mapped to \u201capplication\/vnd.ms-appx.blockmap+xml\u201d.<\/li>\n<\/ul>\n<p>All of the remaining file extensions contained in the package are mapped to a general \u201cappv\/vfs-file\u201d file type and subtype. \u00a0\u00a0In this case, vfs means that it is a file in the package and does not specify PVAD versus VFS. \u00a0This default types includes the xml extension which covers the remaining xml metadata files located above the \u201croot\u201d folder.<\/p>\n<h3>AppXBlockMap<\/h3>\n<p>The AppXBlockMap file contains information for each file in the zip archive which appears to be more about file verification.\u00a0 Each file element in this xml has the uncompressed file size, and logical file header size, plus a sub-elements for each of the zip records.\u00a0 The sub-element indicates the uncompressed size of the block, and a calculated hash for the block. Given that this information is largely discoverable via the central directory with the exception of the calculated hash, it seems reasonable to assume that this is used as an extra level of verification used in AppX and borrowed by App-V.<\/p>\n<h3>AppXManifest<\/h3>\n<p>The AppXManifest is an extended version of what AppX uses to define applications.\u00a0 App-V adds to the syntax defined by AppX to add virtualization specific information.\u00a0 A subset of the AppXManifest file is produced external to the package by the sequencer in the form of the DeploymentConfig.xml and UserConfig.xml files.\u00a0 It is part of the metadata required by the client, but not part of the streaming format.<\/p>\n<h3>StreamMap<\/h3>\n<p>The StreamMap.XML file is what defines the feature blocks of App-V 5.\u00a0 In App-V 5, there are three feature blocks, the first two of which are roughly equivalent to FB1 of the old system.<\/p>\n<ul>\n<li><b>Primary Block:\u00a0 <\/b>This block includes all file (parts) of the archive that are necessary to add the package to the client during \u201cadd-appvclientpackage\u201d.\u00a0 Certain required files (those above the \u201croot\u201d folder) are assumed and not listed but are automatically brought in by the client.<b><\/b><\/li>\n<li><b>Publishing Block:<\/b> This block includes file parts needed for publishing.\u00a0 This will include portions of each application exe (even if not launched, the client needs the file header brought down), the icon files (for the shortcuts to look right), and any file parts launched during streaming configuration.<b><\/b><\/li>\n<\/ul>\n<p>The files listed may contain sub-elements listing the blocks involved (the entire file is needed when no block elements are recorded).\u00a0 These block elements consist of a starting block number, and the number of blocks needed.\u00a0 The block number refers to which compressed block of the file (1 through N).<\/p>\n<p>The remaining files and file parts are part of the third (unnamed) feature block and are streamed on demand.<\/p>\n<p>If during streaming configuration in the sequencer, you select the checkbox to \u201cForce application(s) to be fully downloaded before launching\u201d then the StreamMap will consists of only a PrimaryBlock with an indication for full loading.<\/p>\n<h3>FileSystemMetaData<\/h3>\n<p>According to the Zip format, the central directory may contain records for both folders and files.\u00a0 OPC, and App-V, only record files in the central directory.\u00a0 The file names provide the relative path information, allowing the client to be able to extrapolate the folder objects needed in the Cache.<\/p>\n<p>Unless there is a folder in your App-V package that contains no files.\u00a0 While I am unsure that OPC prohibits the inclusion of directory objects in the zip central directory (the specification is a little fuzzy about that), it is not something that the Open Office Format would expect.\u00a0 So the designers of the App-V file format chose to create a special XML file to hold this and other special file-system data.<\/p>\n<p>The FileSystemMetaData file contains two types of XML elements.\u00a0 The first lists the path for all \u201cempty\u201d folders.\u00a0 This is why you don\u2019t see any empty folders if you just open the AppV file using a standard zip utility (which is unaware of the special purpose of the FileSystemMetaData file).<\/p>\n<p>The second element type is for defining \u201copaque\u201d folders.\u00a0 These are folders (whether empty or not) that are marked OverrideLocal in the virtual file-system editor.\u00a0 This setting could have been added as a special attribute to a folder object in the zip archive central directory, if folders had been added.<\/p>\n<p>A potentially missing element in this file would be folder \u201cdeletion markers\u201d.\u00a0 Just as registry keys and registry items can be deleted while sequencing and recorded, potentially folders and files deleted while sequencing could have been recorded.\u00a0 App-V 4.* had deletion markers for both the registry and the file systems, while App-V 5 supports only registry system deletion markers.\u00a0 I am unsure why this was skipped, but honestly I can\u2019t (currently) think of an application where I require that feature.<\/p>\n<h2>Summary<\/h2>\n<p>Streaming is alive and well in App-V 5, but do you really care?\u00a0 I say that streaming is important, but configuration of the streaming in a package is often irrelevant.<\/p>\n<p>Most App-V implementations do not require streaming configuration.\u00a0 It only affects the first time use of the application package by the user.\u00a0 The addition of \u201cbackground streaming\u201d in recent years makes real-time \u201cfault streaming\u201d a rare event.<\/p>\n<p>For most App-V environments, you either want to configuring the streaming by launching nothing (because you are using the App-V Server for publishing in a semi-persistent environment like XenApp), or use the checkbox (because you are using SCCM with BITS, aka \u201cdownload and run\u201d for delivery).<\/p>\n<p>Streaming is important in non-persistent VDI, although you typically enable Shared Content Store Mode, so streaming configuration is irrelevant (everything is fault-streamed without caching).<\/p>\n<h1>References<\/h1>\n<p>Other Authorities<\/p>\n<p>https:\/\/blogs.technet.com\/b\/gladiatormsft\/archive\/2014\/09\/20\/app-v-5-on-app-v-package-modernization-with-the-opc-open-package-container-or-one-package-container-to-rule-them-all.aspx&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 3<\/p>\n<p>https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/apps\/hh464929(v=VS.85).aspx&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 3<\/p>\n<p>https:\/\/msdn.microsoft.com\/en-us\/magazine\/cc163372.aspx&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 3<\/p>\n<p>https:\/\/www.iso.org\/iso\/iso_catalogue\/catalogue_tc\/catalogue_detail.htm?csnumber=51459&#8230;&#8230;&#8230;&#8230; 3<\/p>\n<p>https:\/\/www.pkware.com\/documents\/casestudies\/APPNOTE.TXT&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 3<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On Streaming and Formats in App-V Tim Mangan TMurgent Technologies, LLP September 22, 2014 Related Product:\u00a0 App-V 5.0 SP2 HF5 and prior When we created the original application virtualization product, SoftGrid, streaming was a very important part of the implementation.\u00a0 Over the years, the streaming aspect has become less important to implementations, while remaining important&hellip; <a class=\"more-link\" href=\"https:\/\/www.tmurgent.com\/TmBlog\/?p=2134\">Continue reading <span class=\"screen-reader-text\">On Streaming and Formats in App-V<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[35,47],"tags":[4,31],"class_list":["post-2134","post","type-post","status-publish","format-standard","hentry","category-appv4","category-appv5","tag-app-v","tag-appv5","entry"],"_links":{"self":[{"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/posts\/2134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2134"}],"version-history":[{"count":7,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/posts\/2134\/revisions"}],"predecessor-version":[{"id":2140,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=\/wp\/v2\/posts\/2134\/revisions\/2140"}],"wp:attachment":[{"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tmurgent.com\/TmBlog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}