Lab 1g: Erstellen eines verkaufsfähigen Images

Wir werden die erforderlichen Schritte zum Erstellen eines Retail-Windows IoT Core-Images ausführen und auf ein konkretes Hardwaregerät flashen.

Voraussetzungen/Anforderungen

Stellen Sie sicher, dass Sie ein Basisimage in Erstellen eines Basisimages erstellt haben, sowie alle vorherigen Labs abgeschlossen haben.

Die folgenden Tools müssen installiert sein, um diesen Abschnitt abzuschließen:

  • Ein Retail-Codesignaturzertifikat
  • Ein Cross-Signaturzertifikat
  • Visual Studio
  • Windows Assessment and Deployment Kit (Windows ADK)
  • IoT Core PowerShell-Umgebung
  • Ein Texteditor wie Editor oder VS Code

Ändern von Projektkonfigurationsdateien

Führen Sie die folgenden Schritte aus, um benutzerdefinierte Anwendungen oder Bereitstellungspakete hinzuzufügen, die Sie dem Retail-Image hinzufügen möchten.

  1. Um eine benutzerdefinierte Anwendung hinzuzufügen, sollten Sie den Anweisungen folgen, die in Hinzufügen einer App zu einem Image aufgeführt sind. Sie würden jedoch Retail anstatt des Test-Befehls angeben, wenn Sie den Add-IoTProductFeature-Befehl ausführen, wie hier gezeigt:
Add-IoTProductFeature ProductX Retail APPX_HELLOWORLDAPP -OEM
or addfid ProductX Retail APPX_HELLOWORLDAPP -OEM

Dadurch wird eine FeatureID namens APPX_HELLOWORLDAPP zur Retail OEMInput XML-Datei des angegebenen Produkts hinzugefügt.

  1. Minimieren Sie die enthaltenen Windows IoT Core-Features. Sie sollten zudem alle Testanwendungen entfernen, die (standardmäßig) in Testimages für Windows IoT Core enthalten sind. Dies umfasst die IoT Core-Standardanwendung zusammen mit allen anderen Entwicklertools oder Testfeatures. Sie können dies tun, indem Sie Remove-IoTProductFeature verwenden:
Remove-IoTProductFeature ProductX Test IOT_BERTHA
or removefid ProductX Test IOT_BERTHA

Ordnungsgemäßes Signieren und Einbinden Ihrer Anwendungen

Wenn Sie eine oder mehrere benutzerdefinierte Anwendungen in Ihr Windows IoT Core-Retail-Image einbinden möchten, müssen Sie überprüfen, ob diese Anwendungen ordnungsgemäß signiert werden, wenn Sie sie in Ihr Retail-Image einbinden. Führen Sie diese Schritte für jede Anwendung aus, die Sie in Ihr Image einbinden möchten. Bitte beachten Sie, dass Sie die Schritte 8 und 9 überspringen können, wenn Sie nur eine Anwendung einbinden müssen.

  1. Installieren Sie Ihr Retail-Codesignaturzertifikat auf Ihrem Techniker-PC.

  2. Öffnen Sie Ihre benutzerdefinierte Anwendung in Visual Studio, und öffnen Sie die Datei Package.appxmanifest.

  3. Klicken Sie auf die Registerkarte Paketerstellung und klicken Sie auf die Schaltfläche Zertifikat auswählen....

Bildschirm „Paketmanifest“

  1. Das angezeigte Dialogfeld zeigt an, welche Zertifikate für die Codesignierung verwendet werden. Klicken Sie auf das Dropdown Zertifikat konfigurieren und wählen Sie Aus Zertifikatspeicher auswählen...:

Bildschirm „Zertifikat auswählen“

  1. Wählen Sie Ihr Retail-Image-Codesignaturzertifikat aus, wenn Sie dazu aufgefordert werden, und klicken Sie auf OK.

  2. Speichern Sie Ihr Projekt in Visual Studio, und erstellen Sie dann Ihr Appx-Paket. Bitte beachten Sie, dass Sie beim Erstellen dieses Pakets zur Eingabe Ihres Kennworts für Ihr Retail-Image-Codesignierungszertifikat aufgefordert werden sollten.

  3. Nachdem die Appx-Datei erstellt wurde, führen Sie den folgenden Befehl in der IoT Core Powershell-Umgebung aus:

