共用方式為


建立 Windows 通用 OEM 套件

Windows IoT 核心版 1709 支援 Windows 通用 OEM 封裝標準。

這個新的封裝架構是建置成在未來與更多裝置類型相容。 如果您已使用舊版封裝標準 (pkg.xml) 為 IoT 核心版裝置建置套件,而且您想要在 IoT 裝置上使用它們,您可以將 它們轉換成新的封裝標準

套件

套件是用來建立 IoT 核心版映射的邏輯建置組塊。

  • 您新增的所有專案都已封裝。 您新增至裝置的每個驅動程式、程式庫、登錄設定、系統檔案和自訂都會包含在套件中。 每個專案的內容和位置都會列在套件定義檔中, (*.wm.xml) 。
  • 信任的合作夥伴可以更新套件。 您的裝置上的每個套件都會由您或受信任的合作夥伴簽署。 這可讓 OEM、ODM、開發人員和 Microsoft 共同合作,協助將安全性和功能更新傳遞給您的裝置,而不需要彼此的工作進行自訂。
  • 套件已建立版本。 這有助於讓更新更容易,並讓系統還原更可靠。

範例套件檔案 (sample_pkg.cab) 包含套件定義檔案、應用程式、驅動程式和檔案等套件內容,以及簽章檔案和版本號碼

套件分為三個主要類別:

  • OS 套件套件 包含核心 Windows 作業系統
  • SoC 廠商預建套件 包含支援晶片組的驅動程式和韌體
  • OEM 套件 包含裝置特定的驅動程式和自訂

瞭解如何將這些套件合併為裝置的映射。

從建立新的空白套件開始

  1. 安裝適用于 Windows 10 版本 1709 的 Windows ADK,以及取得自訂 Windows IoT 核心版實驗室 1a 所需的工具:建立基本映射中所述的其他工具和測試憑證。

  2. 使用文字編輯器建立新的套件定義檔, (也稱為 Windows 資訊清單檔案,) 根據下列範本。 使用 wm.xml 副檔名儲存檔案。

    <?xml version='1.0' encoding='utf-8' standalone='yes'?>
    <identity
      xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      name="MediaService"
      namespace="Media"
      owner="OEM"
      >
    </identity>
    
  3. 建立空白套件檔案 (*.cab) 。 建立的檔案名是以檔案的擁有者、命名空間和名稱為基礎。

    c:\oemsample>pkggen myPackage.wm.xml /universalbsp
    
    Directory of c:\oemsample
    
    04/03/2017  05:56 PM    <DIR>          .
    04/03/2017  05:56 PM    <DIR>          ..
    04/03/2017  05:43 PM               333 myPackage.wm.xml
    04/03/2017  05:56 PM             8,239 OEM-Media-MediaService.cab
    

將內容新增至套件

封裝的內容會組織成封裝定義檔中的 XML 元素清單。

下列範例示範如何將一些檔案和登錄設定新增至套件。 此範例會定義變數 (_RELEASEDIR) ,可在每次產生封裝時更新。

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<identity
    xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="MediaService"
    namespace="Media"
    owner="OEM"    
    >
  <files>
    <file source="$(_RELEASEDIR)\MediaService.dll"/>
  </files>
  <regKeys>
    <regKey keyName="$(hklm.software)\OEMName\MediaService">
      <regValue
          name="StringValue"
          type="REG_SZ"
          value="MediaService"
          />
      <regValue
          name="DWordValue"
          type="REG_DWORD"
          value="0x00000020"
          />
    </regKey>
  </regKeys>
</identity>

執行pkggen.exe工具

PkgGen.exe [project] /universalbsp ...

  [project]··········· Full path to input file : .wm.xml, .pkg.xml, .man
                       Values:<Free Text> Default=NULL

  [universalbsp]······ Convert wm.xml BSP package to cab
                       Values:<true | false> Default=False

  [variables]········· Additional variables used in the project file,syntax:<name>=<value>;<name>=<value>;....
                       Values:<Free Text> Default=NULL

  [cpu]··············· CPU type. Values: (x86|arm|arm64|amd64)
                       Values:<Free Text> Default="arm"

  [languages]········· Supported language identifier list, separated by ';'
                       Values:<Free Text> Default=NULL

  [version]··········· Version string in the form of <major>.<minor>.<qfe>.<build>
                       Values:<Free Text> Default="1.0.0.0"

  [output]············ Output directory for the CAB(s).
                       Values:<Free Text> Default="CurrentDir"

範例:

c:\oemsample>pkggen myPackage.wm.xml /universalbsp /variables:"_RELEASEDIR=c:\release"

新增驅動程式元件

在套件定義檔案中,使用 驅動程式 元素來插入驅動程式。 我們建議使用相對路徑,因為它是描述 INF 來源路徑的最簡單方式。

  <drivers>
    <driver>
      <inf source="$(_RELEASEDIR)\Media.inf"/>
    </driver>
  </drivers>

如果預設檔案匯入路徑不等於 INF 來源路徑,您可以使用 defaultImportPath 屬性。 在下列範例中,INF 位於目前的目錄中,但要匯入的檔案會相對於 $ (_RELEASEDIR) 。

  <drivers>
    <driver defaultImportPath="$(_RELEASEDIR)">
      <inf source="Media.inf"/>
    </driver>
  </drivers>

