Partilhar via


Laboratório 1g: criar uma imagem de varejo

Detalharemos as etapas necessárias para criar uma imagem de varejo do Windows IoT Core e exibi-la em um dispositivo de hardware específico.

Pré-requisitos/requisitos

Verifique se você criou uma imagem básica com base em Criar uma imagem básica, bem como concluiu todos os laboratórios anteriores.

Você precisará das seguintes ferramentas instaladas para concluir esta seção:

  • Um certificado de assinatura de código de varejo
  • Um certificado de assinatura cruzada
  • Visual Studio
  • KiT de Avaliação e Implantação do Windows (Windows ADK)
  • Ambiente do PowerShell do IoT Core
  • Um editor de texto como o Bloco de Notas ou o VS Code

Modificar arquivos de configuração de projeto

Siga as etapas abaixo para adicionar aplicativos personalizados ou pacotes de provisionamento que você deseja adicionar à imagem de varejo.

  1. Para adicionar um aplicativo personalizado, você deve seguir as instruções listadas em Adicionar um aplicativo a uma imagem. No entanto, você especificaria Retail em vez de Test ao executar o comando Add-IoTProductFeature , conforme mostrado aqui:
Add-IoTProductFeature ProductX Retail APPX_HELLOWORLDAPP -OEM
or addfid ProductX Retail APPX_HELLOWORLDAPP -OEM

Isso adiciona um FeatureID chamado APPX_HELLOWORLDAPP ao arquivo XML OEMInput de varejo do produto especificado.

  1. Minimize os recursos incluídos do Windows IoT Core. Você também deseja remover todos os aplicativos de teste incluídos (por padrão) com imagens de teste para o Windows IoT Core. Isso inclui o aplicativo padrão do IoT Core, juntamente com quaisquer outras ferramentas de desenvolvedor ou recursos de teste. Você pode fazer isso usando Remove-IoTProductFeature:
Remove-IoTProductFeature ProductX Test IOT_BERTHA
or removefid ProductX Test IOT_BERTHA

Assinar e incluir corretamente seus aplicativos

Se você tiver um ou mais aplicativos personalizados que deseja incluir em sua imagem de varejo do Windows IoT Core, verifique se esses aplicativos estão assinados corretamente ao incluí-los em sua imagem de varejo. Siga estas etapas para cada aplicativo que você deseja incluir em sua imagem. Observe que você pode ignorar as Etapas 8 e 9 se tiver apenas um aplicativo para incluir.

  1. Instale seu certificado de assinatura de código de varejo no computador técnico.

  2. Abra seu aplicativo personalizado no Visual Studio e abra o arquivo Package.appxmanifest .

  3. Clique na guia Empacotamento e clique no botão Escolher Certificado... .

Tela do manifesto do pacote

  1. A caixa de diálogo exibida mostrará qual certificado está sendo usado para assinatura de código. Clique na lista suspensa Configurar Certificado... e selecioneEscolher no repositório de certificados...:

Escolher tela de certificado

  1. Escolha seu certificado de assinatura de código de varejo quando solicitado e clique em OK.

  2. Salve seu projeto no Visual Studio e, em seguida, crie seu pacote Appx. Observe que você deve ser solicitado a fornecer sua senha para o certificado de assinatura de código de varejo ao compilar este pacote.

  3. Depois que o arquivo Appx for criado, execute o seguinte comando no Ambiente do PowerShell do IoT Core:

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

Criar os arquivos de imagem de varejo

Depois que todos os pacotes de aplicativos personalizados forem assinados corretamente, agora podemos criar a imagem de varejo do Windows IoT Core. Verifique se você tem o certificado de assinatura de código de varejo instalado no computador antes de seguir estas etapas:

  1. Defina a assinatura de IoT para incluir detalhes sobre seu certificado e certificado cruzado. Isso é feito modificando o IoTWorkspace.xml arquivo, localizado em seu workspace (por exemplo, C:\MyWorkspace):
<!--Specify the retail signing certificate details, Format given below -->
<RetailSignToolParam>/s my /sha1 "thumbprint" /fd SHA256 /ac "c:\DownloadedCrossCert.crt"</RetailSignToolParam>
  1. Execute o Ambiente do PowerShell do IoT Core como administrador.

  2. Defina o ambiente para assinatura de varejo. isso é feito com Set-IoTRetailSign:

Set-IoTRetailSign On
(or) retailsign on 
  1. Compile os pacotes:
New-IoTCabPackage All
(or) buildpkg all 

Depois que todos os arquivos .CAB do pacote forem criados, você deverá verificar se cada um desses arquivos está assinado corretamente com o certificado de varejo. Se alguns ainda estiverem assinados com os certificados de teste (isso geralmente acontece se você usar seu computador técnico para criar imagens de teste e varejo), você poderá assinar novamente esses arquivos usando o Redo-IoTCabSignature:

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

Isso pega os arquivos de .CAB do c:\BSP.IN, assina novamente com o certificado de varejo e os copia para o c:\BSP.OUT diretório.

  1. Se você assinou novamente os arquivos .CAB da Etapa 5, copie os arquivos .CAB assinados novamente para o C:\IoT\Workspaces\ContosoWS\Build\<arch>\pkgs, substituindo os arquivos existentes. Em nosso exemplo, esses arquivos são copiados para C:\IoT\Workspaces\ContosoWS\Build\arm\pkgs.

  2. Crie uma imagem de varejo yoru executando o seguinte comando:

New-IoTFFUImage ProductX Retail
(or)buildimage ProductX Retail 
  1. Em seguida, você pode exibir a imagem de varejo, conforme descrito em Flash uma imagem.