Add-IoTAppxPackage "C:\Dev\OpenSource\ContosoApp\ContosoApp\AppPackages\ContosoApp_1.0.0.0_ARM_Debug_Test\ContosoApp_1.0.0.0_ARM_Debug.appx" fga Appx.ContosoApp
 (or) newAppxPkg "C:\Dev\OpenSource\ContosoApp\ContosoApp\AppPackages\ContosoApp_1.0.0.0_ARM_Debug_Test\ContosoApp_1.0.0.0_ARM_Debug.appx" fga Appx.ContosoApp

Erstellen der Retail-Imagedateien

Nachdem wir alle benutzerdefinierten Anwendungspakete ordnungsgemäß signiert haben, können wir jetzt das Windows IoT Core-Retail-Image erstellen. Vergewissern Sie sich, dass das Codesignaturzertifikat für den Einzelhandel auf Ihrem PC installiert ist, bevor Sie die folgenden Schritte ausführen:

  1. Legen Sie die IoT-Signatur fest, um Details zu Ihrem Zertifikat und zertifikatübergreifendem Zertifikat einzuschließen. Dies erfolgt durch Ändern der IoTWorkspace.xml-Datei, die sich in Ihrem Arbeitsbereich befindet (z. B. C:\MyWorkspace):
<!--Specify the retail signing certificate details, Format given below -->
<RetailSignToolParam>/s my /sha1 "thumbprint" /fd SHA256 /ac "c:\DownloadedCrossCert.crt"</RetailSignToolParam>
  1. Führen Sie die IoT Core PowerShell-Umgebung als Administrator aus.

  2. Legen Sie die Umgebung für die Retail-Signatur fest. Dies erfolgt mit Set-IoTRetailSign:

Set-IoTRetailSign On
(or) retailsign on 
  1. Erstellen Sie die Pakete:
New-IoTCabPackage All
(or) buildpkg all 

Sobald alle .CAB Dateien für die Pakete erstellt wurden, sollten Sie überprüfen, ob jede dieser Dateien ordnungsgemäß mit dem Retail-Zertifikat signiert ist. Wenn einige Dateien weiterhin mit den Testzertifikaten signiert sind (dies geschieht in der Regel, wenn Sie Ihren Techniker-PC zum Erstellen von Test- und Retail-Images verwenden), können Sie diese Dateien mithilfe der Redo-IoTCabSignature erneut signieren:

Redo-IoTCabSignature  C:\BSP.IN C:\BSP.OUT
(or) re-sign.cmd C:\BSP.IN C:\BSP.OUT 

Dadurch werden die .CAB Dateien aus c:\BSP.IN mit dem Retail-Zertifikat erneut signiert und in das c:\BSP.OUT Verzeichnis kopiert.

  1. Wenn Sie die .CAB Dateien aus Schritt 5 erneut signiert haben, kopieren Sie die neu signierten .CAB Dateien nach C:\IoT\Workspaces\ContosoWS\Build\<arch>\pkgs. Hierbei werden die vorhandenen Dateien überschrieben. In unserem Beispiel werden diese Dateien in C:\IoT\Workspaces\ContosoWS\Build\arm\pkgs kopiert.

  2. Erstellen Sie das Retail-Image, indem Sie den folgenden Befehl ausführen:

New-IoTFFUImage ProductX Retail
(or)buildimage ProductX Retail 
  1. Anschließend können Sie das Retail-Image wie in ein Image flashen beschrieben flashen.

Verwendete Befehle

Hier finden Sie die Befehle (in der Reihenfolge) zum Erstellen eines Retail-IoT Core-Images. Bitte beachten Sie, dass Ihr Retail-Codesignaturzertifikat zuerst installiert werden sollte, und sie werden beim erneuten Signieren der .CAB Dateien möglicherweise zur Eingabe Ihres Zertifikatkennworts aufgefordert.

Set-IoTRetailSign On
New-IoTCabPackage All
Redo-IoTCabSignature  C:\BSP.IN C:\BSP.OUT
xcopy C:\BSP.OUT\*.cab C:\IoT\Workspaces\ContosoWS\Build\arm\pkgs\*.cab
New-IoTFFUImage ProductX Retail

