Windows 유니버설 OEM 패키지 만들기

Windows 유니버설 OEM 패키징 표준은 Windows IoT Core 버전 1709에서 지원됩니다.

이 새로운 패키징 스키마는 나중에 더 많은 유형의 디바이스와 호환될 수 있도록 빌드되었습니다. 레거시 패키징 표준(pkg.xml)을 사용하여 IoT Core 디바이스용 패키지를 빌드했으며 IoT 디바이스에서 사용하려는 경우 새 패키징 표준으로 변환할수 있습니다.

패키지

패키지는 IoT Core 이미지를 만드는 데 사용되는 논리적 구성 요소입니다.

  • 추가하는 모든 것이 패키지됩니다. 디바이스에 추가하는 모든 드라이버, 라이브러리, 레지스트리 설정, 시스템 파일 및 사용자 지정은 패키지에 포함됩니다. 각 항목의 내용과 위치는 패키지 정의 파일(*.wm.xml)에 나열됩니다.
  • 신뢰할 수 있는 파트너가 패키지를 업데이트할 수 있습니다. 디바이스의 모든 패키지는 사용자 또는 신뢰할 수 있는 파트너가 서명합니다. 이렇게 하면 OEM, ODM, 개발자 및 Microsoft가 함께 작동하여 서로의 작업을 방해하지 않고도 디바이스에 보안 및 기능 업데이트를 제공할 수 있습니다.
  • 패키지의 버전은 입니다. 이렇게 하면 업데이트가 더 쉬워지고 시스템 복원의 안정성이 높아집니다.

A sample package file (sample_pkg.cab) includes a package definition file, package contents like apps, drivers, and files, plus a signature file and a version number

패키지는 다음 세 가지 주요 범주로 나뉩니다.

  • OS 키트 패키지에는 핵심 Windows 운영 체제가 포함되어 있습니다.
  • SoC 공급업체 미리 구성된 패키지에는 칩셋을 지원하는 드라이버 및 펌웨어가 포함되어 있습니다.
  • OEM 패키지에는 디바이스별 드라이버 및 사용자 지정이 포함되어 있습니다.

이러한 패키지를 디바이스용 이미지로 결합하는 방법에 대해 알아봅니다.

비어 있는 새 패키지를 만들어 시작합니다.

  1. Windows 10, 버전 1709용 Windows ADK 및 IoT Core 및 랩 1a를사용자 Windows 지정하는 데 필요한 도구 얻기: 기본 이미지 만들기에 설명된 다른 도구 및 테스트 인증서를 설치합니다.

  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
      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 패키지(64비트 디바이스에서 실행할 32비트 패키지)를 빌드하려면 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>

이 경우 레지스트리 키는 호스트 32비트 ARM 패키지에만 해당됩니다. CPU 스위치는 build.arch를 설정하는 데 사용되며, 32비트 호스트 패키지를 빌드할 때 pkgGen에서 build.isWow를 false로 설정한 다음, 32비트 게스트 또는 WOW 패키지를 빌드할 때 true로 설정됩니다.

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

Windows 유니버설 OEM 패키지 변환

pkg.xml 패키징 모델을 사용하여 패키지를 만들고 Windows IoT Core 버전 1709에서 사용하려는 경우 패키지를 다시 만들거나 pkggen.exe 도구를 사용하여 변환해야 합니다.

패키지를 변환한 후 wm.xml 파일을 수정하여 스키마를따르는지 확인해야 할 수 있습니다.

IoT Core 추가 기능 v4.x는 새로운 Windows wm.xml(유니버설 OEM 패키지 표준) 을 지원합니다. 이 새로운 패키징 스키마는 나중에 더 많은 유형의 디바이스와 호환될 수 있도록 빌드되었습니다.

패키지 파일 변환

레거시 휴대폰 패키징 형식(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

자세한 정보: 앱 추가.

파일 추가: 크기가 0인 파일, 상대 경로에 주의

크기가 0인 파일은 wm.xml 지원되지 않습니다. 이 작업을 수행하려면 파일에 빈 공간을 추가하여 크기가 0이 아닌 파일로 만듭니다.

경로: 현재 디렉터리에 있는 파일을 추가할 때 파일 ’’ 이름에 .\ 접두사 를 명시적으로 추가해야 합니다.

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

자세한 정보: 파일 추가

프로비전 패키지 customization.xml 파일 업데이트

ADK 버전 1709에서는 ’’ 파일을 업데이트해야 합니다.

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 이전 버전으로 간주되었습니다.

자세한 정보: 프로비전 파일 추가