Comandos usados

Aqui estão os comandos (em ordem) para criar uma imagem de IoT Core de varejo. Observe que o certificado de assinatura de código de varejo deve ser instalado primeiro e ele pode solicitar a senha do certificado ao assinar novamente os arquivos .CAB.

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

Adicionar seus recursos à configuração de varejo

  1. Atualizar o arquivo de configuração de varejo de produtos usando 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
    

Verificar imagem de varejo

Um usuário pode verificar facilmente uma imagem de teste personalizada para o Windows IoT Core apenas ativando um dispositivo com a imagem exibida no dispositivo. Depois que o dispositivo estiver em execução, você poderá executar várias verificações para verificar se o dispositivo está realmente funcional. A facilidade desses testes depende dos níveis de fatores de segurança inseridos na imagem. Como não há protocolos de segurança internos em uma imagem de teste, você pode usar todas as ferramentas de desenvolvimento disponíveis para testar o dispositivo IoT.

A tarefa de teste torna-se mais difícil para uma imagem de varejo personalizada para o Windows IoT Core, pois você pode incluir protocolos de segurança como parte da imagem instalada no dispositivo. Devido à natureza desses protocolos de segurança, talvez você não possa usar as ferramentas de teste disponíveis para verificar o dispositivo, portanto, talvez você queira escrever um aplicativo de teste que possa ser executado no dispositivo IoT. Esse aplicativo executaria os testes de verificação das várias áreas e funções do dispositivo IoT.

O teste de uma imagem de varejo personalizada para o Windows IoT Core pode ser feito de uma das seguintes maneiras:

Imagem de varejo limpa

Se você realmente quiser ter uma imagem de varejo limpo, precisará criar duas imagens de varejo para seu dispositivo. Essas duas imagens serão idênticas, exceto que uma imagem incluirá seu aplicativo de teste (configurado como um aplicativo em primeiro plano), enquanto a outra imagem "limpo" não. Você mostraria a primeira imagem (com o aplicativo de teste incluído) e executaria as validações de teste em seu dispositivo IoT. Depois de verificado, você poderá relançar seu dispositivo IoT com a segunda imagem de varejo "limpo", para distribuição.

Prós: a imagem final de varejo será totalmente limpo e apenas os itens que forem considerados necessários serão incluídos na imagem.

Contras: incluir um aplicativo de teste para a imagem de varejo pode introduzir alguns possíveis problemas com os pacotes de provisionamento, bem como possíveis erros de usuário no aplicativo de teste. Isso tornaria essa imagem de varejo diferente da imagem de varejo final.

One-Time teste de passagem

Apenas uma imagem de varejo final é criada e também incluiria o aplicativo de teste. Você configuraria a imagem de modo que, depois que o aplicativo OOBE (experiência pronta para uso) for iniciado, seu aplicativo de teste seja iniciado (como um aplicativo em primeiro plano). Uma instrução condicional dentro do aplicativo de teste seria disparada para que o aplicativo esteja ciente de que ele foi executado uma vez antes (impedindo que ele seja executado após a primeira vez em que o dispositivo está ligado).

// 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"];

Observação

Para obter melhores resultados, use localSettings apenas para armazenar as variáveis para armazenar o valor das configurações. Há uma possível chance de resultados indesejáveis do uso roamingSettings de recursos. localSettings só pode conter 64 mil dados no momento desta gravação. Saiba mais sobre as Configurações do Aplicativo aqui.

Usando o bloco de código acima, você pode aplicar a lógica na inicialização do aplicativo de teste para que, nas inicializações subsequentes, o aplicativo execute as ações apropriadas.

Então, que tipos de ações posso tomar?

  • Iniciar outro aplicativo FGA
  • Editar o Registro para modificar a sequência de inicialização

Iniciando outro aplicativo FGA do aplicativo de teste

Se você estiver iniciando um aplicativo da Microsoft Store, poderá usar o snippet de código a seguir para iniciar aplicativos instalados e atualizados por meio da loja. Informações adicionais sobre esquemas de URI podem ser encontradas aqui.

// 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"));

Se você estiver iniciando um aplicativo personalizado (não Microsoft Store), poderá usar AppServiceConnection para iniciar um aplicativo usando o PFN (nome da família de pacotes).

Primeiro, você deve registrar o aplicativo final (com.concurrency.lwinsapp) com os serviços de aplicativo dentro do sistema. Você precisará modificar o Package.appxmanifest file para incluir o bloco de código a <Applications> seguir na seção do manifesto.

<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>

O segmento de código a seguir iniciará um aplicativo personalizado:

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();

Combinando lógica entre localSettings e AppServiceConnection, você pode ignorar seu aplicativo de teste em cada inicialização do dispositivo. Em essência, seu aplicativo de teste será executado em cada inicialização, mas "passagem" para o aplicativo final na inicialização. Se necessário, você pode definir sua lógica de forma que o dispositivo não continue para o aplicativo final se os testes falharem em seu aplicativo de teste. Isso pode ser útil se você precisar verificar se o dispositivo está totalmente testado e funcional em cada inicialização.

Profissionais: você pode testar o dispositivo automaticamente em cada inicialização para garantir que determinadas condições sejam definidas corretamente e que o dispositivo seja totalmente testado (e seguro).

Contras: seu aplicativo de teste está incluído na imagem de varejo. Há o potencial de seu aplicativo ter falhas de segurança. Verifique se o aplicativo de teste está bloqueado conforme necessário. Devido à natureza do aplicativo de teste, você pode ser capaz de modificar recursos do dispositivo.

Próximas etapas