Hinzufügen Ihrer Features zur Retail-Konfiguration

  1. Aktualisieren der Produktkonfigurationsdatei mit Add-IoTProductFeature

    # Add application features
    Add-IoTProductFeature ProductA Test APPX_MYUWPAPP -OEM
    Remove-IoTProductFeature ProductA Test IOT_BERTHA
    # Add registry and file features
    Add-IoTProductFeature ProductA Retail FILES_CONFIGS -OEM
    Add-IoTProductFeature ProductA Retail REGISTRY_SETTINGS -OEM
    # Add provisioning feature
    Add-IoTProductFeature ProductA Retail PROV_WIFISETTINGS -OEM
    # Add driver
    Add-IoTProductFeature ProductA Retail DRIVERS_HELLOBLINKY -OEM
    

Überprüfen des Retail-Images

Ein Benutzer kann ein benutzerdefiniertes Test-Image für Windows IoT Core ganz einfach überprüfen, indem er ein Gerät mit dem auf dem Gerät geflashten Image einschaltet. Sobald das Gerät ausgeführt wird, können Sie verschiedene Überprüfungen durchlaufen, um zu überprüfen, ob das Gerät wirklich funktionsfähig ist. Wie einfach diese Tests sind, hängt davon ab, wie viele Sicherheitsfaktoren in das Image integriert sind. Da in ein Testimage keine Sicherheitsprotokolle integriert sind, können Sie alle verfügbaren Entwicklungstools verwenden, um das IoT-Gerät zu testen.

Die Aufgabe des Testens wird für ein benutzerdefiniertes Retail-Image für Windows IoT Core schwieriger, da Sie Sicherheitsprotokolle als Teil des in das Gerät installierten Images einschließen können. Aufgrund der Art dieser Sicherheitsprotokolle können Sie möglicherweise keine verfügbaren Testtools zum Überprüfen des Geräts verwenden. Möglicherweise sollten Sie daher eine Testanwendung schreiben, die auf dem IoT-Gerät ausgeführt werden kann. Diese Anwendung würde dann die Überprüfungstests der verschiedenen Bereiche und Funktionen des IoT-Geräts ausführen.

Das Testen eines benutzerdefinierten Retail-Images für Windows IoT Core kann durch eine der folgenden Methoden ausgeführt werden:

Sauberes Retail-Image

Wenn Sie ein vollständig sauberes Retail-Image bevorzugen, müssen Sie zwei Retail-Images für Ihr Gerät erstellen. Diese beiden Images sind identisch, mit der Ausnahme, dass ein Image Ihre Testanwendung (als Vordergrundanwendung konfiguriert) enthält, während das andere „saubere“ Image dies nicht tut. Sie würden in diesem Fall das erste Image (mit der enthaltenen Testanwendung) flashen und die Testüberprüfungen auf Ihrem IoT-Gerät ausführen. Nach der Überprüfung können Sie Ihr IoT-Gerät dann erneut mit dem zweiten „sauberen“ Retail-Image für die Verteilung flashen.

Vorteile: Das endgültige Retail-Image ist nun vollständig sauber. Nur die Elemente, die als notwendig angesehen werden, werden in das Image aufgenommen.

Nachteile: Die Aufnahme einer Testanwendung in das Retail-Image könnte zu Problemen mit den Bereitstellungspaketen sowie zu möglichen Benutzerfehlern in der Testanwendung führen. Dadurch würde sich dieses Retail-Image vom endgültigen Retail-Image unterscheiden.

Einmaliger Passthrough-Test

Es wird nur ein endgültiges Retail-Image erstellt, das auch die Testanwendung enthält. Sie sollten das Image so konfigurieren, dass nach dem Start der Out-of-Box-Experience (OOBE)-Anwendung Ihre Testanwendung (als Vordergrundanwendung) gestartet wird. Eine bedingte Anweisung innerhalb der Testanwendung wird ausgelöst, so dass die Anwendung weiß, dass sie bereits einmal ausgeführt wurde (so dass sie nach dem ersten Einschalten des Geräts nicht mehr ausgeführt wird).

// Declare variable
Windows.Storage.ApplicationDataContainer localSettings = 
    Windows.Storage.ApplicationData.Current.LocalSettings;
    