如果要匯入的檔案與 INF 中定義檔案的方式不相關,則可以套用檔案覆寫。 不建議這麼做,但適用于特殊案例。

  <drivers>
    <driver>
      <inf source="Media.inf"/>
      <files>
         <file name="mdr.sys" source="$(_RELEASEDIR)\path1\mdr.sys" />
         <file name="mdr.dll" source="$(_RELEASEDIR)\path2\mdr.dll" />
      </files>
    </driver>
  </drivers>

新增服務元件

在封裝定義檔中,使用 service 元素 (及其子專案和屬性) 來定義和封裝系統服務。

   <service
      dependOnService="AudioSrv;AccountProvSvc"
      description="@%SystemRoot%\system32\MediaService.dll,-201"
      displayName="@%SystemRoot%\system32\MediaService.dll,-200"
      errorControl="normal"
      imagePath="%SystemRoot%\system32\svchost.exe -k netsvcs"
      name="MediaService"
      objectName="LocalSystem"
      requiredPrivileges="SeChangeNotifyPrivilege,SeCreateGlobalPrivilege"
      sidType="unrestricted"
      start="delayedAuto"
      startAfterInstall="none"
      type="win32UserShareProcess"
      >

建置和篩選 WOW 套件

若要建置客體或 WOW 套件, (32 位套件在 64 位裝置上執行,) 將 buildWow=「true」 屬性新增至 myPackage.wm.wml

<identity
    xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="MediaService"
    namespace="Media"
    owner="OEM"
    buildWow="true"
    >

執行 PkgGen.exe,現在會為每個主機套件產生一個 WOW 套件。

04/05/2017  07:59 AM            11,870 OEM-Media-MediaService.cab
04/05/2017  07:59 AM            10,021 OEM-Media-MediaService_Wow_arm64.arm.cab

一般而言,64 位裝置會取得其主機 64 位套件及其客體 32 位或 WOW 套件,這兩者都是從 myPackage.wm.xml 產生。 若要避免兩個套件之間的資源衝突,請使用 組建篩選器

  <regKeys buildFilter="not build.isWow and build.arch = arm" >
    <regKey keyName="$(hklm.software)\OEMName\MediaService">
      <regValue
          name="StringValue"
          type="REG_SZ"
          value="MediaService"
          />
    </regKey>

在此情況下,登錄機碼專屬於 Host 32 位 Arm 套件。 CPU 參數可用來設定 build.arch,而 build.isWow 會在建置 32 位主機套件時由 PkgGen 設定為 false,然後在建置 32 位客體或 WOW 套件時為 true。

[cpu]··············· CPU type. Values: (x86|arm|arm64|amd64)
                     Values:<Free Text> Default="arm"

轉換 Windows 通用 OEM 套件

如果您已使用pkg.xml封裝模型建立套件,而且想要在 Windows IoT 核心版 1709 上使用套件,則必須重新建立套件,或使用 pkggen.exe 工具加以轉換。

轉換套件之後,您可能需要修改wm.xml檔案,以確定它遵循 架構

IoT 核心版附加元件 v4.x 支援新的 Windows 通用 OEM 套件標準 (wm.xml) 。 這個新的封裝架構是建置成在未來與更多裝置類型相容。

轉換套件檔案

若要將以舊版手機封裝格式 (pkg.xml) 建立的現有套件轉換為新的wm.xml格式:

pkggen.exe "filename.pkg.xml" /convert:pkg2wm

或者,從 IoTCoreShell 提示字元,使用 convertpkg 或 buildpkg 進行轉換。 輸出wm.xml檔案會儲存至相同的資料夾。

convertpkg.cmd MyPackage.pkg.xml
buildpkg.cmd MyPackage.pkg.xml

使用 buildpkg 檢閱並測試wm.xml套件。

buildpkg.cmd MyPackage.wm.xml

將檔案轉換成wm.xml格式之後,可以放心地刪除pkg.xml檔案。

重新產生您的應用程式套件

使用具有相同元件名稱的 newAppxPkg。 這會重新產生customizations.xml檔案。 appx 的版本號碼會保留為 ppkg 的版本號碼。

newAppxPkg "C:\DefaultApp\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test.appx" fga Appx.MyUWPApp

深入瞭解: 新增應用程式

新增檔案:watch零大小的檔案、相對路徑

wm.xml不支援零大小的檔案。 若要解決此問題,請在檔案中新增空白空間,使其成為非零大小的檔案。

路徑:當您在目前目錄中新增檔案時,您必須明確地將 .\ 前置詞新增至檔案名。

<BinaryPartition ImageSource=".\uefi.mbn" />

深入瞭解: 新增檔案

更新布建套件customization.xml檔案

在 ADK 1709 版中,您必須更新customizations.xml檔案:

在您的 product\prov 資料夾中,手動將 Common/ApplicationManagement 移至 Common/Policies/ApplicationManagement

    <Customizations>
      <Common>
        <Policies>
          <ApplicationManagement>
            <AllowAppStoreAutoUpdate>Allowed</AllowAppStoreAutoUpdate>
            <AllowAllTrustedApps>Yes</AllowAllTrustedApps>
          </ApplicationManagement>

布建套件 (PPKG) 現在支援類似套件版本設定的四部分版本設定。 因此,這項變更為 1.19 > 1.2 版。 舊版使用字元型排序,因此 1.19 版被視為早于 1.2。

深入瞭解: 新增布建檔案