// Set variable as boolean, numbers, or string values as needed at approperiate location within the test app
localSettings.Values["appRanOnce"] = false;    

// Read variable and verify value to check and apply logic
Object value = localSettings.Values["appRanOnce"];

Hinweis

Verwenden Sie nur localSettings zum Speichern der Variablen, um den Einstellungswert zu speichern. Es besteht die Möglichkeit von unerwünschten Ergebnissen bei der Verwendung von roamingSettings-Features. localSettings kann zum Zeitpunkt der Erstellung dieses Dokuments nur 64k an Daten speichern. Weitere Informationen zu den Anwendungseinstellungen finden Sie hier.

Mithilfe des obigen Codeblocks können Sie die Logik zum Starten der Testanwendung anwenden, damit die Anwendung bei nachfolgenden Startvorgängen geeignete Aktionen ausführt.

Welche Arten von Aktionen kann ich ausführen?

  • Starten einer anderen FGA-App
  • Bearbeiten der Registrierung zum Ändern der Startsequenz

Starten einer anderen FGA-Anwendung aus Ihrer Testanwendung

Wenn Sie eine Microsoft Store-App starten, können Sie den folgenden Codeausschnitt verwenden, um Apps zu starten, die über den Store installiert und aktualisiert wurden. Weitere Informationen über URI-Schemata finden Sie hier.

// Following will launch the Microsoft store app and navigate to the Games section
bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri
    ("ms-windows-store://navigatetopage/?Id=Games"));

// Following will launch the One Note app using the package family name (PFN)
bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri
    ("ms-windows-store://pdp/?PFN= Microsoft.Office.OneNote_8wekyb3d8bbwe"));

Wenn Sie eine benutzerdefinierte (nicht Microsoft Store)-App starten, können Sie AppServiceConnection verwenden, um eine App mithilfe des Paketfamiliennamens (PFN) zu starten.

Zunächst müssen Sie die endgültige App (com.concurrency.lwinsapp) mit App-Diensten im System registrieren. Sie müssen den Package.appxmanifest file folgenden Codeblock im <Applications> Abschnitt des Manifests ändern, um den folgenden Codeblock einzuschließen.

<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="AppServiceProvider.App">
      <Extensions>
        <uap:Extension Category="windows.appService" EntryPoint="MyAppService.AppLaunchService">
          <uap3:AppService Name="com.concurrency.lwinsapp" uap4:SupportsMultipleInstances="true" />
        </uap:Extension>
      </Extensions>
      ...
</Application>

Das folgende Codesegment startet eine benutzerdefinierte Anwendung:

private AppServiceConnection appLaunchService;
...
this.appLaunchService = new AppServiceConnection();
this.appLaunchService.AppServiceName = "com.concurrency.lwinsapp";
this.appLaunchService.PackageFamilyName = "f3a114f7-e099-4773-8c93-77abcba14f62_004hcn5rxyy0y";
var status = await this.appLaunchService.OpenAsync();

Durch die Kombination von Logik zwischen localSettings und AppServiceConnection, können Sie Ihre Testanwendung bei jedem Start des Geräts umgehen. Im Wesentlichen wird Ihre Testanwendung bei jedem Booten ausgeführt, aber beim Booten an die endgültige Anwendung „durchgereicht“. Bei Bedarf können Sie Ihre Logik so einstellen, dass das Gerät nicht mit der endgültigen Anwendung fortfährt, wenn die Tests in Ihrer Testanwendung fehlschlagen. Dies kann hilfreich sein, wenn Sie überprüfen müssen, ob das Gerät auf jedem Start vollständig getestet und funktionsfähig ist.

Vorteile: Sie können das Gerät bei jedem Start automatisch testen, um sicherzustellen, dass bestimmte Bedingungen korrekt eingestellt sind und das Gerät vollständig getestet (und sicher) ist.

Nachteile: Ihre Testanwendung ist im Retail-Image enthalten. Es besteht die Möglichkeit, dass Ihre Anwendung Sicherheitslücken aufweist. Bitte stellen Sie sicher, dass Ihre Testanwendung nach Bedarf gesperrt wird. Aufgrund der Art Ihrer Testanwendung können Sie möglicherweise Features des Geräts ändern.

Nächste Schritte